ffmpeg 硬解码 android mediacodec

 

软件解码使用:avcodec_find_decoder(AV_CODEC_ID_H264);

硬件解码使用:avcodec_find_decoder_by_name("h264_mediacodec");

 

注意事项:

如果不是读取文件 而是接受网络视频流那么 AVCodecContext->extradata 是空的

那么 avcodec_open2(m_AVCodecContext, avcodec, &opts); 这个函数将返回错误

 解决方案则是找到extradata

 

extradata里的数据是sps_pps

 

当然我们可以暂时不管sps 和pps是什么数据 这两个数据是在解码时用到的重要数据有兴趣可自行查阅篇幅有限就不过多阐述

android的h264编码中 0x00 0x00 0x00 0x01 是nalu头 接着 0x67代表sps 0x68代表pps

例:sps: 0x00 0x00 0x00 0x01 0x67 ........N个字符 0x00 0x00 0x00 0x01

0x67之后的字符就是sps

同理pps 0x68

 

了解到sps和pps的编码之后我们从我们的视频流中获取关键帧(一般是第一帧)

将第一帧的数据剖析查找sps 和pps

查找方式如上 查找匹配字符串 0x00 0x00 0x00 0x01 0x67  sps 0x00 0x00 0x00 0x01

                                                      0x00 0x00 0x00 0x01 0x68  pps 0x00 0x00 0x00 0x01

将0x00 0x00 0x00 0x01 0x67  sps 这段字符 + 0x00 0x00 0x00 0x01 0x68  pps 放入AVCodecContext->extradata中并设置AVCodecContext->extradata_size 

这样就可以正常打开h264_mediacodec解码器解码实现ffmpeg 硬解码

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值