首页 > 其他分享 >FFmpeg开发笔记(五十四)使用EasyPusher实现移动端的RTSP直播

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

时间:2024-09-22 11:34:32浏览次数:1  
标签:__ FFmpeg RTSP 直播 EasyPusher Android 推流

​之前的文章《利用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开发实战:从零基础到短视频上线》一书。

标签:__,FFmpeg,RTSP,直播,EasyPusher,Android,推流
From: https://www.cnblogs.com/aqi00/p/18390389

相关文章

  • FFmpeg开发笔记(五十三)移动端的国产直播录制工具EasyPusher
    ​EasyPusher是一款国产的RTSP直播录制推流客户端工具,它支持Windows、Linux、Android、iOS等操作系统。EasyPusher采用RTSP推流协议,其中安卓版EasyPusher的Github托管地址为https://github.com/EasyDarwin/EasyPusher-Android。不过EasyPusher有好几年没更新了,尤其安卓版的EasyP......
  • [ffmpeg] 录制
    整理ffmpeg录制用到的一些API,以及一些理解API调用常用APIAVFormatContext*avformat_alloc_context(void);//创建avformat上下文结构体voidavformat_free_context(AVFormatContext*s);//intavformat_alloc_output_context2(AVFormatContext**ctx,constAV......
  • [ffmpeg] 音视频编码
    本文主要梳理ffmpeg中音视频编码的常用函数API调用常用APIconstAVCodec*avcodec_find_encoder(enumAVCodecIDid);AVCodecContext*avcodec_alloc_context3(constAVCodec*codec);voidavcodec_free_context(AVCodecContext**avctx);intavcodec_open2(AVCode......
  • 一文详解Unity下RTMP推送|轻量级RTSP服务|RTSP|RTMP播放模块说明
    技术背景好多开发者,对Unity下的模块,不甚了解,实际上,除了Windows/Linux/Android/iOSNativeSDK,大牛直播SDK发布了Unity环境下的RTMP推流|轻量级RTSP服务(Windows平台+Linux平台+Android平台)和RTMP|RTSP直播播放(Windows、Linux、Android和iOS平台全覆盖)低延迟的解决方案。目前,大牛直播......
  • Android轻量级RTSP服务使用场景分析和设计探讨
    技术背景好多开发者,对我们Android平台轻量级RTSP服务模块有些陌生,不知道这个模块具体适用于怎样的场景,有什么优缺点,实际上,我们的Android平台轻量级RTSP服务模块更适用于内网环境下、对并发要求不高的场景,实现低成本、低延迟的音视频实时传输。本文就上述问题,做个技术探讨,先说适用场......
  • iOS平台RTSP|RTMP直播播放器技术接入说明
    技术背景大牛直播SDK自2015年发布RTSP、RTMP直播播放模块,迭代从未停止,SmartPlayer功能强大、性能强劲、高稳定、超低延迟、超低资源占用。无需赘述,全自研内核,行业内一致认可的跨平台RTSP、RTMP直播播放器。本文以iOS平台为例,介绍下如何集成RTSP、RTMP播放模块。技术对接 系......
  • iOS平台RTSP|RTMP直播播放器技术接入说明
    技术背景大牛直播SDK自2015年发布RTSP、RTMP直播播放模块,迭代从未停止,SmartPlayer功能强大、性能强劲、高稳定、超低延迟、超低资源占用。无需赘述,全自研内核,行业内一致认可的跨平台RTSP、RTMP直播播放器。本文以iOS平台为例,介绍下如何集成RTSP、RTMP播放模块。技术对接 系统要求S......
  • ffplay python 播放rtsp ffmpeg播放rtsp流
    ffmpeg播放RTSP的一点优化: AVDictionary参数配置。 https://www.ffmpeg.org/doxygen/trunk/libavformat_2options__table_8h-source.html 基于ffmpeg的播放器起播延迟优化 :probesize ONVIF、RTSP/RTP、FFMPEG的开发实录: 这里注意多线程问题,如果你用FFMPEG解多......
  • FFmpeg开发笔记(五十一)适合学习研究的几个音视频开源框架
    很多程序员想学习音视频的编程开发,却不知从何学习,因为音视频技术的体系庞大、知识杂糅,一眼望去就令人生怯。那么学习音视频建议站在前人的肩膀上,从优秀的音视频开源框架开始钻研,先熟悉这些开源工具的具体用法,再深入了解这些开源框架的实现代码。有鉴于此,博主整理了几个流行的音视频......
  • 如何在Android上实现RTSP服务器
    技术背景在Android上实现RTSP服务器确实是一个不太常见的需求,因为Android平台主要是为客户端应用设计的。在一些内网场景下,我们更希望把安卓终端或开发板,作为一个IPC(网络摄像机)一样,对外提供个拉流的rtspurl,然后把摄像头麦克风甚至屏幕采集的数据,共享出去,轻量级RTSP的设计理念脱颖......