nginx_rtmp中解析sps和pps

来源:互联网 发布:atom latex windows 编辑:程序博客网 时间:2024/06/16 02:54
一 首先这里要啰嗦一下,为什么要提取sps和pps
sps 主要包含了视频的分辨率和profile类型信息。pps是什么暂时没有关注。
二 在nginx-rtmp中,如何提取到sps和pps信息呢?
直接找到nginx_rtmp循环主干。
ngx_rtmp_live_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
                 ngx_chain_t *in)

(1) 获取到codec ctx
codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);
codec_ctx->aac_header;//音频codec header
codec_ctx->avc_header;//视频codec header
(2) 合并avc(h264)buf
ngx_chain_t *in = NULL;
for(in = avc_header;in;in = in->next)
{
memcpy(tmp_str.data + in_len,in->buf->pos,(int)(in->buf->last - in->buf->pos));
in_len += (int)(in->buf->last - in->buf->pos);
}
//buf 有4个指针,pos,last,start,end。end-start表示buf的容量,
last-pos表示buf数据量
(3) 解析sps和pps
从avc_header中提取到的buf数据符合rtmp message协议标准(即flv文件格式标准)
下面附上解析代码和注释:

int parse_offset = 0;
int frametype = avc_header->data[parse_offset]&0xff>>4;//4 bit帧格式
int codec_id = avc_header->data[parse_offset]&0x0f;//编码器id 7 AVC
parse_offset ++;
int packet_type = avc_header->data[parse_offset]&0xff;//数据包类型 0 sequence head(codec head) 1 nalu u
parse_offset ++;


parse_offset += 3;//3 字节时间戳


parser_AVCDecoderHeader *sps_header = (parser_AVCDecoderHeader *)(avc_header->data + parse_offset);
//parser_AVCDecoderHeader_DUMP(sps_header);
parse_offset += sizeof(parser_AVCDecoderHeader);//sps 解码头信息
int sps_len = ntohs(*(unsigned short *)((char *)avc_header->data + parse_offset));//sps长度  
        parse_offset += 2;




memcpy(sps->data,nalu_head,4);//在sps前面加上0x00000001 
sps->len += 4;
memcpy(sps->data + sps->len,avc_header->data + parse_offset,sps_len);//把sps数据串到后面
sps->len += sps_len;
parse_offset += sps_len;

int ppscount = ((char*)avc_header->data)[parse_offset];//pps 个数
parse_offset ++;
        int pps_len = ntohs(*(unsigned short *)((char *)avc_header->data + parse_offset));//pps 长度
parse_offset += 2;


memcpy(pps->data,nalu_head,4);//在pps前面加上0x00000001
pps->len += 4;
memcpy(pps->data + pps->len,avc_header->data + parse_offset,pps_len);//把pps数据串到后面
pps->len += pps_len;


三 aac header解析可以自行参考flv文档。这里就不多讲解了。

更多开源流媒体技术,请关注我们的微信:EasyDarwin