FFmpeg开发笔记(五十四)使用EasyPusher实现移动端的RTSP直播

之前的文章《利用RTMP协议构建电脑与手机的直播Demo》介绍了如何使用RTMP Streamer实现完整的RTMP直播流程,另一篇文章《利用SRT协议构建手机APP的直播Demo》介绍了如何使用SRT Streamer实现完整的SRT直播流程,接下来介绍如何使用EasyPusher-Android实现完整的RTSP直播流程。

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

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

上面四种流媒体协议中,RTSP出现最早,在PC互联网时代,RTSP直播曾是主流的视频直播手段。下面就以RTSP协议为例,介绍如何通过EasyPusher-Android向流媒体服务器做RTSP直播推流。

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

OBS Studio默认不支持RTSP协议,需要先安装OBS-RTSPServer插件,才能实现RTSP推流功能。有兴趣的朋友可以自行配置OBS Studio以便实现电脑端的RTSP直播推流。

三、手机端通过EasyPusher-Android进行RTSP直播推流

由于EasyPusher仅支持RTSP推流,而SRS不支持RTSP协议,因此服务端只能采用ZLMediaKit。首先启动云服务上的流媒体服务器ZLMediaKit,在云服务器上部署和启动ZLMediaKit比较麻烦,三言两语说不清楚。如果大家想弄明白如何在云服务器上操作ZLMediaKit,详细的操作步骤参见之前的文章《Linux环境安装ZLMediaKit实现视频推流》。

接着启动手机上的直播录制软件EasyPusher-Android,具体的操作步骤详见之前的文章《移动端的国产直播录制工具EasyPusher》。在调试过程中,发现EasyPusher-Android不能正常解析形如"rtsp://124.70.***.***/live/test"的推流链接,为此需要改造EasyPusher-Android的App代码,让它支持通用的RTSP推流地址。改造内容说明如下:

打开EasyPusher-Android工程的StreamActivity.java,把下面几行RTSP链接的解析代码:

复制代码
String ip = Config.getIp(this);
String port = Config.getPort(this);
String id = Config.getId(this);

改为下面的RTSP链接解析代码,目的是正常解析RTSP链接中的服务器IP、端口号和服务名称:

复制代码
String regex = "^rtsps?://([^/:]+)(?::(\\d+))*/([^/]+)/?([^*]*)$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(url);
boolean matches = matcher.matches();
Log.d(TAG, "matches = " + matches);
String ip = matcher.group(1);
String port = matcher.group(2)!=null?matcher.group(1):"554";
String id = matcher.group(3) + "/" + matcher.group(4);

然后打开Config.java,把下面这行

复制代码
private static final String DEFAULT_SERVER_URL = "rtsp://cloud.easydarwin.org:554/" + String.valueOf((int) (Math.random() * 1000000 + 100000));

改为下面这行:

复制代码
private static final String DEFAULT_SERVER_URL = "rtsp://124.70.***.***/live/test"; // 注意换成自己的RTSP服务器IP

保存代码后重新编译运行,将App安装到测试手机上,等待EasyPusher-Android启动后,点击屏幕左下角的"推流"按钮,让EasyPusher-Android对ZLMediaKit的rtsp地址"rtsp://124.70.***.***/live/test"推流,推流过程的EasyPusher-Android录制界面如下图所示。

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

复制代码
[MediaServer] [119311-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:rtsp://__defaultVhost__/live/test
[MediaServer] [119311-event poller 0] MediaSink.cpp:161 emitAllTrackReady | All track ready use 270ms
[MediaServer] [119311-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:fmp4://__defaultVhost__/live/test
[MediaServer] [119311-event poller 0] MultiMediaSourceMuxer.cpp:551 onAllTrackReady | stream: rtsp://124.70.221.25:554/live/test , codec info: mpeg4-generic[8000/1/16] H264[720/1280/0] 
[MediaServer] [119311-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:rtmp://__defaultVhost__/live/test
[MediaServer] [119311-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:ts://__defaultVhost__/live/test
[MediaServer] [119311-event poller 0] MediaSource.cpp:517 emitEvent | 媒体注册:hls://__defaultVhost__/live/test

然后启动电脑上的流媒体播放器VLC media player,打开网络串流"rtsp://124.70.***.***/live/test",此时VLC media player的视频播放界面如下图所示。

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

复制代码
[MediaServer] [119311-event poller 0] Rtsp.cpp:413 getPortPair | got port from pool:34512-34513
[MediaServer] [119311-event poller 0] Rtsp.cpp:413 getPortPair | got port from pool:33900-33901
[MediaServer] [119311-event poller 0] RtspSession.cpp:819 handleReq_Play | 10-20(121.204.108.60:2247) rtsp seekTo(ms):0

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

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

相关推荐
alexhilton7 小时前
如何用Perfetto来对启动优化去伪存真
android·kotlin·android jetpack
赏金术士8 小时前
Kotlin 从入门到进阶 之函数模块(核心基础)(二)
android·开发语言·kotlin
EasyDSS10 小时前
私有化音视频系统/视频直播点播/音视频点播EasyDSS构建智慧校园视频智能服务新体系
音视频
鱼儿也有烦恼10 小时前
8 issues were found when checking AAR metadata:
android
HalvmånEver10 小时前
MySQL的索引
android·linux·数据库·学习·mysql
我是发哥哈11 小时前
跨AI模型生成视频的五大维度对比:选型避坑指南
大数据·人工智能·学习·机器学习·chatgpt·音视频
道剑剑非道12 小时前
FFmpeg 6.0 实战:用 C++ 封装摄像头采集与 RTSP 推流
开发语言·c++·ffmpeg
赏金术士14 小时前
Kotlin 从入门到进阶 之作用域函数 & 优雅写法(五)
android·开发语言·kotlin
墨染倾城殇14 小时前
蓝牙 5.3 双模一体,面向车载、智能音箱及多场景的经典音频与LE Audio应用
音视频·智能音箱·le audio·蓝牙双模·蓝牙5.3
Gc9umsbL115 小时前
从FLAC到WAV:whisper.cpp中的FFmpeg音频预处理全解析
ffmpeg·whisper·音视频