日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nginx_rtmp中解析sps和pps

發布時間:2024/2/28 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。