FFmpeg开发笔记(三十二)利用RTMP协议构建电脑与手机的直播Demo
不管是传统互联网还是移动互联网,实时数据传输都是刚需,比如以QQ、微信为代表的即时通信工具,能够实时传输文本和图片。其中一对一的图文通信叫做私聊,多对多的图文通信叫做群聊。
除了常见的图文即时通信,还有实时音视频通信,比如一对一的音频通话、一对一的视频通话等等,此时可采用WebRTC技术,有关WebRTC的编程开发及其项目实战参见《Android Studio开发实战:从零基础到App上线(第3版)》一书的第20章“20.2 给App集成WebRTC”。
但是一对多的在线直播采用WebRTC技术就不太合适了,因为WebRTC只管打洞把双方的网络打通,不考虑综合负载。一旦连接WebRTC的设备多起来,整个WebRTC网络就会瘫痪。那么一对多的在线直播就要考虑部署独立的流媒体服务器,通过专门的流媒体传输协议,处理媒体源的音视频格式转换,以及音频流和视频流的数据分发工作。更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。
一、常见的四种流媒体传输协议对比
常见的流媒体传输协议主要有下面几类:
- RTSP协议:网络延迟很低,且支持倍速播放功能。但客户端的对该协议支持很弱,不仅ios不支持播放rtsp流,连大多数浏览器也不能直接播放rtsp流。而且RTSP对服务端的复杂度要求比较高,以至流媒体服务器SRS干脆放弃支持RTSP协议,直播录制软件OBS Studio也没支持该协议。目前RTSP主要应用于对实时性要求高的安防监控领域。
- RTMP协议:网络延迟较低,稳定性很高,即使网络连接质量欠佳,该协议也能很好地传输数据。但RTMP原本因FLV格式而生,客户端要用Flash播放器播放rtmp链接。而FLV格式后来没落了,以至HTML5规范干脆移除了Flash插件,导致如今浏览器都不支持rtmp链接,连FFmpeg也迟至6.1版才给rtmp协议支持hevc格式。不过好在RTMP的稳定性高,服务端的实现相对容易,因此被大量应用于网络直播领域。
- SRT协议:拥有固定延迟特性,可以抹平网络的抖动,大大降低视频画面的卡顿现象。该协议引入了AES加密算法,无需像RTSP和RTMP那样引入专门的SSL证书。作为较新的流媒体协议,SRT支持更多的音视频封装格式。只是该协议的支持库libsrt在2017年才开源,因此未能在移动互联网时代大量铺开,目前主要应用于大型电视直播领域。
- 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开发实战:从零基础到短视频上线》一书。
FFmpeg开发笔记(三十二)利用RTMP协议构建电脑与手机的直播Demo的更多相关文章
- Django笔记三十二之session登录验证操作
本文首发于公众号:Hunter后端 原文链接:Django笔记三十二之session登录验证操作 这一篇笔记将介绍 session 相关的内容,包括如何在系统中使用 session,以及利用 sess ...
- FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台
FFmpeg和SDL开发专栏(点击传送门) 上一篇:<FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放>下一篇:敬请期待 前言 将ffmpeg移植到海思H ...
- 树莓派开发笔记(十二):入手研华ADVANTECH工控树莓派UNO-220套件(一):介绍和运行系统
前言 树莓派也可以做商业应用,工业控制,其稳定性和可靠性已经得到了验证,故而工业控制,一些停车场等场景也有采用树莓派作为主控的,本片介绍了研华ADVANTECH的树莓派套件组UNO-220-P4N ...
- BizTalk开发系列(三十二)浅谈BizTalk主机性能优化
很多BizTalk的项目都要考虑到性能优化的问题,虽然BizTalk采用多线程处理消息的,大大提高了程序效率.但默认情况下 BizTalk的主机有很多阻止参数会控制BizTalk对服务器的资源使用率, ...
- Java开发学习(三十二)----Maven多环境配置切换与跳过测试的三种方式
一.多环境开发 我们平常都是在自己的开发环境进行开发, 当开发完成后,需要把开发的功能部署到测试环境供测试人员进行测试使用, 等测试人员测试通过后,我们会将项目部署到生成环境上线使用. 这个时候就有一 ...
- Android UI开发第三十二篇——Creating a Navigation Drawer
Navigation Drawer是从屏幕的左侧滑出,显示应用导航的视图.官方是这样定义的: The navigation drawer is a panel that displays the ap ...
- Java开发笔记(十二)布尔变量论道与或非
在编程语言的设计之初,它们除了可以进行数学计算,还常常用于逻辑推理和条件判断.为了实现逻辑判断的功能,Java引入了一种布尔类型boolean,用来表示“真”和“假”.该类型的变量只允许两个取值,即t ...
- PID控制器开发笔记之十二:模糊PID控制器的实现
在现实控制中,被控系统并非是线性时不变的,往往需要动态调整PID的参数,而模糊控制正好能够满足这一需求,所以在接下来的这一节我们将讨论模糊PID控制器的相关问题.模糊PID控制器是将模糊算法与PID控 ...
- .net开发笔记(十二) 设计时与运行时的区别(续)
上一篇博客详细讲到了设计时(DesignTime)和运行时(RunTime)的概念与区别,不过没有给出实际的Demo,今天整理了一下,做了一个例子,贴出来分享一下,巩固前一篇博客讲到的内容. 简单回顾 ...
- 安卓开发笔记(十二):SQLite数据库储存(上)
SQLite数据库存储(上) 创建数据库 Android专门提供了一个 SQLiteOpenHelper帮助类对数据库进行创建和升级 SQLiteOpenHelper需要创建一个自己的帮助类去继承它并 ...
随机推荐
- Pinely Round 3 (Div. 1 + Div. 2)
A 构造题,分两种情况考虑 上下都行,左右选一个 左右都行,上下选一个 void solve() { int n; cin >> n; vector<pair<int, int ...
- GDB 中内存打印命令
GDB 中使用 "x" 命令来打印内存的值,格式为 "x/nfu addr".含义为以 f 格式打印从 addr 开始的 n 个长度单元为 u 的内存值.参数具 ...
- neo4j的安装部署
Linux下载neo4j 直接在服务器上使用命令下载: curl -O http://dist.neo4j.org/neo4j-community-3.4.5-unix.tar.gz 安装Neo4j ...
- Splashtop Business Access 的常见问题解答
Splashtop Business Access 是一款优秀的远程访问软件,使个人和团队可以快速.简单.安全地访问远程计算机.Splashtop Business Access 是 LogMeIn ...
- 给公众号接入`FastWiki`智能AI知识库,让您的公众号加入智能行列
最近由于公众号用户太多,我就在思考有啥方式能给微信公众号的粉丝提供更多的更好的服务?这个时候我就想是否可以给公众号接入一下AI?让用户跟微信公众号对话,然后还能回到用户的问题,并且我提供一些资料让AI ...
- Windows10 在Hyper-V安装lnmp环境docker方式
1.启用win10虚拟化hyper-v 2.安装docker win10 https://hub.docker.com/editions/community/docker-ce-desktop-win ...
- Three加载3D模型贴图
Three加载3D模型贴图 准备阶段 3D模型 three 库文件 纹理图片 相关资料 官方开发文档: https://threejs.org/docs 官网编辑3D模型:https://threej ...
- HttpWebRequest , HttpWebResponse 调用示例
1, public string sendPost1(string url, string content) { string result = ""; HttpWebReques ...
- 一个简易的录屏demo
MyScreenRecord.cpp //#define LOG_NODEBUG 0 #define LOG_TAG "myrecord" #include <signal. ...
- TDSQL数据库考试实操题
第一题: 演练二 物理备份(5分) 答: 第二题:2. 演练一 请根据给定的演练方案,进行相关演练,并按如下要求提交截图 主备切换(5分) 答: 第三题:3. 演练一 请根据给定的演练方案,进行相关演 ...