FU-A 分包银河网址:

FU-A分包格局,以致从RTP包里面获得H.264数据和AAC数据的法子

【原创】 
冠道FC3984是H.264的baseline码流在RTP方式下传输的职业,这里只谈谈FU-A分包格局,以至从RTP包里面获得H.264数据和AAC数据的艺术。

1、单个NAL包单元

12字节的RTP头后边的正是音录制数据,相比较轻便。八个包裹单个NAL单元包到RTP的NAL单元流的RTP序号必需切合NAL单元的解码顺序。

2、FU-A的分片格式
多少极大的H264录制包,被RTP分片发送。12字节的RTP头前面紧跟着的正是FU-A分片:
FU indicator有以下格式:
      +---------------+
      |0|1|2|3|4|5|6|7|
      +-+-+-+-+-+-+-+-+
      |F|NRI|  Type   |
      +---------------+
   FU提醒字节的类型域 Type=28象征FU-A。。NHavalI域的值必须依照分片NAL单元的N宝马X3I域的值设置。
 
   FU header的格式如下:
      +---------------+
      |0|1|2|3|4|5|6|7|
      +-+-+-+-+-+-+-+-+
      |S|E|R|  Type   |
      +---------------+
   S: 1 bit
   当设置成1,初步位提示分片NAL单元的始发。当跟随的FU荷载不是分片NAL单元荷载的开头,开端位设为0。
   E: 1 bit
   当设置成1, 甘休位提示分片NAL单元的利落,即, 荷载的最终字节也是分片NAL单元的最后叁个字节。当跟随的FU荷载不是分片NAL单元的终极分片,结束位设置为0。
   R: 1 bit
   保留位必得安装为0,接收者必需忽视该位。
   Type: 5 bits
   NAL单元荷载类型定义见下表

表1.  单元类型以至荷载结构总结
      Type   Packet      Type name                       
      ---------------------------------------------------------
      0      undefined                                    -
      1-23   NAL unit    Single NAL unit packet per H.264  
      24     STAP-A     Single-time aggregation packet    
      25     STAP-B     Single-time aggregation packet    
      26     MTAP16    Multi-time aggregation packet     
      27     MTAP24    Multi-time aggregation packet     
      28     FU-A      Fragmentation unit                
      29     FU-B      Fragmentation unit                 
      30-31  undefined                                    -
3、拆包和平解决包

拆包:当编码器在编码时须要将原有三个NAL依照FU-A进行分片,原有的NAL的单元头与分片后的FU-A的单元头有如下事关:
原有的NAL头的前几人为FU indicator的前三位,原始的NAL头的后两人为FU header的后八个人,FU indicator与FU header的结余位数根据实际情形调整。
 
解包:当接收端收到FU-A的分片数据,必要将富有的分片包组合还原成原始的NAl包时,FU-A的单元头与还原后的NAL的涉嫌如下:
过来后的NAL头的六位是由FU indicator的前四位加FU header的后伍人构成,即:
nal_unit_type = (fu_indicator & 0xe0) | (fu_header & 0x1f)

4、代码完成

从RTP包里面获取H264录像数据的主意:

银河网址 1 
银河网址 2 // 功能:解码RTP H.264视频
银河网址 3 // 参数:1.RTP包缓冲地址 2.RTP包数据大小 3.H264出口地址 4.输出数据大小
银河网址 4 // 再次来到:true:表示一帧甘休  false:FU-A分片未甘休或帧未结束 
银河网址 5 #define  RTP_HEADLEN 12 
银河网址 6 bool  UnpackRTPH264( void   *  bufIn,  int  len,   void **  pBufOut,   int   *  pOutLen)
银河网址 7 {
银河网址 8     * pOutLen  =   0 ;
银河网址 9     if  (len  <  RTP_HEADLEN)
银河网址 10     {
银河网址 11         return   false ;
银河网址 12    } 
银河网址 13 
银河网址 14    unsigned  char *  src  =  (unsigned  char * )bufIn  +  RTP_HEADLEN;
银河网址 15    unsigned  char  head1  =   * src; // 获取第二个字节 
银河网址 16     unsigned  char  head2  =   * (src + 1 ); // 获取首个字节 
银河网址 17     unsigned  char  nal  =  head1  &   0x1f ; // 获取FU indicator的类型域, 
银河网址 18     unsigned  char  flag  =  head2  &   0xe0 ; // 获取FU header的前二人,判定当前是富含的始发、中间或终止 
银河网址 19     unsigned  char  nal_fua  =  (head1  &   0xe0 )  |  (head2  &   0x1f ); // FU_A nal 
银河网址 20      bool  bFinishFrame  =   false ;
银河网址 21     if  (nal == 0x1c ) // 决断NAL的档次为0x1c=28,表达是FU-A分片 
银河网址 22      { // fu-a 
银河网址 23          if  (flag == 0x80 ) // 开始 
银河网址 24          {
银河网址 25             * pBufOut  =  src - 3 ;
银河网址 26             * (( int * )( * pBufOut))  =   0x0一千000  ; // zyf:大方式会有难题 
银河网址 27              * (( char * )( * pBufOut) + 4 )  =  nal_fua;
银河网址 28             *  pOutLen  =  len  -  RTP_HEADLEN  +   3 ;
银河网址 29        } 
银河网址 30         else   if (flag == 0x40 ) // 结束 
银河网址 31          {
银河网址 32             * pBufOut  =  src + 2 ;
银河网址 33             *  pOutLen  =  len  -  RTP_HEADLEN  -   2 ;
银河网址 34        } 
银河网址 35         else // 中间 
银河网址 36          {
银河网址 37             * pBufOut  =  src + 2 ;
银河网址 38             *  pOutLen  =  len  -  RTP_HEADLEN  -   2 ;
银河网址 39        } 
银河网址 40    } 
银河网址 41     else // 单包数据 
银河网址 42      {
银河网址 43         * pBufOut  =  src - 4 ;
银河网址 44         * (( int * )( * pBufOut))  =   0x0一千000 ; // zyf:大方式会有标题 
银河网址 45          *  pOutLen  =  len  -  RTP_HEADLEN  +   4 ;
银河网址 46    } 
银河网址 47 
银河网址 48    unsigned  char *  bufTmp  =  (unsigned  char * )bufIn;
银河网址 49     if  (bufTmp[ 1 ]  &   0x80 )
银河网址 50     {
银河网址 51        bFinishFrame  =   true ; // rtp mark 
银河网址 52     } 
银河网址 53     else 
银河网址 54      {
银河网址 55        bFinishFrame  =   false ;
银河网址 56    } 
银河网址 57     return  bFinishFrame;
银河网址 58}   
银河网址 59
银河网址 60

从RTP包里面得到AAC音频数据的方式:

银河网址 61
银河网址 62//功效:解RTP AAC音频包,声道和采集样品频率必需领会。
银河网址 63//参数:1.RTP包缓冲地址 2.RTP包数据大小 3.H264出口地址 4.输出数据大小
银河网址 64//重回:true:表示一帧甘休  false:帧未终止 经常AAC音频包非常的小,未有分片。
银河网址 65bool UnpackRTPAAC(void * bufIn, int recvLen, void** pBufOut,  int* pOutLen)
银河网址 66{
银河网址 67    unsigned char*  bufRecv = (unsigned char*)bufIn;
银河网址 68    //char strFileName[20];
银河网址 69    
银河网址 70    unsigned char ADTS[] = {0xFF, 0xF1, 0x00, 0x00, 0x00, 0x00, 0xFC}; 
银河网址 71    int audioSamprate = 33000;//音频采样率
银河网址 72    int audioChannel = 2;//音频声道 1或2
银河网址 73    int audioBit = 16;//16位 固定
银河网址 74    switch(audioSamprate)
银河网址 75    {
银河网址 76    case  16000:
银河网址 77        ADTS[2] = 0x60;
银河网址 78        break;
银河网址 79    case  32000:
银河网址 80        ADTS[2] = 0x54;
银河网址 81        break;
银河网址 82    case  44100:
银河网址 83        ADTS[2] = 0x50;
银河网址 84        break;
银河网址 85    case  48000:
银河网址 86        ADTS[2] = 0x4C;
银河网址 87        break;
银河网址 88    case  96000:
银河网址 89        ADTS[2] = 0x40;
银河网址 90        break;
银河网址 91    default:
银河网址 92        break;
银河网址 93    }
银河网址 94    ADTS[3] = (audioChannel==2)?0x80:0x40;
银河网址 95
银河网址 96    int len = recvLen - 16 + 7;
银河网址 97    len <<= 5;//8bit * 2 - 11 = 5(headerSize 11bit)
银河网址 98    len |= 0x1F;//5 bit    1            
银河网址 99    ADTS[4] = len>>8;
银河网址 100    ADTS[5] = len & 0xFF;
银河网址 101    *pBufOut = (char*)bufIn+16-7;
银河网址 102    memcpy(*pBufOut, ADTS, sizeof(ADTS));
银河网址 103    *pOutLen = recvLen - 16 + 7;
银河网址 104
银河网址 105    unsigned char* bufTmp = (unsigned char*)bufIn;
银河网址 106    bool bFinishFrame = false;
银河网址 107    if (bufTmp[1] & 0x80)
银河网址 108    {
银河网址 109        //DebugTrace::D("Marker");
银河网址 110        bFinishFrame = true;
银河网址 111    }
银河网址 112    else
银河网址 113    {
银河网址 114        bFinishFrame = false;
银河网址 115    }
银河网址 116    return true;
银河网址 117}
银河网址 118
银河网址 119
银河网址 120

来自

本文由银河网址发布于银河网址,转载请注明出处:FU-A 分包银河网址:

您可能还会对下面的文章感兴趣: