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

这篇具有很好参考价值的文章主要介绍了音视频开发 RTMP协议发送H.264编码及AAC编码的音视频(C++实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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协议实现报文发送

把音视频数据封装为可播放流,这个是一个难点。仔细研究一下,你会发现,RTMP Packet中封装的音视频数据流,其实和FLV封装音频和视频数据的方式是相同的,所以,我们只需要按照FLV封装H264和AAC的方式,即可生成可播放流。

我们再看一下RTMP协议。Adobe曾经发布过一份文档《RTMP Specification》,不过wikipedia指出这份文档隐藏了很多细节,单独根据它是无法正确实现RTMP的。不过,它还是有参考意义的。其实Adobe发布之前,RTMP协议就已经被破解的差不多了,现在也已经有比较完善的实现,比如:RTMPDump,它提供的是C语言的接口,这意味着可以很方便的在其他语言中调用。

程序框架


采用DirectShow技术来实现音视频采集,音频编码和视频编码,在各自线程(AudioEncoderThread和VideoEncoderThread)中循环进行,RTMP的推送另起一个线程(RtmpThread)。两个编码线程实时编码音视频数据后,将数据交与Rtmp线程,由Rtmp线程循环封装为Rtmp Packet,然后发出去。

线程之间的数据交换,通过一个队列DataBufferQueue来实现。AudioEncoderThread和VideoEncoderThread把数据指针post到DataBufferQueue之后,立即返回,这样就可以避免因为发送Rtmp报文的而影响到编码线程的正常执行时间。

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

RtmpThread的主要工作就是发送音频数据流的解码信息头和视频数据流的解码信息头,并不断从DataBufferQueue中取出数据,封装为RTMP Packet,发送出去。流程如下列代码所示:(process_buf_queue_,即是上图中的DataBufferQueue)

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

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的静态库放在一起

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

c) 在工程设置中,添加之前编译好的openssl和zlib的库,编译即可。

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

二、librtmp的使用


首先初始化RTMP结构

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

开始之后,就要向RTMP Server发起握手连接报文

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

连接成功,就可以开始循环发送报文了,这里需要指定时戳和数据类型(Audio、Video、Metadata)。这里有一点需要注意的是,在调用Send之前,buf中的数据,必须是已经封装好的H264或AAC数据流。

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

关闭

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

最后是释放

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

H264和AAC数据流


本文提到过,RTMP推送的音视频流的封装形式和FLV格式相似,由此可知,向FMS推送H264和AAC直播流,需要首先发送"AVC sequence header"和"AAC sequence header",这两项数据包含的是重要的编码信息,没有它们,解码器将无法解码。

AVC sequence header就是AVCDecoderConfigurationRecord结构,该结构在标准文档“ISO-14496-15 AVC file format”中有详细说明。

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

AAC sequence header存放的是AudioSpecificConfig结构,该结构则在“ISO-14496-3 Audio”中描述。AudioSpecificConfig结构的描述非常复杂,这里我做一下简化,事先设定要将要编码的音频格式,其中,选择"AAC-LC"为音频编码,音频采样率为44100,于是AudioSpecificConfig简化为下表:

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

这样,AVC sequence header和AAC sequence header的内容可以基本确定了,更详细的信息,大家可以去翻阅相关文档。

原文地址

FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发 学习

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓文章来源地址https://www.toymoban.com/news/detail-404494.html

到了这里,关于音视频开发 RTMP协议发送H.264编码及AAC编码的音视频(C++实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VCC-H266/X265/X264音视频编码开源实现的编译及测试

    下载vs2019 下载链接 Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 下载cmake【非必须,vs2019中带有cmake,但是没有界面】 下载链接 Download | CMake 设置环境变量Path 使用vs2019中内置的cmake,需要先找到C:Program Files (x86)Microsoft Visual Studio2019ProfessionalCommon7IDECommonExtensionsMic

    2024年02月07日
    浏览(55)
  • 音视频开发---ffmpeg rtmp推流

    推流是将输入视频数据推送至流媒体服务器, 输入视频数据可以是本地视频文件(avi,mp4,flv......),也可以是内存视频数据,或者摄像头等系统设备,也可以是网络流URL。本篇介绍将本地视频文件通过FFmpeg编程以RTMP直播流的形式推送至RTMP流媒体服务器的方法。 推流的网络拓扑

    2024年02月16日
    浏览(81)
  • SRS OBS利用RTMP协议实现音视频推拉流;WebRTC 屏幕直播分享工具

    参考:https://ossrs.net/lts/zh-cn/docs/v5/doc/getting-started 1)docker直接运行SRS服务: 运行起来后可以http://localhost:8080/ 看到服务基本信息: 2) OBS 推流 在设置里设置直播地址: 然后回到首页点击开始直播 3)点击http://localhost:8080/ 可以网页查看流视频 SRS低延迟启动(暂时测试下来延迟

    2024年04月13日
    浏览(59)
  • 【秒懂音视频开发】26_RTMP服务器搭建

    基本概念 流媒体(Streaming media),也叫做:流式媒体。 是指将一连串的多媒体数据压缩后,经过互联网 分段发送 数据,在互联网上即时传输影音以供观赏的一种技术与过程 此技术使得数据包可以像 流水 一样发送,如果不使用此技术,就必须得先 下载整个 媒体文件才能进

    2023年04月08日
    浏览(56)
  • RK3568平台开发系列讲解(音视频篇)RTMP 推流

    🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢目前常见的视频监控和视频直播都是使用了 RTMP 、 RTSP 、 HLS 、 MPEG-DASH 、 WebRTC 流媒体传输协议等。 RTSP (Real-Time Streaming Protocol):实时流传输协议,用于控制媒体服务器上的实时流传输,支持音频

    2024年02月05日
    浏览(73)
  • 【音视频处理】RTMP、HLS、HTTP-FLV、WebRTC、RTSP的区别?直播协议详解

      大家好,欢迎来到停止重构的频道。 本期我们详细讨论 直播的相关协议 ,包括:HTTP-FLV、HLS、RTMP、Web-RTC、RTSP等等。 我们将会详细介绍这些协议的工作原理、应用场景、及延迟的原因。 我们按这样的顺序讨论​ 1、  RTMP、HTTP-FLV  2、  HLS  3、  Web-RTC  4、  RTSP  RTM

    2024年02月02日
    浏览(48)
  • Android 音视频开发实践系列-06-初步了解H.264视频编解码技术标准

    本文来自笔者本人的语雀博客,由于语雀升级后不再满足笔者的需求,因此之后笔者会陆续将一些之前已经发布但尚有价值的文章搬家到CSDN。 作为音视频行业从业者,怎么能不理解H.264视频编解码技术标准?本篇文章主要记录笔者学习过程中对众多优秀博客内容的摘抄整理,

    2023年04月09日
    浏览(54)
  • 音视频开发:音频编码原理+采集+编码实战

    消除冗余信息,压缩量最大,也叫有损压缩 剔除人耳听觉范围外的音频信号20Hz以下和20000Hz以上; 去除被掩蔽的音频信号,信号的遮蔽可以分为频域遮蔽和时域遮蔽; 频域遮蔽效应 屏蔽70分贝以下,20HZ以下,20000HZ以上 屏蔽分贝小,频率小的声音 两个频率相近发出的声音,

    2024年02月05日
    浏览(61)
  • 【秒懂音视频开发】15_AAC编码实战

    本文将分别通过命令行、编程2种方式进行AAC编码实战,使用的编码库是libfdk_aac。 fdk-aac对输入的PCM数据是有参数要求的,如果参数不对,就会出现以下错误: 采样格式 必须是16位整数PCM。 采样率 支持的采样率有(Hz): 8000、11025、12000、16000、22050、24000、32000 44100、48000、

    2024年02月03日
    浏览(87)
  • 【音视频开发】:RTSP服务器协议内容

    RTSP是一个 实时传输流协议 ,是一个 应用层 的协议。通常说的RTSP包括RTSP协议、RTP协议、RTCP协议。 RTSP协议:负责服务器与客户端之间的请求与相应 RTP协议 :负责服务器与客户端之间传输媒体数据 RTCP协议:负责提供有关RTP传输指令的反馈,就是确保RTP传输的质量 吧 三者关

    2024年04月26日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包