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

    上一篇                 回目录                下一篇

  • 相关阅读:
    POJ3320 Jessica's Reading Problem
    POJ3320 Jessica's Reading Problem
    CodeForces 813B The Golden Age
    CodeForces 813B The Golden Age
    An impassioned circulation of affection CodeForces
    An impassioned circulation of affection CodeForces
    Codeforces Round #444 (Div. 2) B. Cubes for Masha
    2013=7=21 进制转换
    2013=7=15
    2013=7=14
  • 原文地址:https://www.cnblogs.com/ansersion/p/8431972.html
Copyright © 2020-2023  润新知