音视频系列八 ffmpeg使用mediacodec硬解码
·
重新编译ffmpeg
ffmpeg默认是没有开启mediacodec的,所以需要在配置文件上增加配置
--enable-mediacodec
默认就会增加mediacodec支持的解码器,但是如果你禁用了所有的解码器,那根据自己需要手动打开,参考以下配置
--enable-decoder=h264_mediacodec
--enable-decoder=hevc_mediacodec
--enable-decoder=mpeg4_mediacodec
--enable-decoder=mpeg2_mediacodec
--enable-decoder=vp8_mediacodec
--enable-decoder=vp9_mediacodec
具体的编译详见前文。
配置JavaVM
在JNI_OnLoad方法中调用av_jni_set_java_vm方法,示例如下。
av_jni_set_java_vm(vm, 0);
ffmpeg是通过jni回调Mediacodec Java层的API实现硬解的,如果有信心,不嫌麻烦,追求极致性能可以自己使用MediaCodec Native层的API实现。
替换AVCodec
在MediaCodec支持的编码下通过avcodec_find_decoder_by_name方法找到对应的编码器,其他与软解流程一样,以H264为例,参考代码如下。
AVCodec *avCodec = nullptr;
AVCodecID videoCodecID = avFormatContext->streams[video_index]->codecpar->codec_id;
if (videoCodecID == AV_CODEC_ID_H264) {
avCodec = avcodec_find_decoder_by_name("h264_mediacodec");
if (avCodec == nullptr) {
avCodec = avcodec_find_decoder(videoCodecID);
}
} else {
avCodec = avcodec_find_decoder(videoCodecID);
}
需要注意的是经过测试硬解得到的Frame的best_effort_timestamp可能恒等于AV_NOPTS_VALUE
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)