参考:
最简单的基于FFMPEG+SDL的音频播放器 ver2 (采用SDL2.0)_雷霄骅的博客-优快云博客_ffmpeg sdl 音频
Rockchip之FFmpeg MPP硬解码_arronzou的博客-优快云博客_ffmpeg mpp
由于公司产品需求,需要使用解码+SDL,找到雷霄骅的源代码(simplest_ffmpeg_player_2.5);下载进行编译。
在瑞星微的平台上进行测试,发现不能使用,直接报错。
报错函数sws_getContext, 不支持解码器输出的格式。
百度搜到另一文章,根据文章进行了修改。
// 如果使用 drm 显示该帧可以直接 zero-copy 绘制帧 ...
// 通过以下操作把 drm 帧拷贝到内存并且转换为NV12 ...
pFrameOK->width = pFrame->width;
pFrameOK->height = pFrame->height;
pFrameOK->format = AV_PIX_FMT_NV12;
// 此时 pFrameOK 就是转储出来的 NV12 格式帧
av_hwframe_transfer_data(pFrameOK, pFrame, 0)
直接崩溃,死机;查找原因,发现是需要hwcontext初始化。
从ffmeg的测试代码中,找到一份hw_decode.c,进行修改测试;遇到问题点av_hwdevice_ctx_create fail,一路往ffmpeg源代码中查看,发现要专入drm的路径。将路径传入后,可以正常出始化,解码正常。
参考雷神作品,加入SDL;能正常解码并显示,但发现帧率不对,进行测试,发现帧率在720p时,达到的30帧。
测试发现主要占时是av_hwframe_transfer_data, 百度了解发现此函数是个性能大坑,但没有此函数,你无法从内核中将数据拷贝出来。弃坑,开始下载gstreamer,看是否可行。