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

本文涉及的产品
视觉智能开放平台,视频资源包5000点
视觉智能开放平台,分割抠图1万点
视觉智能开放平台,图像资源包5000点
简介: 本文讨论了实时数据传输在互联网中的重要性,如即时通讯和在线直播。一对一通信通常使用WebRTC技术,但一对多直播需要流媒体服务器和特定协议,如RTSP、RTMP、SRT或RIST。RTMP由于其稳定性和早期普及,成为国内直播的主流。文章通过实例演示了如何使用OBS Studio和RTMP Streamer进行RTMP推流,并对比了不同流媒体传输协议的优缺点。推荐了两本关于FFmpeg和Android开发的书籍以供深入学习。

不管是传统互联网还是移动互联网,实时数据传输都是刚需,比如以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录制界面如下图所示。

pc_stream1.png

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

pc_stream2.png

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

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

首先启动云服务上的流媒体服务器SRS或者ZLMediaKit。
接着启动手机上的直播录制软件RTMP Streamer,具体的操作步骤详见之前的文章《使用RTMP Streamer开启APP直播推流》。之后让RTMP Streamer对SRS或者ZLMediaKit的rtmp地址“ rtmp://124.xxx.xxx.xxx/live/test ”推流,推流过程的RTMP Streamer录制界面如下图所示。

app_stream1.jpg

观察华为云上的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的视频播放界面如下图所示。

app_stream2.png

观察华为云上的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开发实战:从零基础到短视频上线》。

目录
相关文章
|
2月前
|
小程序 JavaScript API
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
这篇文章介绍了如何在uni-app和微信小程序中实现将图片保存到用户手机相册的功能。
962 0
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
|
3月前
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
101 12
|
4月前
|
Web App开发 Android开发
FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo
实时数据传输在互联网中至关重要,不仅支持即时通讯如QQ、微信的文字与图片传输,还包括音视频通信。一对一通信常采用WebRTC技术,如《Android Studio开发实战》中的App集成示例;而一对多的在线直播则需部署独立的流媒体服务器,使用如SRT等协议。SRT因其优越的直播质量正逐渐成为主流。本文档概述了SRT协议的使用,包括通过OBS Studio和SRT Streamer进行SRT直播推流的方法,并展示了推流与拉流的成功实例。更多细节参见《FFmpeg开发实战》一书。
78 1
FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo
|
4月前
|
存储 监控 开发工具
Django 后端架构开发:手机与邮箱验证码接入、腾讯云短信SDK和网易邮箱
Django 后端架构开发:手机与邮箱验证码接入、腾讯云短信SDK和网易邮箱
78 0
|
6月前
|
网络协议 Android开发 数据安全/隐私保护
Android手机上使用Socks5全局代理-教程+软件
Android手机上使用Socks5全局代理-教程+软件
5044 2
|
7月前
|
监控 安全 Android开发
【新手必读】Airtest测试Android手机常见的设置问题
【新手必读】Airtest测试Android手机常见的设置问题
217 0
|
7月前
|
XML Java Android开发
Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信)
Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信)
483 0
|
7月前
|
Web App开发 前端开发 网络安全
前端分析工具之 Charles 录制 Android/IOS 手机的 https 应用
【2月更文挑战第21天】前端分析工具之 Charles 录制 Android/IOS 手机的 https 应用
110 1
前端分析工具之 Charles 录制 Android/IOS 手机的 https 应用
|
7月前
|
存储 数据库 Android开发
Android实现手机内存存储功能
Android实现手机内存存储功能
69 2
|
7月前
|
网络协议 安全 Linux
如何使用Android手机通过JuiceSSH远程访问本地Linux服务器
如何使用Android手机通过JuiceSSH远程访问本地Linux服务器

热门文章

最新文章

下一篇
DataWorks