nginx_rtmp中解析sps和pps
生活随笔
收集整理的這篇文章主要介紹了
nginx_rtmp中解析sps和pps
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 摘要:一首先這里要啰嗦一下,為什么要提取sps和ppssps主要包含了視頻的分辨率和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)
- 一 首先這里要啰嗦一下,為什么要提取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文檔。這里就不多講解了。
總結
以上是生活随笔為你收集整理的nginx_rtmp中解析sps和pps的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从nginx-rtmp中提取一帧h264
- 下一篇: SSH原理与运用(一):远程登录