那么:先取出解码器
m_avcodec = avcodec_find_decoder_by_name("hevc_mediacodec"); //h265
获取上下文
m_AVCodecContext = avcodec_alloc_context3(m_avcodec);
注意此时的上下文m_AVCodecContext 是没有extradata
这个时候你通过上下文去打开解码器
int a = avcodec_open2(m_AVCodecContext, m_avcodec, NULL);
就会报错因为缺少关键数据extradata
如果读取文件那么此上下文m_AVCodecContext 所需要的extradata在ffmpeg 读取文件时就已经赋值 ,而如果需要解析的是一个视频流则需要对exdata进行赋值
如何赋值 这个参数是解码时重要的参数那么如何获取呢
首先这个参数所需要的格式为 VPS + SPS + PPS
H265相较于 H264来说 extradata不仅需要SPS,以及pps数据并且还要一个VPS数据
寻找Nalu头00 00 00 01 之后找到 0x40 -vps 0x42 -sps 0x 44 -pps
注意在寻找这些标志头(例如vps的0x40)一定要保证前4位或者前三位是 00 00 00 01 或者00 00 01
例 00 00 00 01 40 .... xx 00 00 00 01(xx为任意数 是vps的末尾)
如果找到了标志头0x40 那么就继续找下一个nalu头 00 00 00 01 那么 这个nalu头之前的数即是 xx 40 ..... 一直到xx就是所需要找的vps 那么同样的方法找到 sps 和 pps 之后 就可以 将其拼接 00 00 00 01 + vps + 00 00 00 01 +sps + 00 00 00 01 pps