一个基于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值