从RTP包里面得到H264视频数据的方法
2013-09-03 14:30
344 查看
// 功能:解码RTP H.264视频
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
// 参数:1.RTP包缓冲地址 2.RTP包数据大小 3.H264输出地址 4.输出数据大小
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
// 返回:true:表示一帧结束 false:FU-A分片未结束或帧未结束
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
#define RTP_HEADLEN 12
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
bool UnpackRTPH264( void * bufIn, int len, void ** pBufOut, int * pOutLen)
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* pOutLen = 0 ;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
if (len < RTP_HEADLEN)
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
return false ;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
unsigned char * src = (unsigned char * )bufIn + RTP_HEADLEN;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
unsigned char head1 = * src; // 获取第一个字节
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
unsigned char head2 = * (src + 1 ); // 获取第二个字节
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
unsigned char nal = head1 & 0x1f ; // 获取FU indicator的类型域,
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
unsigned char flag = head2 & 0xe0 ; // 获取FU header的前三位,判断当前是分包的开始、中间或结束
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
unsigned char nal_fua = (head1 & 0xe0 ) | (head2 & 0x1f ); // FU_A nal
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
bool bFinishFrame = false ;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
if (nal == 0x1c ) // 判断NAL的类型为0x1c=28,说明是FU-A分片
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ // fu-a
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
if (flag == 0x80 ) // 开始
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* pBufOut = src - 3 ;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* (( int * )( * pBufOut)) = 0x01000000 ; // zyf:大模式会有问题
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* (( char * )( * pBufOut) + 4 ) = nal_fua;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* pOutLen = len - RTP_HEADLEN + 3 ;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
else if (flag == 0x40 ) // 结束
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* pBufOut = src + 2 ;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* pOutLen = len - RTP_HEADLEN - 2 ;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
else // 中间
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* pBufOut = src + 2 ;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* pOutLen = len - RTP_HEADLEN - 2 ;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
else // 单包数据
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* pBufOut = src - 4 ;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* (( int * )( * pBufOut)) = 0x01000000 ; // zyf:大模式会有问题
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* pOutLen = len - RTP_HEADLEN + 4 ;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
unsigned char * bufTmp = (unsigned char * )bufIn;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
if (bufTmp[ 1 ] & 0x80 )
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
bFinishFrame = true ; // rtp mark
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
else
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
bFinishFrame = false ;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
return bFinishFrame;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
从RTP包里面得到AAC音频数据的方法:
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
//功能:解RTP AAC音频包,声道和采样频率必须知道。
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
//参数:1.RTP包缓冲地址 2.RTP包数据大小 3.H264输出地址 4.输出数据大小
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
//返回:true:表示一帧结束 false:帧未结束 一般AAC音频包比较小,没有分片。
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
bool UnpackRTPAAC(void * bufIn, int recvLen, void** pBufOut, int* pOutLen)
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
unsigned char* bufRecv = (unsigned char*)bufIn;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
//char strFileName[20];
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
unsigned char ADTS[] = {0xFF, 0xF1, 0x00, 0x00, 0x00, 0x00, 0xFC};
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
int audioSamprate = 32000;//音频采样率
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
int audioChannel = 2;//音频声道 1或2
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
int audioBit = 16;//16位 固定
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
switch(audioSamprate)
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
case 16000:
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
ADTS[2] = 0x60;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
case 32000:
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
ADTS[2] = 0x54;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
case 44100:
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
ADTS[2] = 0x50;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
case 48000:
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
ADTS[2] = 0x4C;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
case 96000:
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
ADTS[2] = 0x40;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
default:
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
ADTS[3] = (audioChannel==2)?0x80:0x40;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
int len = recvLen - 16 + 7;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
len <<= 5;//8bit * 2 - 11 = 5(headerSize 11bit)
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
len |= 0x1F;//5 bit 1
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
ADTS[4] = len>>8;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
ADTS[5] = len & 0xFF;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
*pBufOut = (char*)bufIn+16-7;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
memcpy(*pBufOut, ADTS, sizeof(ADTS));
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
*pOutLen = recvLen - 16 + 7;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
unsigned char* bufTmp = (unsigned char*)bufIn;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
bool bFinishFrame = false;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
if (bufTmp[1] & 0x80)
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
//DebugTrace::D("Marker");
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
bFinishFrame = true;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
else
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
bFinishFrame = false;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
return true;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
// 参数:1.RTP包缓冲地址 2.RTP包数据大小 3.H264输出地址 4.输出数据大小
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
// 返回:true:表示一帧结束 false:FU-A分片未结束或帧未结束
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
#define RTP_HEADLEN 12
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
bool UnpackRTPH264( void * bufIn, int len, void ** pBufOut, int * pOutLen)
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* pOutLen = 0 ;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
if (len < RTP_HEADLEN)
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
return false ;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
unsigned char * src = (unsigned char * )bufIn + RTP_HEADLEN;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
unsigned char head1 = * src; // 获取第一个字节
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
unsigned char head2 = * (src + 1 ); // 获取第二个字节
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
unsigned char nal = head1 & 0x1f ; // 获取FU indicator的类型域,
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
unsigned char flag = head2 & 0xe0 ; // 获取FU header的前三位,判断当前是分包的开始、中间或结束
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
unsigned char nal_fua = (head1 & 0xe0 ) | (head2 & 0x1f ); // FU_A nal
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
bool bFinishFrame = false ;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
if (nal == 0x1c ) // 判断NAL的类型为0x1c=28,说明是FU-A分片
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ // fu-a
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
if (flag == 0x80 ) // 开始
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* pBufOut = src - 3 ;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* (( int * )( * pBufOut)) = 0x01000000 ; // zyf:大模式会有问题
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* (( char * )( * pBufOut) + 4 ) = nal_fua;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* pOutLen = len - RTP_HEADLEN + 3 ;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
else if (flag == 0x40 ) // 结束
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* pBufOut = src + 2 ;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* pOutLen = len - RTP_HEADLEN - 2 ;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
else // 中间
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* pBufOut = src + 2 ;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* pOutLen = len - RTP_HEADLEN - 2 ;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
else // 单包数据
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* pBufOut = src - 4 ;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* (( int * )( * pBufOut)) = 0x01000000 ; // zyf:大模式会有问题
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
* pOutLen = len - RTP_HEADLEN + 4 ;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
unsigned char * bufTmp = (unsigned char * )bufIn;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
if (bufTmp[ 1 ] & 0x80 )
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
bFinishFrame = true ; // rtp mark
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
else
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
bFinishFrame = false ;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
return bFinishFrame;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
从RTP包里面得到AAC音频数据的方法:
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
//功能:解RTP AAC音频包,声道和采样频率必须知道。
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
//参数:1.RTP包缓冲地址 2.RTP包数据大小 3.H264输出地址 4.输出数据大小
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
//返回:true:表示一帧结束 false:帧未结束 一般AAC音频包比较小,没有分片。
![](http://www.cnweblog.com/Images/OutliningIndicators/None.gif)
bool UnpackRTPAAC(void * bufIn, int recvLen, void** pBufOut, int* pOutLen)
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
unsigned char* bufRecv = (unsigned char*)bufIn;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
//char strFileName[20];
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
unsigned char ADTS[] = {0xFF, 0xF1, 0x00, 0x00, 0x00, 0x00, 0xFC};
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
int audioSamprate = 32000;//音频采样率
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
int audioChannel = 2;//音频声道 1或2
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
int audioBit = 16;//16位 固定
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
switch(audioSamprate)
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
case 16000:
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
ADTS[2] = 0x60;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
case 32000:
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
ADTS[2] = 0x54;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
case 44100:
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
ADTS[2] = 0x50;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
case 48000:
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
ADTS[2] = 0x4C;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
case 96000:
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
ADTS[2] = 0x40;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
default:
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
break;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
ADTS[3] = (audioChannel==2)?0x80:0x40;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
int len = recvLen - 16 + 7;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
len <<= 5;//8bit * 2 - 11 = 5(headerSize 11bit)
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
len |= 0x1F;//5 bit 1
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
ADTS[4] = len>>8;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
ADTS[5] = len & 0xFF;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
*pBufOut = (char*)bufIn+16-7;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
memcpy(*pBufOut, ADTS, sizeof(ADTS));
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
*pOutLen = recvLen - 16 + 7;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
unsigned char* bufTmp = (unsigned char*)bufIn;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
bool bFinishFrame = false;
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
if (bufTmp[1] & 0x80)
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
//DebugTrace::D("Marker");
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
bFinishFrame = true;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
else
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
bFinishFrame = false;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnweblog.com/Images/OutliningIndicators/InBlock.gif)
return true;
![](http://www.cnweblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
相关文章推荐
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法
- RTP包里面得到H.264数据和AAC数据的方法
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法。。
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法