用ffmpeg做网络直播流的接收时,需要获取流的帧率等信息;而这些信息保存在sps中,所以需要获取到sps的相关数据;在 ffmpeg 中 sps 信息保存在AVCodecContext 的 extradata 字段中;由于是直播流,所以不应试图通过 流过滤器 进行格式转换,而应当对数据进行直接解析;
通过 baidu;找到了 extradata 中可能保存的数据封装格式;一共两种:
一种是annexb模式,传统模式,有startcode,SPS和PPS是在ES中
一种是mp4模式,一般mp4 mkv会有,没有startcode,SPS和PPS以及其它信息被封装在Container中,每一个frame前面是这个frame的长度
具体可参看:http://blog.csdn.net/flyingqr/article/details/8494050
然后通过对mp4格式的查看,确定了在mp4模式下 extradata 中数据的内容信息; extradata 指向的是avcC数据,不含 avcC 标记;
内容第一个字节是版本号,一般为01;
第7,8个字节指定sps的内容长度,通过 extradata[6]*255 + extradata [7]; 可获得;
第9个字节开始是sps 的内容; 即:extradata+8;
这样就可以得到mp4封装模式下的直播流sps内容;
如果是annexb流直播,头四个字节是00 00 00 01; 可以通过这个判断流的模式;extradata的内容也是标准的sps pps nal ; 这就无须多说了;
由于代码没在电脑上,不上代码了,东西也很简单;相信稍有点基础的人都能写出来.