FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo

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

除了常见的图文即时通信,还有实时音视频通信,比如一对一的音频通话、一对一的视频通话等等,此时可采用WebRTC技术,有关WebRTC的编程开发及其项目实战参见《Android Studio开发实战:从零基础到App上线(第3版)》的第20章"20.2 给App集成WebRTC"。
但是一对多的在线直播采用WebRTC技术就不太合适了,因为WebRTC只管打洞把双方的网络打通,不考虑综合负载。一旦连接WebRTC的设备多起来,整个WebRTC网络就会瘫痪。那么一对多的在线直播就要考虑部署独立的流媒体服务器,通过专门的流媒体传输协议,处理媒体源的音视频格式转换,以及音频流和视频流的数据分发工作。更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

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

常见的流媒体传输协议主要有下面四类:RTSP协议、RTMP协议、SRT协议和RIST协议,关于这四种协议的详细说明参见之前的文章《利用RTMP协议构建电脑与手机的直播Demo》,这里不再赘述。

总的来说,虽然SRT协议出现时间较晚,但是它的直播质量大大优于RTMP协议,今后必将成为国内直播领域主流的流媒体协议。下面就以SRT协议为例,介绍如何通过OBS Studio和SRT Streamer向流媒体服务器做SRT直播推流。

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

首先启动电脑上的流媒体服务器MediaMTX,具体的操作步骤详见《FFmpeg开发实战:从零基础到短视频上线》一书的"10.2 FFmpeg推流和拉流",也可参考之前的文章《详解MediaMTX的推拉流》。

接着启动电脑上的直播录制软件OBS Studio,具体的操作步骤详见之前的文章《结合OBS与MediaMTX实现SRT直播推流》。之后让OBS Studio对MediaMTX的srt地址"srt://127.0.0.1:8890?streamid=publish:live"推流,推流过程的OBS Studio录制界面如下图所示。

然后启动电脑上的流媒体播放器VLC media player,打开网络串流"srt://127.0.0.1:8890?streamid=read:live",此时VLC media player的视频播放界面如下图所示。

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

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

首先启动云服务上的流媒体服务器SRS或者ZLMediaKit,在云服务器上部署和启动SRS或者ZLMediaKit比较麻烦,三言两语说不清楚。如果大家想弄明白如何在云服务器上操作SRS或者ZLMediaKit,可在京东自营购买《FFmpeg开发实战:从零基础到短视频上线》一书,联系作者咨询这两个流媒体服务器在云服务器上的详细运行过程。

接着启动手机上的直播录制软件SRT Streamer,具体的操作步骤详见之前的文章《使用SRT Streamer开启APP直播推流》。SRT Streamer启动后,点击屏幕下方的"Start Live"按钮,让SRT Streamer对ZLMediaKit的srt地址"srt://124.xxx.xxx.xxx:9000?streamid=#!::r=live/test,m=publish"推流,推流过程的SRT Streamer录制界面如下图所示。

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

复制代码
[MediaServer] [685314-event poller 0] SrtSession.cpp:103 onRecv | 1-11(223.104.51.155:11372) 
[MediaServer] [685314-event poller 0] SrtTransportImp.cpp:166 operator() | test(223.104.51.155:11372) 允许 srt 推流
[MediaServer] [685314-event poller 0] Decoder.cpp:143 onTrack | Got track: H264
[MediaServer] [685314-event poller 0] Decoder.cpp:143 onTrack | Got track: mpeg4-generic
[MediaServer] [685314-event poller 0] Decoder.cpp:97 onStream | Add track finished
[MediaServer] [685314-event poller 0] MediaSink.cpp:161 emitAllTrackReady | All track ready use 15ms
[MediaServer] [685314-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:fmp4://__defaultVhost__/live/test
[MediaServer] [685314-event poller 0] MultiMediaSourceMuxer.cpp:551 onAllTrackReady | stream: schema://__defaultVhost__/app/stream , codec info: mpeg4-generic[44100/2/16] H264[720/1280/0] 
[MediaServer] [685314-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:rtmp://__defaultVhost__/live/test
[MediaServer] [685314-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:rtsp://__defaultVhost__/live/test
[MediaServer] [685314-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:ts://__defaultVhost__/live/test
[MediaServer] [685314-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:hls://__defaultVhost__/live/test

然后启动电脑上的流媒体播放器VLC media player,打开网络串流"srt://124.xxx.xxx.xxx:9000?streamid=#!::r=live/test,m=request",此时VLC media player的视频播放界面如下图所示。

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

复制代码
[MediaServer] [576478-event poller 0] SrtSession.cpp:103 onRecv | 2-16(112.5.138.145:57022) 
[MediaServer] [576478-event poller 0] SrtTransport.cpp:731 onShutdown | peer close connection
[MediaServer] [576478-event poller 0] SrtSession.cpp:118 onError | 2-16(112.5.138.145:57022) 6(peer close connection)
[MediaServer] [576478-event poller 0] SrtTransportImp.cpp:14 ~SrtTransportImp | test(112.5.138.145:57022) srt 播放器(__defaultVhost__/live/test)断开,耗时(s):16

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

更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。​

相关推荐
小鱼仙官9 小时前
Windonws 视频存储,10s/不限时
开发语言·qt·音视频
福老板的生意经11 小时前
AI 短视频全链路创作分发系统架构解析:模块化设计与核心技术实现
人工智能·系统架构·音视频
hz5678911 小时前
2026应急指挥场景视频会议系统架构设计与私有化部署实践
系统架构·音视频·实时音视频·信息与通信·视频编解码
Hommy8811 小时前
【剪映小助手】音频处理工具接口
aigc·音视频·剪映小助手·视频剪辑自动化
alphageek811 小时前
JeffMony开源的VideoDownloader,Android平台视频下载SDK
android·其他·开源·音视频
kyle-fang12 小时前
Decord详解
音视频·视频解析
kyle-fang13 小时前
手术视频预处理构想
音视频
DogDaoDao13 小时前
H.266/VVC 视频编解码标准最新优化研究综述
论文·音视频·实时音视频·视频编解码·vvc·vtm·h.266
EasyCVR13 小时前
从连锁门店到城市级项目,国标GB28181视频监控平台EasyCVR的全场景适配能力有多绝?
运维·网络·音视频
REDcker14 小时前
QUIC协议系列导读
音视频·webrtc·实时音视频·webtransport