一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(八)RTP音视频传输解析层之MPA传输格式...
一、MPEG RTP音頻傳輸
相較H264的RTP傳輸格式,MPEGE音頻傳輸格式則簡(jiǎn)單許多。
每一包MPEG音頻RTP包都前綴一個(gè)4字節(jié)的Header,如下圖(RFC2550)
?
“MBZ”必須為0(MustBeZero)。
“Frag_offset”為該包中有效的音頻字節(jié)數(shù)。
myRtspClient的任務(wù)就是去掉每一個(gè)RTP包的前4字節(jié)的頭,并將音頻數(shù)據(jù)拼接并存入緩沖區(qū),如圖:
?
二、源碼分析
在mpeg_types.cpp中,首先分析函數(shù):
size_t FU_A::CopyData(uint8_t * buf, uint8_t * data, size_t size)
它的作用是將data中的數(shù)據(jù)復(fù)制到buf中,一共復(fù)制size個(gè)字節(jié),返回實(shí)際復(fù)制的字節(jié)數(shù)。其中buf為用戶的緩沖區(qū),data為rtp接收的數(shù)據(jù)。
1 size_t MPEG_Audio::CopyData(uint8_t * buf, uint8_t * data, size_t size) 2 { 3 size_t CopySize = 0; 4 int Offset = 0; 5 uint8_t * DataPointer = data; 6 7 if(!buf || !data) return 0; 8 Offset = GetFlagOffset(DataPointer); 9 if(Offset < MPEG_AUDIO_RTP_HEADER_SIZE) return 0; 10 11 memcpy(buf+CopySize, data + Offset, size - Offset); 12 CopySize += size - Offset; 13 14 return CopySize; 15 }?
仔細(xì)看一下源碼,我們會(huì)發(fā)現(xiàn)該函數(shù)先解析data的前4個(gè)字節(jié)的MPEG音頻頭(GetFlagOffset,源碼如下),然后將data中的剩余數(shù)據(jù)保存進(jìn)buf中。
1 int MPEG_Audio::GetFlagOffset(const uint8_t * rtp_payload) 2 { 3 int Offset = 0; 4 5 if(!rtp_payload) return -1; 6 Offset += MPEG_AUDIO_RTP_HEADER_SIZE; 7 Offset += (rtp_payload[2] << 8) + rtp_payload[3]; 8 return Offset; 9 }?
上一篇? ? ? ? ? ? ? ? ?回目錄? ? ? ? ? ? ? ??下一篇
轉(zhuǎn)載于:https://www.cnblogs.com/ansersion/p/8431972.html
總結(jié)
以上是生活随笔為你收集整理的一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(八)RTP音视频传输解析层之MPA传输格式...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3ds Max绘制青花瓷茶壶
- 下一篇: git遇到的一些问题