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

相关推荐
清风6666667 小时前
基于STM32的APP遥控视频水泵小车设计
stm32·单片机·mongodb·毕业设计·音视频·课程设计
Cary丿Xin8 小时前
Luma 视频生成 API 对接说明
音视频
简鹿办公12 小时前
FFmpeg vs 去水印软件:哪种方式更适合你?
ffmpeg·怎样去除视频水印·如何去视频logo视频水印
奔跑吧 android20 小时前
【车载audio开发】【基础概念1】【音频基础概念通俗讲解】
音视频·channel·audio·aosp·frame·period_size
小狮子安度因1 天前
ffplay数据结构分析
数据结构·ffmpeg
小狮子安度因1 天前
ffplay音频重采样
ffmpeg·音视频
张晓~183399481211 天前
短视频矩阵源码-视频剪辑+AI智能体开发接入技术分享
c语言·c++·人工智能·矩阵·c#·php·音视频
GilgameshJSS1 天前
【学习K230-例程23】GT6700-音频FFT柱状图
python·学习·音视频
Zero_to_zero12341 天前
NVSpeech_170k 数据集音频提取处理
人工智能·音视频
东方佑2 天前
从音频到Token:构建原神角色语音识别模型的完整实践
人工智能·音视频·语音识别