软件解码使用: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 硬解码