​之前的文章《利用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开发笔记(五十四)使用EasyPusher实现移动端的RTSP直播的更多相关文章

  1. FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台

    FFmpeg和SDL开发专栏(点击传送门) 上一篇:<FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放>下一篇:敬请期待   前言   将ffmpeg移植到海思H ...

  2. 树莓派开发笔记(十四):入手研华ADVANTECH工控树莓派UNO-220套件(三):使用研发自带系统测试rtc、gpio、232和485套件接口

    前言   上一篇说明了必须要使用研华自带的8G卡的系统,通过沟通拿到了相关的系统,购买的时候会带8GB的卡,请自行备份一份镜像.本篇对uno-220套件的相关研华配套的额外接口做测试,篇幅较长,重点讲 ...

  3. Java开发笔记(十四)几种运算符的优先级顺序

    到目前为止,我们已经学习了Java语言的好几种运算符,包括算术运算符.赋值运算符.逻辑运算符.关系运算符等基础运算符,并且在书写赋值语句时都没添加圆括号,显然是默认了先完成算术.逻辑.关系等运算,最后 ...

  4. .Net开发笔记(十四) 基于“泵”的UDP通信(接上篇)

    上一篇中说到了“泵”在编程中的作用以及一些具体用处,但没有实际demo,可能不好理解,这篇文章我分享一个UDP通信的demo,大概实现了类似“飞鸽传书”在局域网中文本消息和文件传输的功能.功能不全也不 ...

  5. 论文阅读笔记五十四:Gradient Harmonized Single-stage Detector(CVPR2019)

    论文原址:https://arxiv.org/pdf/1811.05181.pdf github:https://github.com/libuyu/GHM_Detection 摘要 尽管单阶段的检测 ...

  6. Hi3516开发笔记(十):Qt从VPSS中获取通道图像数据存储为jpg文件

    前言   上一篇已经将himpp套入qt的基础上进行开发.那么qt中拿到frame则是很关键的交互,这是qt与海思可能编解码交叉开发的关键步骤.   受限制   因为直接配置sample的vi比较麻烦 ...

  7. FFmpeg开发笔记(四):ffmpeg解码的基本流程详解

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  8. FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  9. FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放

    前言   ffmpeg播放rtsp网络流和摄像头流.   Demo   使用ffmpeg播放局域网rtsp1080p海康摄像头:延迟0.2s,存在马赛克     使用ffmpeg播放网络rtsp文件流 ...

  10. FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建

    前言   本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8.   FFmpeg简介   FFmpeg是领先的多媒体框架,能够解码 ...

随机推荐

  1. PHP 程序员为什么依然是外包公司的香饽饽?

    大家好,我是码农先森. PHP 唯一的爽点就是开发起来「哇真快」这刚好和外包公司的需求相契合,在 Web 领域的芒荒年代 PHP 以王者姿态傲视群雄.如果 PHP 敢说第二,就没有哪门子语言敢称第一, ...

  2. 使用JavaScript编写vue指令v-model,v-model原理实现

    首先先要知道的是v-model的作用是实现数据的双向绑定,即: 数据在视图层的双向响应. 实现思路主要分为两步: 第一步:数据层到视图层的响应 将数据响应到视图层的方式,在vue2使用的是Object ...

  3. 在英特尔 Gaudi 2 上加速蛋白质语言模型 ProtST

    引言 蛋白质语言模型 (Protein Language Models, PLM) 已成为蛋白质结构与功能预测及设计的有力工具.在 2023 年国际机器学习会议 (ICML) 上,MILA 和英特尔实 ...

  4. Python 代码中的 yield 到底是什么?

    在Python编程中,有一个强大而神秘的关键字,那就是yield.初学者常常被它搞得晕头转向,而高级开发者则借助它实现高效的代码.到底yield是什么?它又是如何在Python代码中发挥作用的呢?让我 ...

  5. 支付宝退款和结果查询接口简单实现(.Net 7.0)

    〇.前言 支付宝对 .Net 的支持还是比较充分的,在每个接口文档中都有关于 C# 语言的示例,这样就大大降低了对接的难度,很容易上手. 官方接口文档地址:退款-alipay.trade.refund ...

  6. 【Layui】06 面板 Panel

    文档地址: https://www.layui.com/doc/element/panel.html 演示案例: <div class="layui-collapse"> ...

  7. python3解析wav文件获取dtmf值

    操作系统 :Windows 10_x64 Python版本:3.9.2 从事FreeSwitch相关工作,大概率会遇得到DTMF,DTMF的传递方式有三种: In-band RFC2833 SIP-I ...

  8. 如何安装废弃版本的Jax —— pypi服务器上不保存的python包应该如何安装

    python的公开扩展包的存储是在网站: http://pypi.org/ 一般情况下,这是没有问题的,但是对于一些更新版本比较多的扩展包就出现了问题,因为pypi的服务器对每个项目(扩展包)都是由存 ...

  9. python绘图库matplotlib:刻度线的方向调整, in, out, inout

    前文相关: python绘图库matplotlib:画线的标志marker的设置--类型/size/空心/边线颜色及大小/显示marker超出边界部分 由于工作需要经常用matplotlib来绘图,但 ...

  10. ubuntu 安装osx 主题 转自linux公社

    繁體 你好,游客 登录 注册 搜索 首页Linux新闻Linux教程数据库技术Linux编程服务器应用Linux安全Linux下载Linux认证Linux主题Linux壁纸Linux软件数码手机电脑 ...