Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C++实现RTMP协议发送H.264编码及AAC编码的直播软件开发音视频

C++实现RTMP协议发送H.264编码及AAC编码的直播软件开发音视频

作者头像
云豹kj的晨曦
修改于 2020-08-26 10:06:54
修改于 2020-08-26 10:06:54
1.2K00
代码可运行
举报
文章被收录于专栏:直播+直播+
运行总次数:0
代码可运行

 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目录,分别执行以下命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>perl Configure VC-WIN32 --prefix=c:\some\dir
>ms\do_nasm

  e) 运行Visual Studio Command Prompt(2010),切到openssl目录,分别执行以下命令。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>nmake -f ms\nt.mak
>nmake -f ms\nt.mak install

  f) 编译完毕后,即可在第一个命令所指定的目录下发现编译好的sdk。

2. 编译zlib

  a) 解压zlib压缩包

  b) 运行Visual Studio Command Prompt(2010),切到openssl目录,分别执行以下命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>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播放器播放

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
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的主要思路和关键点,以期对需要这方面技术的朋友有所帮助。
hbstream
2018/06/21
2K0
C++实现RTMP协议发送H.264编码及AAC编码的音视频,摄像头直播
音视频封装:FLV格式详解和打包H264、AAC方案(下)
因表示了前一个Metadata Tag的长度是311字节,这跟上篇分析结果是一致的;
潇湘落木
2020/11/12
3.3K0
音视频封装:FLV格式详解和打包H264、AAC方案(下)
音视频基础概念合集:148 个问题带你快速上车音视频丨音视频基础
音视频是一个有一定技术门槛的垂直领域,对于前端、iOS/Android 客户端、服务端开发同学来说,这都是一个不错的职业发展方向。对于刚开始接触音视频开发的同学,最头疼的问题应该是音视频纷繁庞杂的概念,如果删繁就简,音视频生产及消费的核心环节其实只有:采集(声音和图像的数字化) → 编码(压缩数据便于存储和传输) → 封装(按格式封装便于控制音视频的展现) → 传输(用于网络) → 解封装(封装的逆过程) → 解码(编码的逆过程) → 渲染(声音和图像的展现)。
关键帧
2022/06/13
1.2K0
音视频基础概念合集:148 个问题带你快速上车音视频丨音视频基础
RTSP和RTMP协议有什么区别?RTSP为什么常用于安防监控摄像头行业,而视频直播却只使用RTMP推流?
RTSP(Real Time Streaming Protocol)是一种用于控制实时流媒体传输的网络协议。它允许客户端与服务器进行交互,控制流媒体的播放、暂停、停止、倒放、快进等操作。RTSP协议可以用于音频、视频等多种流媒体数据的传输。
csdn博主eguid_1
2024/01/25
5.5K0
音视频传输:RTP协议详解和H.264打包方案
前面讲解了PS、TS、FLV这三种媒体封装格式,现在新开一个系列讲解下传输协议,这里面会包含RTP、RTSP、HLS、RTMP等。当然最复杂的封装格式MP4在准备中,后面会把封装格式这个系列讲完。今天要说的RTP传输协议,有人也认为这是封装格式,因为协议中打包音视频要填写时间戳的相关信息,FFmpeg就把这个作为封装格式。我觉得都没啥问题,不过我更偏向认为是传输协议。
潇湘落木
2020/11/12
6.8K0
音视频传输:RTP协议详解和H.264打包方案
网友对嵌入式音视频开发的疑惑和解答!
大家好,由于问音视频学习路线的朋友实在是太多了,所以本期视频,我邀请了一个做音视频的前辈来给大家做一个分享,他的项目经验比较丰富,做过很多音视频企业开发实战项目!!
用户6280468
2023/08/31
8700
网友对嵌入式音视频开发的疑惑和解答!
音视频八股文(9)-- flv的h264六层结构和aac六层结构
FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式,由于其封装后的⾳视频⽂件体积⼩、封装简单等特点,⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤FLV格式封装的⽂件后缀为.flv。
福大大架构师每日一题
2023/04/29
4990
音视频码流工具汇总(建议收藏!)
大家好,今天给大家分享一些音视频分析工具,这些工具在我们平时开发过程中经常会用到,非常有帮助!
用户6280468
2023/08/31
2.6K0
音视频码流工具汇总(建议收藏!)
必须要掌握的音视频编码、解码基础!
音视频编码技术在音视频领域有着举足轻重的地位,这是由于音视频原始数据量较大,在传输的过程中如果不进行编码的话,则无法进行传输。比方说,一张普通的图片的大小大概是1-2M,假设我们传输的帧率是30帧,则相当于一秒钟三十张2M的图片,那这个传输量是不得了的。所以此时我们就要引入视频编码技术进行压缩处理,目前常见的视频压缩技术有H264/H265两种压缩技术(这方面我们后面再慢慢介绍),音频编码技术是AAC,这两种压缩格式可以使得每一帧数据的大小能够压缩100-200倍,这使得传输效率大大提高。
用户6280468
2023/08/31
7290
必须要掌握的音视频编码、解码基础!
实现输出h264直播流的rtmp服务器 flash直播服务器
  RTMP(Real Time Messaging Protocol)是常见的流媒体协议,用来传输音视频数据,结合flash,广泛用于直播、点播、聊天等应用,以及pc、移动、嵌入式等平台,是做流媒体开发经常会接触到的协议。我之前曾经写过一篇文章“RTMP协议发送H.264编码及AAC编码的音视频”,简单介绍过如何在自己的程序里使用rtmp协议,不过那篇文章讲的主要是如何实现一个rtmp直播的发布端,主要侧重在“采集-编码-rtmp发布”这样的流程。这篇文章的主要内容是和大家分享下,做一个简单的、输出H.264直播流的rtmp server,需要实现哪些功能和步骤。 
hbstream
2018/05/11
2.7K0
实现输出h264直播流的rtmp服务器 flash直播服务器
解密H264、AAC硬件解码的关键扩展数据处理
通过上一篇文章,我们用ffmpeg分离出一个多媒体容器中的音视频数据,但是很可能这些数据是不能被正确解码的。为什么呢?因为在解码这些数据之前,需要对解码器做一些配置,典型的就是目前流行的高清编码“黄金搭档”组合H264 + AAC的搭配。本文将讲述H264和AAC的关键解码配置参数的解析,如果没有这些配置信息,数据帧往往不完整,导致了解码器不能解码。 H264的配置信息解析 前面我们知道,ffmpeg的avformat_find_stream_info函数可以取得音视频媒体多种,比如播放持续时间、音视频压缩
程序员互动联盟
2018/03/12
1.5K0
解密H264、AAC硬件解码的关键扩展数据处理
音视频封装:FLV格式详解和打包H264、AAC方案(上)
flv即flash video,是Adobe公司推出的一种音视频封装格式,这家公司在音视频、图像图形领域也算是神一般的存在,多少都用过他们家的产品。常见的Photoshop和Flash palyer就是他们家的。今天要讲到的flv也是他们推出来的,也是Flash palyer播放的标准音视频格式。在HTML5出来之前,想在web上播放音视频,基本都靠flash插件。
潇湘落木
2020/11/12
6.7K0
音视频封装:FLV格式详解和打包H264、AAC方案(上)
FLV 格式:为什么直播首选这个流媒体格式?丨音视频基础
(本文基本逻辑:FLV 封装格式概览 → Audio Tags 解析 → Video Tags 解析 → Data Tags 解析)
关键帧
2022/06/13
1.8K0
FLV 格式:为什么直播首选这个流媒体格式?丨音视频基础
RTSP协议转换RTMP直播协议
  RTSP协议也是广泛使用的直播/点播流媒体协议,以前的项目里实现了一个RTSP协议转换RTMP直播协议的程序,为的是可以接收远端设备或服务器的多路RTSP直播数据,实时转换为RTMP直播协议,推送到NginxRtmp等RTMP服务器,可以在PC上实现flash观看RTSP直播源(比如IPCAM)的需求,也能通过Nginx的HLS协议转换,在手机上观看。实现的思路分享如下。
hbstream
2018/06/21
7.5K1
RTSP协议转换RTMP直播协议
H.264编码及AAC编码基础
本节重点讲解了 H.264 编码以及 AAC 编码,在对其进行讲解前先介绍了视频编码的实现原理。
Gnep@97
2023/09/10
1.2K0
H.264编码及AAC编码基础
监控流媒体服务器的搭建和使用_rtmp推流服务器
当我们从网络摄像头上接收视频时,首先要了解协议(RTSP/RTMP/HTTP),然后是解码格式(MKV,RMVB),之后才是将视频(H264)和音频(AAC)格式数据分别解码为图像(RGB/YUV)和声音(PCM),再根据时间戳同步到流媒体平台(比如视频直播点播平台EasyDSS)播放。本文和大家讲一下视频流媒体服务器中RTMP和RTSP区别是什么?
全栈程序员站长
2022/11/01
2.4K0
监控流媒体服务器的搭建和使用_rtmp推流服务器
在HTML5上开发音视频应用的五种思路
无论是实时视频监控还是直播点播等应用场景,最起码的一个操作就是播放视频。其中最基本的思路就是利用OS的API在PC开发桌面应用、在移动端开发Native App,目前这种技术已经成熟,大厂小厂都是这么做的,但是缺点也很明显:开发比较费时费力,需要IOS开发一遍再去Android开发一遍。特别对于一些非刚性需求比如用户家里有一两个监控摄像头,一个礼拜也不会打开看几次,你却要他下载和安装一个APP进行操作,用户安装意愿其实非常低。
音视频开发进阶
2019/12/05
3.2K0
在HTML5上开发音视频应用的五种思路
采集音频和摄像头视频并实时H264编码及AAC编码
采集音频和摄像头视频并实时H264编码及AAC编码 0. 前言   我在前两篇文章中写了DirectShow捕获音视频然后生成avi,再进行264编码的方法。那种方法有一些局限性,不适合实时性质的应用,如:视频会议、视频聊天、视频监控等。本文所使用的技术,适用于这种实时性的应用,通过处理采集出来的音视频的每一帧,实现实时编码,实时输出。这是我做直播系列应用的一部分,目前的情况是输入端采用DirectShow技术捕获音视频,然后对视频进行h.264编码,对音频进行aac编码,输出端则是生成文件,接下来还要进一
hbstream
2018/05/11
2.7K0
Windows平台RTMP/RTSP直播推送模块设计和使用说明
好多开发者一直反馈,Windows平台,做个推屏或者推摄像头,推RTMP或者RTSP出去,不知道哪些功能是必须的,哪些设计是可有可无的,还有就是,不知道如何选技术方案,以下是基于我们设计的Windows平台RTSP、RTMP直播推送模块,设计和使用说明,供大家参考。
音视频牛哥
2020/03/02
3K0
RTMP协议
与 HTTP(超文本传输协议)同样是一个基于 TCP 的 Real Time Messaging Protocol(实时消息传输协议)。由 Adobe Systems 公司为 Flash 播放器和服务器之间音频、视频和数据传输开发的一种开放协议 。在国内被广泛的应用于直播 领域。HTTP 默认端口为 80,RTMP 则为 1935。 我们通过阅读 Adobe 的协议规范,通过与服务器建立 TCP 通信,根据协议格式生成与解析数据即可使用 RTMP 进行 直播。当然我们也可以借助一些实现了 RTMP 协议的开源库来完成这一过程。
小木箱
2020/11/24
1.9K0
推荐阅读
相关推荐
C++实现RTMP协议发送H.264编码及AAC编码的音视频,摄像头直播
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档