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协议实现报文发送
其中,前两项技术在我之前的文章“采集音频和摄像头视频并实时H264编码和AAC编码”中已经介绍过了,这里就不再啰嗦了。
把音视频数据封装为可播放流,这个是一个难点。仔细研究一下,你会发现,RTMP Packet中封装的音视频数据流,其实和FLV封装音频和视频数据的方式是相同的,所以,我们只需要按照FLV封装H264和AAC的方式,即可生成可播放流。
我们再看一下RTMP协议。Adobe曾经发布过一份文档《RTMP Specification》,不过wikipedia指出这份文档隐藏了很多细节,单独根据它是无法正确实现RTMP的。不过,它还是有参考意义的。其实Adobe发布之前,RTMP协议就已经被破解的差不多了,现在也已经有比较完善的实现,比如:RTMPDump,它提供的是C语言的接口,这意味着可以很方便的在其他语言中调用。
程序框架
与我之前写的“采集音频和摄像头视频并实时H264编码和AAC编码”这篇文章相同,采用DirectShow技术来实现音视频采集,音频编码和视频编码,在各自线程(AudioEncoderThread和VideoEncoderThread)中循环进行,RTMP的推送另起一个线程(RtmpThread)。两个编码线程实时编码音视频数据后,将数据交与Rtmp线程,由Rtmp线程循环封装为Rtmp Packet,然后发出去。
线程之间的数据交换,通过一个队列DataBufferQueue来实现。AudioEncoderThread和VideoEncoderThread把数据指针post到DataBufferQueue之后,立即返回,这样就可以避免因为发送Rtmp报文的而影响到编码线程的正常执行时间。
RtmpThread的主要工作就是发送音频数据流的解码信息头和视频数据流的解码信息头,并不断从DataBufferQueue中取出数据,封装为RTMP Packet,发送出去。流程如下列代码所示:(process_buf_queue_,即是上图中的DataBufferQueue)
librtmp
一、编译librtmp
下载rtmpdump的代码,你会发现,它是一个地道的linux项目,除了一个简单的Makefile,其他什么都没有。好像librtmp不依赖于系统,我们可以不用费太多功夫,把它在windows上编译。不过,librtmp依赖于openssl和zlib,我们需要首先编译好它们。
1. 编译openssl1.0.0e
a) 下载并安装ActivePerl
b) 下载并安装nasm(http://nasm.sourceforge.net/)
c) 解压openssl压缩包
d) 运行cmd命令行,切到openssl目录,分别执行以下命令
>perl Configure VC-WIN32 --prefix=c:\some\dir >ms\do_nasm
e) 运行Visual Studio Command Prompt(2010),切到openssl目录,分别执行以下命令。
>nmake -f ms\nt.mak >nmake -f ms\nt.mak install
f) 编译完毕后,即可在第一个命令所指定的目录下发现编译好的sdk。
2. 编译zlib
a) 解压zlib压缩包
b) 运行Visual Studio Command Prompt(2010),切到openssl目录,分别执行以下命令
>cd contrib\masmx86 >bld_ml32.bat
c) 回到zlib目录,进入contrib\vstudio\vc10目录,打开vs2010解决方案文件,
在zlibstat工程属性中,去掉预编译宏 ZLIB_WINAPI
d) 选择debug或release编译即可
3. 编译librtmp
a) 首先打开visual studio 2010,新建一个win32 console工程,指定为静态链接库
b) 将librtmp的代码导入工程,把openssl、zlib的头文件和librtmp放在一起,把编译好的openssl和zlib的静态库放在一起
c) 在工程设置中,添加之前编译好的openssl和zlib的库,编译即可。
二、librtmp的使用
首先初始化RTMP结构
开始之后,就要向RTMP Server发起握手连接报文
连接成功,就可以开始循环发送报文了,这里需要指定时戳和数据类型(Audio、Video、Metadata)。这里有一点需要注意的是,在调用Send之前,buf中的数据,必须是已经封装好的H264或AAC数据流。
关闭
最后是释放
H264和AAC数据流
本文提到过,RTMP推送的音视频流的封装形式和FLV格式相似,由此可知,向FMS推送H264和AAC直播流,需要首先发送"AVC sequence header"和"AAC sequence header",这两项数据包含的是重要的编码信息,没有它们,解码器将无法解码。
AVC sequence header就是AVCDecoderConfigurationRecord结构,该结构在标准文档“ISO-14496-15 AVC file format”中有详细说明。
AAC sequence header存放的是AudioSpecificConfig结构,该结构则在“ISO-14496-3 Audio”中描述。AudioSpecificConfig结构的描述非常复杂,这里我做一下简化,事先设定要将要编码的音频格式,其中,选择"AAC-LC"为音频编码,音频采样率为44100,于是AudioSpecificConfig简化为下表:
这样,AVC sequence header和AAC sequence header的内容可以基本确定了,更详细的信息,大家可以去翻阅相关文档。
运行效果
RtmpLiveEncoder开始运行
用FMS自带的一个flash播放器播放
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
转自:http://www.cnblogs.com/haibindev/archive/2011/12/29/2305712.html
相关推荐
在C++中实现RTMP协议发送H.264编码的音视频,涉及到多个关键步骤和技术,主要包括音视频采集、编码、封装以及RTMP协议的实现。以下是对这些知识点的详细解释: 1. **音视频采集**:通常使用DirectShow框架来捕获...
- RTMP协议可以携带多种编码格式的音视频数据,包括H264、AAC等。 2. **H264编码**: - H264(也称为AVC,Advanced Video Coding)是一种高效的视频压缩标准,能够在较低带宽下提供高质量的视频。 - 它包含多个...
在数字媒体传输领域,RTMP(Real Time Messaging Protocol)协议广泛用于实时音视频流的传输,尤其在网络直播和在线视频服务中。而librtmp库是一个开源项目,专门用于与RTMP服务器进行交互,实现RTMP流的读取和写入...
这个压缩包文件“直播方案:安卓平台采集音视频数据,并硬编码为H264码流和AAC码流,移植rtmpdump将音视频数据发送到流媒体服务器.zip”提供了一个在Android平台上实现直播功能的实例。下面将详细解析其中涉及的知识...
在“ffmpeg的h264推流rtmp”这个主题中,我们将深入探讨如何使用FFmpeg将H264编码的视频流通过RTMP协议推送到服务器。 H264是一种高效的视频编码标准,广泛应用于高清视频传输和存储,因为它可以在较低带宽下提供高...
librtmp支持H264,意味着我们可以将H264编码的视频流通过RTMP协议发送到服务器。 **4. AAC音频编码** AAC(Advanced Audio Coding)是一种音频压缩标准,相比旧的MP3格式,它能以更低的比特率提供更高质量的音频。...
实现 实时的 H264 + AAC 编码 音频和视频的 RTSP, RTMP协议推流, 以及保存到本地MP4,MKV录像文件。 如果要成功编译, 需要下载和编译ffmpeg库,libfdk-aac库,x264库。 编译这些库,非常耗时。如果懒得去编译, ...
提供的RTMP推送API是开发者用来将本地的H264和AAC编码的音视频数据推送到RTMP服务器的关键工具。这些API可能包括建立连接、打开流、发送数据和关闭流等方法。Demo通常是一个简单的示例,演示了如何使用这些API来...
- **多媒体处理**:了解音频和视频编码标准,如AAC和H.264,以便正确地封装和解封装媒体数据。 - **多线程和并发**:在处理实时流媒体时,多线程和并发处理是必需的,以确保流畅的用户体验。 - **错误处理和调试**:...
2. **视频编码与解码**:了解常见的视频编码标准,如H.264,因为RTMP通常承载H.264编码的视频流。理解解码过程,比如如何使用开源库FFmpeg进行解码。 3. **音频编码与解码**:同样,对于音频部分,可能涉及AAC编码...
FFmpeg是一款强大的开源多媒体处理工具,它包含了多种用于音视频编码、解码、转换和流化的组件。在本文中,我们将深入探讨FFmpeg如何支持H265(High Efficiency Video Coding,高效视频编码)在RTMP(Real-Time ...
介绍一个基于C++开发的RTSP/RTMP推流组件PushStream,PushStream推流基础组件是一款推送流媒体音/视频流给标准RTSP流媒体服务器 (如EasyDarwin、Wowza) 或者RTMP流媒体服务器 (如Nginx) 的流媒体推送库
3. **RTMP编码**:将解码后的媒体数据重新编码为RTMP格式,通常包括H.264视频编码和AAC音频编码。 4. **RTMP客户端实现**:创建RTMP连接,将编码后的数据推送到RTMP服务器。 5. **多线程/异步处理**:为了保证高...
编码器将捕获的视频源(如摄像头)编码为H.264视频和AAC音频,然后通过RTMP推送到服务器。 总结一下,RTMP推流是将实时音视频数据从编码器推送到服务器的一种技术,其特点是低延迟和广泛应用于直播服务。了解并掌握...
录像功能可能涉及将连续的视频帧保存为视频文件,这需要对编码和容器格式有深入理解,例如使用FFmpeg库来实现H.264编码和MP4容器格式。 项目名为"myMediaPlayer",这表明这是一个定制化的个人媒体播放器项目。通过...
3. **音视频编码与解码**:了解不同的音视频编码标准,如H.264、AV1、AAC等,以及如何使用FFmpeg进行编码和解码。掌握FFmpeg的Packet、Frame、Context等核心数据结构,以及解码器和编码器的工作流程。 4. **容器...
FFmpeg是一款强大的开源多媒体处理工具,它支持多种音视频编码格式和流协议,包括RTMP。在本示例中,我们将探讨如何使用C++通过FFmpeg库从RTMP流中提取音频,并将其转换为16KHz、16位的PCM(脉冲编码调制)格式。这...
常见的视频编码标准有H.264、HEVC(H.265)、AV1等,而音频编码则有AAC、Opus、FLAC等。 2. 音视频解码:与编码相反,解码是将已编码的音视频数据还原为可播放的媒体格式。这需要理解并执行编码过程的逆操作,通常...
同时,根据不同的编码格式,FFmpeg能够自动选择合适的解码器,支持多种编码标准如H.264、AAC等。 至于编译环境,使用的是MinGW 32位编译器,这是一款基于GCC的Windows编译器,能够编译QT和FFmpeg的C++代码。QT版本...
在开始学习音视频编解码之前,我们需要理解一些基本概念,如帧类型(I帧、P帧、B帧),音频采样率,位深度,容器格式(如MP4、FLV、MKV等),以及编码标准(如H.264、AAC)。 二、编解码原理 1. 视频编解码:主要...