【基于libRTMP的流媒体直播之 AAC、H264 推送】

2021年09月15日 阅读数:2
这篇文章主要向大家介绍【基于libRTMP的流媒体直播之 AAC、H264 推送】,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

RTMP 协议的流媒体直播框架,其间参考了众多博主的文章,剩下一些细节问题自行琢磨也算摸索出个门道,现将本身认为比较恼人的 H264 码流的推送和解析以及网上没说清楚的地方分享给各位。html

RTMP 协议栈的实现,Bill 直接使用的 libRTMP 的编译、基本使用方法,以及简单的流媒体直播框架,请参见博文[C++实现RTMP协议发送H.264编码及AAC编码的音视频故再也不赘述。服务器

AAC 以及         不论向 FLV 的格式进行封包。所以,在咱们向服务器推送第一个 H264 数据包以前,须要首先推送一个音频 Tag [AVC Sequence Header] 如下简称“视频同步包”。网络

Tag,根据 Audio Tags 一节的描述:框架

【基于libRTMP的流媒体直播之 AAC、H264 推送】_直播&互动直播

AAC 音频同步包的格式以下:ide

 

 

【基于libRTMP的流媒体直播之 AAC、H264 推送】_直播&互动直播_02

4 个字节。前两个字节被称为  [AudioSpecificConfig],更加详细的指定了音频格式。函数

[AACDecoderSpecificInfo] 俩字节能够直接使用 faacEncGetDecoderSpecificInfo 函数来获取,也能够根据本身的音频源进行计算。通常状况下,双声道,AAC 音频,其值为 测试

FLV 标准 不可贵知,1 个字节高 |1010| 表明音频数据编码类型为 2 位44kHz,接下来 |1| 表示采样点位数1 位0 则为 1 则为普通         音频同步包的后两个字节 编码

        咱们只需参照上述结构计算出对应的值便可。至此,RTMP 服务器,示例代码以下:spa

 

【基于libRTMP的流媒体直播之 AAC、H264 推送】_直播&互动直播_03

44100 时 3(48kHz),44100 时设置标记为 4 均能正常推送并在客户端播放,不过咱们仍是应当按照标准规定的行事,故此处的 4。.net

AAC 数据包,推送数据包时,0xAF01,向服务器说明这个包是普通 AAC 原始数据去掉前 CRC 校验,则去掉前 

 

        推送普通 

 

        至此,咱们便完成了 VLC 或其余支持 AAC 音频流。     

 

 

                                           

RTMP 服务器发送 FLV 格式进行封包,而且首先须要发送视频同步包 FLV 标准  【基于libRTMP的流媒体直播之 AAC、H264 推送】_直播&互动直播_04

Bill 不另做图阐释。由上图可知,咱们的视频同步包 CodecID == 7,AVCVIDEOPACKET,咱们能够获得 CompositionTime == 0x000000,        所以构造视频同步包的关键点即是构造  H264 码流的 Pps,这两个关键数据能够在开始编码 Google 或参见 参考博文        当咱们获得本次 Sps 以及 

 

RTMP 服务器。接下来只须要将普通 H264 直播,下面咱们来看一下普通视频包的组装过程。

FLV 标准 的 H264 普通数据包的封包信息,H264 I 帧CodecID == 7,AVCPacketType == 0x01,0x000000,具体缘由 Data == H264 NALU Size + NALU Raw Data。

【基于libRTMP的流媒体直播之 AAC、H264 推送】_直播&互动直播_05

H264 码流的整个推送流程便已完成,咱们可使用 RTMP 协议的播放器进行测试。

        经过前文的步骤咱们已经可以将 H264 码流正常推送到         在网络良好的状况下,本身最开始使用的音频流时间戳为 H264 编码器刚编码出来一帧的时间,Bill 发现问题出在时间戳上。

Bill最开始的时间戳计算方法是按照音视频分开计算,而音频时戳和视频时戳并非在一条时间线上,这就有可能出现音频时戳在某一个时间点比对应的视频时戳小, 在某一个时间点又跳变到比对应的视频时戳大,致使播放端没法对齐。

RTMP 包的时间,不区分音频流仍是视频流,统一使用即将发送 [2][使用 libRtmp 进行 H264 与 AAC 直播]

[3][RTMP直播到FMS中的AAC音频直播]