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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(八)RTP音视频传输解析层之MPA传输格式...

發布時間:2025/7/25 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(八)RTP音视频传输解析层之MPA传输格式... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、MPEG RTP音頻傳輸

相較H264的RTP傳輸格式,MPEGE音頻傳輸格式則簡單許多。

每一包MPEG音頻RTP包都前綴一個4字節的Header,如下圖(RFC2550)

?

“MBZ”必須為0(MustBeZero)。

“Frag_offset”為該包中有效的音頻字節數。

myRtspClient的任務就是去掉每一個RTP包的前4字節的頭,并將音頻數據拼接并存入緩沖區,如圖:

?

二、源碼分析

在mpeg_types.cpp中,首先分析函數:

size_t FU_A::CopyData(uint8_t * buf, uint8_t * data, size_t size)

它的作用是將data中的數據復制到buf中,一共復制size個字節,返回實際復制的字節數。其中buf為用戶的緩沖區,data為rtp接收的數據。

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 }

?

仔細看一下源碼,我們會發現該函數先解析data的前4個字節的MPEG音頻頭(GetFlagOffset,源碼如下),然后將data中的剩余數據保存進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 }

?

上一篇? ? ? ? ? ? ? ? ?回目錄? ? ? ? ? ? ? ??下一篇

轉載于:https://www.cnblogs.com/ansersion/p/8431972.html

總結

以上是生活随笔為你收集整理的一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(八)RTP音视频传输解析层之MPA传输格式...的全部內容,希望文章能夠幫你解決所遇到的問題。

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