zoukankan      html  css  js  c++  java
  • 一个基于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 }

    上一篇                 回目录                下一篇

  • 相关阅读:
    求C的近似值
    判断是否直角三角形
    温度转换异常处理
    python html页面
    python 爬虫goole主页
    python 足球模拟
    python模拟羽毛球竞技
    python 读书报告
    python 用jieba分词统计关于红楼梦的高频词
    python 在终端输出如下信息
  • 原文地址:https://www.cnblogs.com/ansersion/p/8431972.html
Copyright © 2011-2022 走看看