C++实现 RTMP 协议发送 H.264 编码及 AAC
编码的音视频
RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,
最初由 Macromedia 公司创建,后来归 Adobe 公司所有,是一种私有协议,主要用来联系
Flash Player 和 RtmpServer,如 FMS,Red5,crtmpserver 等。RTMP 协议可用于实现直
播、点播应用,通过 FMLE(Flash Media Live Encoder)推送音视频数据至
RtmpServer,可实现摄像头实时直播。不过,毕竟 FMLE 应用范围有限,想要把它嵌入到
自己的程序中,还是要自己来实现 RTMP 协议的推送。本人实现了一个
RTMPLiveEncoder,通过采集摄像头视频和麦克风音频,并进行 H.264 和 AAC 编码,然
后发送到 FMS 和 crtmpserver 上,实现实时直播,可以通过 flash player 正常观看,目前
效果良好,延迟时间在 2 秒左右。本文就介绍一下 RTMPLiveEncoder 的主要思路和关键
点,以期对需要这方面技术的朋友有所帮助。
技术分析
要实现 RTMPLiveEncoder,需要以下四种关键技术:
采集摄像头视频和麦克风音频
H264 编码和 AAC 编码
视频和音频数据封装为可被流媒体服务器识别的可播放流
RTMP 协议实现报文发送
其中,前两项技术在我之前的文章“采集音频和摄像头视频并实时
AAC
编码”中已经介绍过了,这里就不再啰嗦了。
把音视频数据封装为可播放流,这个是一个难点。仔细研究一下,你会发现,RTMP
Packet 中封装的音视频数据流,其实和 FLV 封装音频和视频数据的方式是相同的,所以,
我们只需要按照 FLV 封装 H264 和 AAC 的方式,即可生成可播放流。
我们再看一下 RTMP 协议。Adobe 曾经发布过一份文档《RTMP Specification》,不
过 wikipedia
指出这份文档隐藏了很多细节,单独根据它是无法正确实现 RTMP 的。不过,
它还是有参考意义的。其实 Adobe 发布之前,RTMP 协议就已经被破解的差不多了,现在
也已经有比较完善的实现,比如:RTMPDump,它提供的是 C 语言的接口,这意味着可
以很方便的在其他语言中调用。
程序框架
评论0