音视频系列八 ffmpeg使用mediacodec硬解码

文章目录

  • 重新编译ffmpeg
  • 配置JavaVM
  • 替换AVCodec

重新编译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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部