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开发实战:从零基础到短视频上线》一书。​

相关推荐
REDcker12 天前
WebCodecs VideoDecoder 的 hardwareAcceleration 使用
前端·音视频·实时音视频·直播·webcodecs·videodecoder
gihigo199812 天前
基于TCP协议实现视频采集与通信
网络协议·tcp/ip·音视频
山河君12 天前
四麦克风声源定位实战:基于 GCC-PHAT + 最小二乘法实现 DOA
算法·音视频·语音识别·信号处理·最小二乘法·tdoa
音视频牛哥12 天前
Android平台RTMP/RTSP超低延迟直播播放器开发详解——基于SmartMediaKit深度实践
android·人工智能·计算机视觉·音视频·rtmp播放器·安卓rtmp播放器·rtmp直播播放器
qq_4162764212 天前
通用音频表征的对比学习
学习·音视频
美狐美颜sdk12 天前
Android全局美颜sdk实现方案详解
人工智能·音视频·美颜sdk·视频美颜sdk·美狐美颜sdk
EasyDSS12 天前
私有化部署EasyDSS视频点播能力:全链路视频技术赋能,打造企业级视听新体验
音视频·hls·m3u8·点播技术·智能转码
qq_4162764212 天前
DeLoRes——一种通用的音频表征学习新方法(DeLoRes(基于 Barlow Twins 的冗余最小化方法)
学习·音视频
Q_45828386812 天前
从定位到视频:808 + 1078 在各行业的落地实践
音视频
山顶望月川12 天前
实测MiniMax-Hailuo-02:当“开工大吉“变成“无字天书“,国产AI视频模型的能与之不能
人工智能·音视频