C++实现RTMP协议发送H.264编码及AAC编码的音视频
2016-02-18 10:23
423 查看
转载自: http://www.cnblogs.com/haibindev/archive/2012/04/16/2450989.html
RTMP(Real Time Messaging Protocol)是常见的流媒体协议,用来传输音视频数据,结合flash,广泛用于直播、点播、聊天等应用,以及pc、移动、嵌入式等平台,是做流媒体开发经常会接触到的协议。我之前曾经写过一篇文章“RTMP协议发送H.264编码及AAC编码的音视频”,简单介绍过如何在自己的程序里使用rtmp协议,不过那篇文章讲的主要是如何实现一个rtmp直播的发布端,主要侧重在“采集-编码-rtmp发布”这样的流程。这篇文章的主要内容是和大家分享下,做一个简单的、输出H.264直播流的rtmpserver,需要实现哪些功能和步骤。
常见的rtmp服务器
有很多知名的rtmp server,其中既有商业程序也有开源程序,简单列举如下:开源项目
商业程序
当然,还有一些其他的开源、商业rtmp服务器(如ffserver),我就不一一列举了。我并没有一一尝试,不过,从它们的声明来看,一般来说,商业rtmp程序要比开源程序支持更多的协议以及更多的平台,至于哪个更好,这就不好说了。我比较推荐的是crtmpserver,高性能,号称可以支持“thousands of simultaneous connections”,而且它的开发社区目前很活跃。不过缺点是,代码量有点庞大,而且在不断增加当中。
rtmp服务器的功能比较复杂,要完整实现比较困难,如果你需要的是一个完整功能的rtmp server,那就可以从它们之中选择一个,如果你的需求和我一样,只是一个简单的、输出H.264直播流的rtmp server,那就需要自己来设计和实现。
rtmp server与播放器的交互
我们需要实现的是:支持flash播放协议、输出H.264直播流的rtmp server,那么首先,我们必须了解rtmp服务器和flash播放器客户端之间是怎样的一个交互流程。通过阅读《rtmp specification 1.0》就可以了解,我这里把它归纳总结一下。基本上一个rtmp server实现了以上6点交互协议,就可以支持flash的播放,顺利的输出h.264视频流。
设计与实现
知道了交互过程,我们就可以来设计和实现自己的Rtmp服务器了。由于RTMP协议是基于TCP协议的,所以rtmp server本质上就是一个TCP服务器,它的逻辑结构基本上和普通的TCP服务器是类似的。事实上,librtmp已经提供了基本的rtmp报文的读取和发送,可以在librtmp的基础上进行开发,来实现各种rtmp协议的组包和发送,从设备、文件或网络中获取到视频数据,封装成Rtmp数据报文,发给flash播放器,完成播放。
我在另一篇文章“RTMP协议发送H.264编码及AAC编码的音视频”中,已经详细介绍了如何编译和使用librtmp,感兴趣的可以去看一下。那篇文章中谈的是rtmp协议视频发布端,和发布端相同的是,rtmp server向flash播放器发送的视频数据流,也是需要首先发送"AVC
sequence header",这其中包含的是重要的编码信息,没有的话,flash播放器将无法解码。下面的代码即是rtmp server收到播放请求之后,从"H264Reader"获取并发送的播放流程。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[b]haibindev.cnblogs.com,合作请联系QQ。(转载请注明作者和出处)[/b]
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
相关文章推荐
- ubuntu 14.04 64位 编译C程序
- 1003. Emergency (25)
- C++ 资源大全
- 获取C语言的宏对应的字符串
- C语言-10-位域与共用体
- c语言:用二分法求方程在(-10,10)之间的根:2x^3-4x^2+3x-6=0.
- c语言:用牛顿迭代法求方程在1.5附近的根:2x^3-4x^2+3x-6=0.
- c语言:用迭代法求x=a^0.5,迭代公式为x1 = (x0 + a / x0) / 2;前后两次求出的x的差的绝对值小于10^-5
- c语言:两个乒乓球队进行比赛,各出3人,A说他不和x比,C说他不和x,z比。找出3对赛手的名单
- C++复习笔记——初始化列表顺序
- c语言:编程找出1000之内的所有完数。
- 栈和队列(C语言版)
- 一个简单的c/c++程序
- 【C语言】PCM音频数据处理---降低采样率
- 华为笔试1 去除重复字符并排序的字符串 c++ string 实现
- C++ 枚举类型的思考
- c:c++内存分配
- c++中的引用
- 【C语言】PCM音频数据处理---音量增大或减小
- C++中引用之常引用