美文网首页
音视频流媒体开发【七十】- RTSP流媒体5-RTP之AAC封包

音视频流媒体开发【七十】- RTSP流媒体5-RTP之AAC封包

作者: AlanGe | 来源:发表于2023-07-24 12:45 被阅读0次

    音视频流媒体开发-目录
    iOS知识点-目录
    Android-目录
    Flutter-目录
    数据结构与算法-目录
    uni-pp-目录

    官⽅⽂档:
    https://www.rfc-editor.org/rfc/rfc3640.html
    

    ffmpeg:
    封包:rtpenc_aac.c
    解包:rtpdec_mpeg4.c

    对aac进⾏rtp封包

    过程⽐较简单:
    1. 需要将aac的前7个(或9个)字节的ADTS去掉,即是跳过adts header;
    2. 添加RTP Header;
    3. 添加2字节的AU_HEADER_LENGTH;
    4. 添加2字节的AU_HEADER;
    5. 从第17字节开始就是payload(去掉ADTS的aac数据)数据了

    ⾳频aac封包格式

    RTP承载aac的格式由两部分组成:
    • 2个字节的AU-headers-length
    • n个AU-header,每个2字节
    • n个AU,是aac去掉adts的载荷
    image.png

    注意:⼀个RTP包中可以有⼀个AU-headers-length 和 n个AU-header和 n个AU(AU每包实际⾳频数据流)

    1. AU-headers-length

    头两个字节表示au-header的⻓度,单位是bit。 ⼀个AU-header⻓度是两个字节(16bit)因为可以有多个au-header所以AU-headers-length的值是 16的倍数,⼀般⾳频都是单个⾳频数据流的发送,所以AU-headers-length的值是16

    //AU_HEADER_LENGTH
    bytes[12] = 0x00; //⾼位
    bytes[13] = 0x10; //低位 只有⼀个AU_HEADER
    

    因为单位是bit, 除以8就是auHeader的字节⻓度;⼜因为单个auheader字节⻓度2字节,所以再除以2就是auheader的个数。

    2. AU-header

    au-header的⾼13个bits就是⼀个au 的字节⻓度:

    //AU_HEADER
    bytes[14] = (byte)((len & 0x1fe0) >> 5); //⾼位
    bytes[15] = (byte)((len & 0x1f) << 3); //低位
    

    这样就能得到多个au的⻓度

    3. AU 实际的⾳频数据

    RTSP/SDP中的AAC配置

    当RTSP的⾳频使⽤AAC格式时, SDP的内容差不多是这样的

    v=0
    o=- 16128587303007558182 16128587303007558182 IN IP4 WINDOWS-75IDU9Q
    s=Unnamed
    i=N/A
    c=IN IP4 0.0.0.0
    t=0 0
    a=tool:vlc 3.0.5
    a=recvonly
    a=type:broadcast
    a=charset:UTF-8
    a=control:rtsp://192.168.2.195:8554/
    m=audio 0 RTP/AVP 96
    b=AS:128
    b=RR:0
    a=rtpmap:96 mpeg4-generic/22050
    a=fmtp:96 streamtype=5; profile-level-id=15; mode=AAC-hbr; config=138856e500; sizeLength=13; indexLength=3; indexDeltaLength=3; Profile=1;
    a=control:rtsp://192.168.2.195:8554/trackID=4
    m=video 0 RTP/AVP 96
    b=AS:800
    b=RR:0
    a=rtpmap:96 H264/90000
    a=fmtp:96 packetization-mode=1;profile-level-id=42c01e;sprop-parameter-sets=Z0LAHtoCQKeX/8CgAJ/EAAADAZAAAF2qPFi6gA==,aM43IA==;
    a=control:rtsp://192.168.2.195:8554/trackID=5
    

    这些参数是由RFC规范定义的

    https://tools.ietf.org/html/rfc3640
    

    streamtype对于AAC, 固定为5
    profile-level-id固定为1. (我也不知道这个值怎么⽣成)
    本⽂着重说明config, SizeLength, IndexLength, IndexDeltaLength的作⽤
    config是16进制的, 前两个字节 1388 , 表示采样率为22050, 1个channel, 后⾯的 56e500 , 我也不知道是什么⻤.

    前两个字节的为ios-14996-3中定义的AudioSpecificConfig, 前13个bits的格式为

    samplingFrequencyIndex的取值

    1388 转换成2进制为 0001 0011 1000 1000
    audioObjectType为 00010 , 即 2
    samplingFrequencyIndex为 0111 , 即 7 , 对应的采样频率为 22050
    channelConfiguration为 0001 , 表示channel数量为1
    sizeLength=13; indexLength=3; indexDeltaLength=3涉及到⾳频的AU Header.
    AU Header解决了⼀个RTP包容纳多个⾳频包的问题

    AU-Header包含以下信息
    1. 当前的RTP包含了多少个⾳频包?
    2. 每个⾳频包的⼤⼩是多少?
    3. 时间戳是多少?

    AU-Header数据段的格式为


    其它的值都是可选的, 如果sdp中没有出现相关的参数(或者为0), 则表示它们不出现.
    以最简单的情况举例, 假设aac数据⻓度为200字节, 只有⼀个au-header.
    200 的⼆进制为 0000011001000 . (补⾜为13 bits)
    AU-headers-length 值为16, 因为只有⼀个au-header, au-header中只有AU-size和AU-Index, 共占⽤16bits

    整个au-header数据段的内容为

    0000 0000 0000 1000 0000011001000 000
    

    通常情况下, ⼀个rtp中只有⼀个aac包, 不需要加再AU-Header, 那么sdp中的aac参数可以简化为

    a=fmtp:96 streamtype=5; profile-level-id=1; mode=AAC-hbr; config=138856e500;
    

    相关文章

      网友评论

          本文标题:音视频流媒体开发【七十】- RTSP流媒体5-RTP之AAC封包

          本文链接:https://www.haomeiwen.com/subject/looqpdtx.html