RTMP协议发送H.264编码及AAC编码的音视频,实现摄像头直播
摘要: RTMP协议发送H.264编码及AAC编码的音视频,实现摄像头直播  RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要 ...

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 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的内容可以基本确定了,更详细的信息,大家可以去翻阅相关文档。接下来就是封装数据内容,然后交给librtmp发送。封装格式如下所示:

运行效果

  RtmpLiveEncoder开始运行

  用FMS自带的一个flash播放器播放

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

HaibinDev软件工作室,合作请联系QQ。(转载请注明作者和出处~)

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

posted on 2012-11-07 14:32 小小程序员001 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/musicfans/archive/2012/11/07/2819290.html

RTMP协议发送H.264编码及AAC编码的音视频,实现摄像头直播相关推荐

  1. C++实现RTMP协议发送H.264编码及AAC编码的音视频

    C++实现RTMP协议发送H.264编码及AAC编码的音视频 RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司 ...

  2. 音视频开发 RTMP协议发送H.264编码及AAC编码的音视频(C++实现)

    RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系F ...

  3. 实现RTMP协议发送H.264编码及AAC编码的音视频

    RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系F ...

  4. 实现RTP协议的H.264视频传输系统

    1.  引言        随着信息产业的发展,人们对信息资源的要求已经逐渐由文字和图片过渡到音频和视频,并越来越强调获取资源的实时性和互动性.但人们又面临着另外一种不可避免的尴尬,就是在网络上看到生 ...

  5. FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法

    From: http://www.cnweblog.com/fly2700/archive/2012/02/23/319718.html RFC3984是H.264的baseline码流在RTP方式下 ...

  6. 基于RTP协议的H.264视频传输系统:原理

    1.引言      随着信息产业的发展,人们对信息资源的要求已经逐渐由文字和图片过渡到音频和视频,并越来越强调获取资源的实时性和互动性.但人们又面临着另外一种不可避免的尴尬,就是在网络上看到生动清晰的 ...

  7. 基于RTP协议的H.264视频传输系统:实现

    实现的原理:基于RTP协议的H.264视频传输系统:原理 相关文章: [1]RTP协议分析 [2]jrtplib简介 [3]Qt调用jrtplib实现单播.多播和广播 [4]RTP 有效负载(载荷)类 ...

  8. 各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式

    编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...

  9. 各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式 详解

    http://blog.csdn.net/wishfly/article/details/50187417 编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运 ...

最新文章

  1. 此字符不允许在标识符中使用_计算机中C语言的-基本语法
  2. 创建electron应用
  3. VUE3(template使用)
  4. java 房贷计算器_求一房贷计算器java源程序
  5. php企业应用,PHP企业级应用缓存技术详解
  6. c mysql清理日志文件_MySQL 一般查询日志或者慢查询日志历史数据的清理
  7. 十大算法 — 插入排序法【C语言代码诠释】
  8. linux apache php.ini,Linux Apache的.htaccess控制php.ini 与MIME类型
  9. cam全称_在ADU高级参数(parameter)中,术语CAM全称是什么?
  10. 三菱FX5U,机床X轴Y轴工作台定位控制程序 使用三菱J4-A系列伺服驱动器绝对位置系统,程序大小27000多步
  11. 数据结构与算法分析Java语言描述 第三版 课后习题 练习 答案
  12. 车路协同应用场景分析
  13. 二分查找和三分求单峰函数极值
  14. android开发 app消息提醒功能,APP消息提醒设计:ios和android的最佳设计方案 – 25学堂...
  15. YYC松鼠短视频系统V2.1版本+后台分类无法编辑的 bug造成错误
  16. Ansible hosts文件写法
  17. 宽容那些与我们不同的人
  18. 服务器端口不稳定怎么解决,网络不稳定的原因分析,以及解决方法
  19. 【科学文献计量】networkx绘制网络图的基本属性,图形读写以及无向/有向图形绘制详解
  20. 网易2018校园招聘:魔法币 [python]

热门文章

  1. 【图像超分辨率】Meta-SR: A Magnification-Arbitrary Network for Super-Resolution
  2. 数学--数论--HDU 2197 本原串 (推规律)
  3. ACM-ICPC 2019 山东省省赛 A Calandar
  4. [机器学习]正则化方法 -- Regularization
  5. 用SecureCRT实现真机跟虚拟机的文件传输
  6. uCOS-II核心算法分析(μCOS-Ⅱ)
  7. 小波阈值图像去噪的实现步骤
  8. 【Tensorflow】tf.map_fn() 使用过程中遇到【inf, NaN】报错问题
  9. TensorFlow(九)eval函数
  10. Booting ARM Linux SMP on MPCore