【基于libRTMP的流媒体直播之 AAC、H264 解析】

前文我们说到如何在基于 libRTMP 库的流媒体直播过程中推送 AAC 、H264 音视频流。本文以上文为基础,阐释如何对 RTMP 包进行解析、重组得到原始的 AAC 音频帧以及 H264 码流。

在继续阅读本文之前,我们首先假设读者已经能够使用 libRTMP 库从 RTMP 直播服务器不断地获取 RTMP 包,如前提不成立,请自行阅读 [抛开flash,自己开发实现C++ RTMP直播流播放器] 一文,实现一个简单的 RtmpDownloader 测试用例。这一部分恕 Bill 不再赘述。

废话颇多,下面让我们一起来看看如何对 RTMP 包进行解析和重组。

根据前文所述,我们在推送音、视频包之前,会首先向服务器推送一个音、视频同步包,该包包含了 AAC 音频帧以及 H264 码流的解码信息。因此当我们首次向服务器请求 RTMP 包之后,服务器会下发给我们对应的音、视频同步包,这将决定我们如何解析并重组音、视频。

RTMP 音频包的解析及 AAC 重组

当我们得到服务器下发的第一个音频包(音频同步包)之后,即可按照前文所述的封包顺序进行逆操作,解析得到我们所需要的 AAC 音频信息,根据这些信息,我们便可重组在推送时被我们去掉的那 7 个(或 9 个)字节:ADTS(Audio Data Transport Stream),请参见维基百科 [ADTS]。一旦 ADTS 构造完毕,直接在其后添加原始 AAC 音频数据即完成了整个 AAC 音频帧的重组。

根据 ADTS 属性的描述,我们不难抽象出一个反映该信息的结构体如下:

接着让我们回顾一下前文提到的音频同步包的结构:

我们只需要从服务器获得的音频同步包中获取 AACDecoderSpecificInfo 以及 AudioSpecificConfig 这 4 个字节,并将其中的内容解析到 RtmpLiveAudioMetadataTy 这个结构中以备使用。示例代码如下:

在获得了 AAC 音频所必要的信息之后,我们便可构造 ADTS 并重组 RTMP 服务器下发来的后续音频包。构造 ADTS 示例代码如下:

至此,ADTS 7个字节便重构完毕,我们只需要在这 7 个字节后面添加上 AAC 的原始数据便可重组一个 AAC 音频帧。针对之后的每一个 RTMP 音频包,都进行上述步骤,不断将重组后的 AAC 音频帧写入文件,使用支持的播放器播放以验证解析正确与否。

RTMP 视频包的解析及 H.264 重组

与重组音频帧类似的,我们首先会从服务器获得视频同步包,首先对视频同步包进行拆包解析,得到本次 H264 码流的 Sps 以及 Pps,并从 Sps 中获取视频的宽高信息以备使用。根据前文提到的视频同步包封包流程,我们进行逆向解析的示例如下:

其中从 Sps 获取视频的宽高信息请读者自行 Google,Bill 不再赘述。解析完视频同步包,我们只需要对接下来的视频包进行分类即可,针对 H264 P 帧,我们直接将原始数据写入文件,针对 I 帧,我们在其前面添加保存好的 Sps 以及 Pps,然后写入原始数据即可。针对之后从 RTMP 服务器接收的每一个视频包,均进行上述重组操作,并将获得的 H264 编码写入文件,使用 Elecard StreamEye Tools 播放即可。

参考博文

[1][抛开flash,自己开发实现C++ RTMP直播流播放器]

[2][使用 libRtmp 进行 H264 与 AAC 直播]

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

时间: 2024-10-13 12:10:45

【基于libRTMP的流媒体直播之 AAC、H264 解析】的相关文章

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

这段时间在捣腾基于 RTMP 协议的流媒体直播框架,其间参考了众多博主的文章,剩下一些细节问题自行琢磨也算摸索出个门道,现将自己认为比较恼人的 AAC 音频帧的推送和解析.H264 码流的推送和解析以及网上没说清楚的地方分享给各位. RTMP 协议栈的实现,Bill 直接使用的 libRTMP,关于 libRTMP 的编译.基本使用方法,以及简单的流媒体直播框架,请参见博文[C++实现RTMP协议发送H.264编码及AAC编码的音视频],言简意赅,故不再赘述. 言归正传,我们首先来看看 AAC 

最简单的基于librtmp的示例:发布(FLV通过RTMP发布)

本文记录一个基于libRTMP的发布流媒体的程序:Simplest libRTMP Send FLV.该程序可以将本地FLV文件发布到RTMP流媒体服务器.是最简单的基于libRTMP的流媒体发布示例. 流程图 使用librtmp发布RTMP流的可以使用两种API:RTMP_SendPacket()和RTMP_Write().使用RTMP_SendPacket()发布流的时候的函数执行流程图如下图所示.使用RTMP_Write()发布流的时候的函数执行流程图相差不大. 流程图中关键函数的作用如下

最简单的基于librtmp的示例:发布H.264(H.264通过RTMP发布)

本文记录一个基于libRTMP的发布H.264码流的程序.该程序可以将H.264数据发布到RTMP流媒体服务器.目前这个例子还不是很稳定,下一步还有待修改. 本程序使用回调函数作为输入,通过自定义的回调函数,可以发送本地的文件或者内存中的数据. 函数调用结构图 本程序的函数调用结构图如下所示. 整个程序包含3个接口函数:RTMP264_Connect():建立RTMP连接.RTMP264_Send():发送数据.RTMP264_Close():关闭RTMP连接.按照顺序调用上述3个接口函数就可以

最简单的基于Flash的流媒体示例:RTMP推送和接收(ActionScript)

本文记录一些基于Flash的流媒体处理的例子.Flash平台最常见的流媒体协议是RTMP.此前记录的一些基于C/C++的RTMP播放器/推流器,但是没有记录过基于Flash中的ActionScript的RTMP播放器/推流器.其实基于Flash的RTMP播放器/推流器才能算得上是RTMP技术中的"正规军".RTMP本身设计出来就是用于Flash平台之间通信的,而且RTMP最大的优势--"无插件直播",也是得益于广泛安装在客户端的Flash Player.因此本文分别

七牛云徐晶:基于 WebRTC 架构的直播课堂实践

8 月 18 日下午,在七牛云架构师实践日第三十期,七牛云教育行业产品研发总监徐晶进行了<基于 WebRTC 架构的直播课堂实践>为题的实战分享.? 本文是对演讲内容的实录整理.??作者简介:??七牛云教育行业产品研发总监,拥有 12 年互联网行业经验.擅长将传统行业与互联网结合,形成具有 Plus 效果的互联网产品.曾在阿里巴巴大文娱负责整个优酷直播业务,目前任职七牛云教育行业产品研发总监,构建互联网教育云计算模型,打造在线教育行业的云计算解决方案,突破传统教育壁垒.? 流媒体协议与功能的演

最简单的基于librtmp的示例:接收(RTMP保存为FLV)

本文记录一个基于libRTMP的接收流媒体的程序:Simplest libRTMP Receive.该程序可以将RTMP流保存成本地FLV文件.实际上本文记录的程序就是一个"精简"过的RTMPDump.RTMPDump功能比较多,因而其代码比较复杂导致很多初学者不知从何下手.而本文记录的这个程序只保留了RTMPDump中最核心的函数,更加方便新手入门学习libRTMP. 流程图 使用librtmp接收RTMP流的函数执行流程图如下图所示. 流程图中关键函数的作用如下所列:InitSoc

基于 Red5 的流媒体服务器的搭建和应用

http://www.ibm.com/developerworks/cn/opensource/os-cn-Red5/ Red5 是一个采用 Java 开发的开源免费 Flash 流媒体服务器.Red5 基于 Java 和一些功能强大的开源框架,为企业级应用奠定了标准.它使用 RTMP,RTMPT,RTMPS 和 RTMPE 流媒体协议, 支持:将音频(MP3)和视频(FLV,MP4,F4V,3GP)转换成播放流:录制客户端播放流:共享对象:现场直播流发布:远程调用.Red5 为即时通信,远程教

最简单的基于Flash的流媒体示例:网页播放器(HTTP,RTMP,HLS)

本文继续上一篇文章,记录一些基于Flash的流媒体处理的例子.本文记录一些基于Flash技术的网页播放器.基于Flash的网页播放器相比于其他网页播放器来说最大的优势就是"免插件安装"了,这一点可以很大的提高用户的体验质量.早些时候网络视频(尤其是直播)一般都使用ActiveX控件作为视频播放器,而这些控件并不普及,所以终端用户必须下载相关的插件才能收看节目,因而对很多不熟悉电脑的用户造成了很大的障碍.直到Flash网页播放器的出现,这一障碍才得到了解决.本文将会记录几个常用的网页播放

基于live555的流媒体代理转发服务器

参考: 1,基于live555的流媒体代理转发服务器 http://blog.csdn.net/xiejiashu/article/details/7380897 2,linux 下基于jrtplib库的实时传送实现 http://general.blog.51cto.com/927298/328224