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

时间:2022-12-10 07:21:53

一、MPEG RTP音频传输

相较H264的RTP传输格式,MPEGE音频传输格式则简单许多。

每一包MPEG音频RTP包都前缀一个4字节的Header,如下图(RFC2550

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

“MBZ”必须为0(MustBeZero)。

“Frag_offset”为该包中有效的音频字节数。

myRtspClient的任务就是去掉每一个RTP包的前4字节的头,并将音频数据拼接并存入缓冲区,如图:

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

二、源码分析

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

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

它的作用是将data中的数据复制到buf中,一共复制size个字节,返回实际复制的字节数。其中buf为用户的缓冲区,data为rtp接收的数据。

 size_t MPEG_Audio::CopyData(uint8_t * buf, uint8_t * data, size_t size)
{
size_t CopySize = ;
int Offset = ;
uint8_t * DataPointer = data; if(!buf || !data) return ;
Offset = GetFlagOffset(DataPointer);
if(Offset < MPEG_AUDIO_RTP_HEADER_SIZE) return ; memcpy(buf+CopySize, data + Offset, size - Offset);
CopySize += size - Offset; return CopySize;
}

仔细看一下源码,我们会发现该函数先解析data的前4个字节的MPEG音频头(GetFlagOffset,源码如下),然后将data中的剩余数据保存进buf中。

 int MPEG_Audio::GetFlagOffset(const uint8_t * rtp_payload)
{
int Offset = ; if(!rtp_payload) return -;
Offset += MPEG_AUDIO_RTP_HEADER_SIZE;
Offset += (rtp_payload[] << ) + rtp_payload[];
return Offset;
}

上一篇                 回目录                下一篇