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 硬解码

 

你可能感兴趣的:(FFMpeg)