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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jenkins 部署文档

Jenkins是一个非常出色的持续集成服务器,本文主要介绍在CentOS系统中Jenkins的基本安装配置方法,供参考。一. 软件包:1. 下载apache-maven-2.2.1-bin.tarhttp://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-2.2.1-bin.tar.gz…

牛人,多看看他们写的东西

计算机大师 Donald E. Knuth(高德纳) 算法大师,我最崇拜的计算机科学家,没有之一!不认识高爷爷的人别说自己是学计算机的。《The Art of Computer Programming》绝对是计算机科学的圣经。对高爷爷的崇敬,对…

20121108团队博客(苏若)

PS:这本是属于昨晚的帖子,对不住忠仔。现在补上。 忠仔,终于交给了我一个实实在在的任务,很是欣喜,也很是忐忑,生怕自己不能及时完成任务。 好了,废话不多说,步入正题。 接下任务【画…

textedit怎么插入数据_还在手动插入Excel交叉空白行?这个小技巧10秒搞定

导读:前几天有同学在后台提问,怎么快速在Excel中隔行插入一行或者多行空白行,其实在早期我们分享的小视频中有利用过类似的小技巧来制作工资条,今天我们用它来插入空白行。文/ 芒种学院指北针Hello,大家好,…

rocketmq 启动_016【windows版Rocketmq】小白学习Rocketmq单机部署

以前都是听说MQ,或者在别人搭建好的基础上去使用,没有自己动手搭建过,就没有更深入去理解。现在机会来啦.啦啦.啦啦啦......引用自己的CSDN文章href"https://blog.csdn.net/chenzhong2010/article/details/106699590或点击左下角“阅读原…

WPF WebBrowser 加载 html ,出现安全警告, 运行 脚本和 activeX 控件,

对于你的问题&#xff0c;只需要在你的HTML首行添加如下代码即可隐藏安全提示条&#xff1a; <!-- saved from url(0014)about:internet --> 还有一个可选方案是使用Winform的WebBrowser控件&#xff0c;不需要更改HTML代码&#xff0c;也不会出现安全提示&#xff0c;需…

php异步处理下载文件,异步处理Excel文件导入【流程图+PHP示例】

面向管理后台的系统中&#xff0c;经常会有文件导入的需求。常规的做法就是同步等待&#xff0c;但在业务关系复杂(多表数据校验)、数据量较大的情况下&#xff0c;管理人员只能等结果&#xff0c;也可能会等到超时。使用异步的话&#xff0c;将导入数据的功能与后端接口解耦&a…

php 简易 blog,PHP实现简易blog的制作

最近&#xff0c;有时间看了点PHP的代码。参考PHP100教程做了简单的blog&#xff0c;这里面简单的记录一下。首先是集成环境&#xff0c;这里选用的WAMP&#xff1a;http://www.wampserver.com/en/首先通过&#xff0c;phpMyAdmin创建一张blog表。纯界面操作&#xff0c;过程比…

离散数学反对称关系_《离散数学》学习记录 - 集合论

来源&#xff1a;北京大学《离散数学》公开课地址&#xff1a;https://www.bilibili.com/video/av18896337/?p122.1 有序对和卡氏积有序对<a,b>&#xff1a;有顺序&#xff0c;类似于数组&#xff0c;可以用集合定义。性质&#xff1a;有序对内元素对应相等卡氏积AB&…

php创建表并插入数据,php数据库操作-创建库和表以及插入数据

以上我们正确连接到了mysql数据库&#xff0c;本文将进一步创建数据库&#xff0c;表&#xff0c;在表中填充数据。大家知道连接上数据库才能进行操作&#xff0c;同样的代码搬过来/** 数据库操作*(创建数据库&#xff0c;表&#xff0c;插入数据&#xff0c;插入多条数据)** T…

mysql触发器 当记录的指定字段发生变化时,更新表中的另外一个字段,或者更新另外一张关联表中关联记录的字段...

2019独角兽企业重金招聘Python工程师标准>>> 注意&#xff1a;语句中出现的old&#xff0c;new&#xff0c;now&#xff08;&#xff09;&#xff0c;都为数据库自带的关键字&#xff0c;此处不做解释。 两种情况&#xff1a; 第一种&#xff1a;一张表中&#xff0…

通用无线设备对码软件_珞光全新发布国产通用软件无线电平台 :USRP-LW N310!珞光品牌已实现国产替代...

USRP-LW N310是一种网络的软件定义无线电&#xff08;SDR&#xff09;&#xff0c;它提供了部署大规模的可靠的和容错性的分布式无线系统。USRP-LW N310通过引入远程执行任务的能力简化了对SDR系统的控制和管理&#xff0c;如更新软件&#xff0c;重新启动&#xff0c;工厂复位…

手把手玩转win8开发系列课程(2)

对win8开发&#xff0c;上一节我们对win8进行了简单的介绍&#xff0c;这一节我们来瞧一瞧他的开发环境搭建。 前奏。 这里所讲的win8开发&#xff0c;主要是指Windows8 app store 上开发&#xff0c;及metro ui或叫morden ui 程序的开发。传统桌面应用程序&#xff0c;网站应…

cordova-plugin-app-version插件使用

此插件用来获取开发软件的版本号&#xff01;首先安装此插件&#xff1a; 命令行中输入 cordova plugin add cordova-plugin-app-version然后刷新项目&#xff0c;就会在在项目plugins文件夹下看到cordova-plugin-app-version,如下图所示接下来就是使用此插件的语句获取版本号c…

不同串口通信速率超时时间_串口知识详解 串口功能及电路介绍

一、串口的概念串行接口简称串口&#xff0c;也称串行通信接口或串行通讯接口(通常指COM接口)&#xff0c;是采用串行通信方式的扩展接口。串行接口(SerialInterface)是指数据一位一位地顺序传送&#xff0c;其特点是通信线路简单&#xff0c;只要一对传输线就可以实现双向通信…

代码生成那点事

在微软技术中浸淫6年多了&#xff0c;我就常想啊&#xff0c;有没有一个工具&#xff0c;能让开发简单一点&#xff0c;哪怕就简单一点点&#xff1f;&#xff01; 这还是去年的事情&#xff0c;手里的项目都成功上线了&#xff0c;我和james聊天&#xff0c;我说咱们的这几个项…

HDU 1003 Max Sum

同上题一样&#xff0c;求连续子序列的最大和 而且比上题还要简单一些&#xff0c;用不到long long了 直接水过 1 //#define LOCAL2 #include <iostream>3 #include <cstdio>4 #include <cstring>5 using namespace std;6 7 const int maxn 100000 10;8 in…

百度关键词抓取工具_VBA利用XMLHTTP抓取百度查询关键词结果的个数

大家好,我们今日讲解"利用XMLHTTP抓取百度查询关键词结果的个数"&#xff0c;这节内容是"VBA信息获取与处理"教程中第六个专题"VBA中利用XMLHTTP完成网抓数据"的第二节。第二节 利用XMLHTTP抓取百度查询关键词结果的个数在上一讲中我们讲解了一些…

多系统通讯-DotNetMQ

很久都没有写博客了&#xff0c;从15年4月份一直忙到现在&#xff0c;我才有时间去做梳理和总结&#xff0c;因为我提离职了&#xff0c;感觉整个世界突然变得不一样&#xff0c;随着而来的就是心情的放松&#xff0c;写一篇文章也是对过去一年多工作的梳理&#xff0c;加深印象…

九大现代病!中枪了吗?

现代人在享受现代化的生活和工作方式带来的便捷之时&#xff0c;也为此付出了不小的代价&#xff0c;下面列出的九大现代病就是典型的例子&#xff0c;看看你有没有中枪。 办公臀 常坐办公室&#xff0c;如果你发现屁股越坐越大&#xff0c;大腿越坐越粗&#xff0c;你可能有了…