FFmpeg开发笔记(三十二)利用RTMP协议构建电脑与手机的直播Demo

news/2024/9/23 13:28:24

不管是传统互联网还是移动互联网,实时数据传输都是刚需,比如以QQ、微信为代表的即时通信工具,能够实时传输文本和图片。其中一对一的图文通信叫做私聊,多对多的图文通信叫做群聊。

除了常见的图文即时通信,还有实时音视频通信,比如一对一的音频通话、一对一的视频通话等等,此时可采用WebRTC技术,有关WebRTC的编程开发及其项目实战参见《Android Studio开发实战:从零基础到App上线(第3版)》一书的第20章“20.2  给App集成WebRTC”。

但是一对多的在线直播采用WebRTC技术就不太合适了,因为WebRTC只管打洞把双方的网络打通,不考虑综合负载。一旦连接WebRTC的设备多起来,整个WebRTC网络就会瘫痪。那么一对多的在线直播就要考虑部署独立的流媒体服务器,通过专门的流媒体传输协议,处理媒体源的音视频格式转换,以及音频流和视频流的数据分发工作。更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

一、常见的四种流媒体传输协议对比

常见的流媒体传输协议主要有下面几类:

  1. RTSP协议:网络延迟很低,且支持倍速播放功能。但客户端的对该协议支持很弱,不仅ios不支持播放rtsp流,连大多数浏览器也不能直接播放rtsp流。而且RTSP对服务端的复杂度要求比较高,以至流媒体服务器SRS干脆放弃支持RTSP协议,直播录制软件OBS Studio也没支持该协议。目前RTSP主要应用于对实时性要求高的安防监控领域。
  2. RTMP协议:网络延迟较低,稳定性很高,即使网络连接质量欠佳,该协议也能很好地传输数据。但RTMP原本因FLV格式而生,客户端要用Flash播放器播放rtmp链接。而FLV格式后来没落了,以至HTML5规范干脆移除了Flash插件,导致如今浏览器都不支持rtmp链接,连FFmpeg也迟至6.1版才给rtmp协议支持hevc格式。不过好在RTMP的稳定性高,服务端的实现相对容易,因此被大量应用于网络直播领域。
  3. SRT协议:拥有固定延迟特性,可以抹平网络的抖动,大大降低视频画面的卡顿现象。该协议引入了AES加密算法,无需像RTSP和RTMP那样引入专门的SSL证书。作为较新的流媒体协议,SRT支持更多的音视频封装格式。只是该协议的支持库libsrt在2017年才开源,因此未能在移动互联网时代大量铺开,目前主要应用于大型电视直播领域。
  4. RIST协议:该协议同样于2017年提出,与SRT协议是竞争关系。RIST和SRT具有相同的加密级别,都支持大容量流媒体和前向纠错功能。该协议的制定时间比SRT还晚,虽然晚制定会多考虑新功能,比如RIST支持点到多点广播,而SRT不支持;但是晚制定拖累了各开源软件对RIST的支持力度,比如OBS Studio早在25.0开始支持SRT,迟至27.0才开始支持RIST,另一个直播录制软件RootEncoder已支持SRT尚未支持RIST,流媒体服务器MediaMTX已支持SRT尚未支持RIST。目前RIST在国内的应用还很少。

综上所述,虽然RTMP协议不够完善,但胜在出现早,赶上了好时代,现为国内直播领域主流的流媒体协议。下面就以RTMP为例,介绍如何通过OBS Studio和RTMP Streamer向流媒体服务器做RTMP推流。

二、电脑端通过OBS Studio进行RTMP直播推流

首先启动电脑上的流媒体服务器MediaMTX,具体的操作步骤详见《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2  FFmpeg推流和拉流”,也可参考之前的文章《详解MediaMTX的推拉流》。
接着启动电脑上的直播录制软件OBS Studio,具体的操作步骤详见之前的文章《使用OBS Studio开启RTMP直播推流》。之后让OBS Studio对MediaMTX的rtmp地址“rtmp://127.0.0.1:1935/stream”推流,推流过程的OBS Studio录制界面如下图所示。

然后启动电脑上的流媒体播放器VLC media player,打开网络串流“rtmp://127.0.0.1:1935/stream”,此时VLC media player的视频播放界面如下图所示。

结合OBS Studio的直播录制画面和VLC media player的直播观看界面,可知通过OBS Studio成功实现了RTMP协议的直播功能。

三、手机端通过RTMP Streamer进行RTMP直播推流

首先启动云服务上的流媒体服务器SRS或者ZLMediaKit,在云服务器上部署和启动SRS或者ZLMediaKit比较麻烦,三言两语说不清楚。如果大家想弄明白如何在云服务器上操作SRS或者ZLMediaKit,可在京东自营购买《FFmpeg开发实战:从零基础到短视频上线》一书,联系作者咨询这两个流媒体服务器在云服务器上的详细运行过程。
接着启动手机上的直播录制软件RTMP Streamer,具体的操作步骤详见之前的文章《使用RTMP Streamer开启APP直播推流》。之后让RTMP Streamer对SRS或者ZLMediaKit的rtmp地址“rtmp://124.xxx.xxx.xxx/live/test”推流,推流过程的RTMP Streamer录制界面如下图所示。

观察华为云上的ZLMediaKit日志如下,可见RTMP Streamer正在向后端的流媒体服务器推送直播流:

[MediaServer] [412449-event poller 0] RtmpProtocol.cpp:442 check_C1_Diges | check rtmp complex handshark success!
[MediaServer] [412449-event poller 0] RtmpSession.cpp:128 operator() | 1-11(223.xxx.xxx.xxx:61202) publish 回复时间:0ms
[MediaServer] [412449-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:rtmp://__defaultVhost__/live/test
[MediaServer] [412449-event poller 0] MediaSink.cpp:161 emitAllTrackReady | All track ready use 215ms
[MediaServer] [412449-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:fmp4://__defaultVhost__/live/test
[MediaServer] [412449-event poller 0] MultiMediaSourceMuxer.cpp:551 onAllTrackReady | stream: rtmp://__defaultVhost__/live/test , codec info: mpeg4-generic[32000/2/16] H264[480/640/0] 
[MediaServer] [412449-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:rtsp://__defaultVhost__/live/test
[MediaServer] [412449-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:ts://__defaultVhost__/live/test
[MediaServer] [412449-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:hls://__defaultVhost__/live/test

然后启动电脑上的流媒体播放器VLC media player,打开网络串流“rtmp://xxx.xxx.xxx/live/test”,此时VLC media player的视频播放界面如下图所示。

观察华为云上的ZLMediaKit日志如下,可见VLC media player正在从后端的流媒体服务器拉取直播流:

[MediaServer] [412449-event poller 0] RtmpProtocol.cpp:442 check_C1_Digest | check rtmp complex handshark success!
[MediaServer] [412449-event poller 0] RtmpSession.cpp:367 operator() | 2-16(112.xxx.xxx.xxx:51055) play 回复时间:1ms

结合RTMP Streamer直播录制画面和VLC media player的直播观看界面,可知通过RTMP Streamer成功实现了RTMP协议的直播功能。
更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

PS

基本概念色彩格式RGB CMYK其他工具图层:文字图层 图像图层 智能对象栅格化:接触智能对象的像素保护蒙版普通蒙版 剪切蒙版 alt+两图层间单击混合选项图层文字部分右键 镂空、不透明度……图层混合小结:魔棒 色彩容差抠图 ctrl+J练习:bezier.method.ac小结:

Hadoop电商日志数据分析(二)

项目要求 根据电商日志文件,分析: 1 . 统计页面浏览量(每行记录就是一次浏览) 2 . 统计各个省份的浏览量 (需要解析IP) 3 . 日志的ETL操作(ETL:数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程)为什么要ETL:没有必要解析出所有数据…

s2-045漏洞还原

1.环境准备,本地server2003 环境对应网址http://192.168.116.112:8080/struts2-showcase/showcase.action 2.使用在线工具包扫描漏洞信息输入对应的url检测发现存在对应漏洞 选择对应漏洞,可执行对应系统命令 上传自带木马文件(复制tmp.jsp内容,上报到对应目录下C:\jspstud…

以opencv为例说明cmake中的findpackage()

大多数第三方库为了适配cmake都会提供XXXConfig.cmake文件,在opencv中是OpenCVConfig.cmakefindpackage()是在环境变量中的XXXConfig.cmake文件,在引用opencv时是在找OpenCVConfig.cmake,对应与引用opnecv时的 find_package(OpenCV REQUIRED) 注意大小写与OpenCVConfig.cmak…

2024/6/23 本周总结

DemoFusion: Democratising High-Resolution Image Generation With No $$$2024/5/11 任意尺度超分 生成一个\(K\)倍大小的图像,需要边长扩大为\(\sqrt{K}\),就是从潜在空间(latent sapce)\(\mathbb{R}^{c\times h\times w}\)到目标空间\(\mathbb{R}^{c\times{H}\times W}\),…

zotero的同步设置问题

zotero作为阅读文献的神器,同步是非常重要的一个功能。结果,今天打开zotero发现笔记不见了,这可是我将近两个月的笔记啊。先是换成了最新版的zotero7bete版本,然后试了下文件同步,还是没有看到笔记,最后还设置了下本机的文件夹,后来还是在文库的未分类条目下找到了笔记,…

pkg-config

一、pkg-config pkg-config是一个命令行工具,主要用于帮助开发者在编译依赖于特定库的软件时,自动获取和设置正确的编译器选项和链接器选项。它的主要作用在于简化编译过程,确保程序能够正确地找到所需的头文件和库文件,尤其是在库文件可能安装在非标准位置的情况下。 pkg-…

2024年6月计算机视觉论文推荐:扩散模型、视觉语言模型、视频生成等

6月还有一周就要结束了,我们今天来总结2024年6月上半月发表的最重要的论文,重点介绍了计算机视觉领域的最新研究和进展。 Diffusion Models 1、Autoregressive Model Beats Diffusion: Llama for Scalable Image GenerationLlamaGen,是一个新的图像生成模型,它将原始的大型…