​《FFmpeg开发实战:从零基础到短视频上线》一书在第10章介绍了轻量级流媒体服务器MediaMTX,通过该工具可以测试RTSP/RTMP等流媒体协议的推拉流。不过MediaMTX的功能实在是太简单了,无法应用于真实直播的生产环境,真正能用于生产环境的流媒体服务器还要看SRS或者ZLMediaKit。

SRS是一款开源流媒体服务器,最开始是做RTMP直播的,那时全称为“Simple RTMP Server”,意思是简单的RTMP服务器。后来SRS增加支持了其他流媒体协议,包括HLS、SRT、WebRTC等等,它的全称又改为“Simple Realtime Server”,意思是简单的实时服务器。

有关SRS的编译、安装与启动过程参见之前的文章《Linux环境安装SRS实现视频推流》。注意,使用ffmpeg命令把视频文件推流给SRS时,要注意区分FFmpeg的版本,因为FFmpeg从6.1开始才给RTMP协议支持HEVC、VP9、AV1这三种视频编码器,所以FFmpeg 6.0和更早的版本只能以H.264格式向SRS推流,如下所示:

ffmpeg -re -stream_loop -1 -i "/usr/local/src/test/2018s.mp4" -vcodec h264 -f flv rtmp://127.0.0.1/live/test

而下面这种以HEVC格式(即H.265)向SRS推流的命令对于FFmpeg 6.0和更早的版本来说是错误的:

ffmpeg -re -stream_loop -1 -i "/usr/local/src/test/2018s.mp4" -vcodec hevc -f flv rtmp://127.0.0.1/live/test

只有把FFmpeg升级到6.1或更高版本,才能以HEVC格式把视频文件推流给SRS。

在手机上可通过APP或者小程序播放RTMP直播流,其中小程序使用video标签播放RTMP链接,APP除了借助FFmpeg库处理之外,还能使用ExoPlayer播放RTMP链接。引入ExoPlayer播放RTMP直播流的集成步骤说明如下。

一、修改build.gradle

打开APP模块的build.gradle,在dependencies节点内部补充以下的导包配置:

implementation 'com.google.android.exoplayer:exoplayer:2.17.1'
implementation 'com.google.android.exoplayer:extension-rtmp:2.17.1'

可见以上配置不但导入了exoplayer的主包,还导入了rtmp的扩展包。

二、修改播放代码支持RTMP流

ExoPlayer的详细用法参见《Android Studio开发实战:从零基础到App上线(第3版)》一书第14章的“14.3.3  新型播放器ExoPlayer”,其中与RTMP有关的播放代码方法修改如下:

// 播放视频
private void playVideo(String url) {
    DataSource.Factory factory = new DefaultDataSource.Factory(this);
    // 创建指定地址的媒体对象
    MediaItem videoItem = new MediaItem.Builder().setUri(Uri.parse(url)).build();
    // 基于工厂对象和媒体对象创建媒体来源
    MediaSource videoSource;
    if (url.endsWith("m3u8")) {  // HLS地址
        videoSource = new HlsMediaSource.Factory(factory)
                .createMediaSource(videoItem);
    } else if (url.startsWith("rtmp")) {  // RTMP地址
        videoSource = new ProgressiveMediaSource.Factory(new RtmpDataSource.Factory())
                .createMediaSource(videoItem);
    } else {
        videoSource = new ProgressiveMediaSource.Factory(factory)
                .createMediaSource(videoItem);
    }
    mPlayer.setMediaSource(videoSource); // 设置播放器的媒体来源
    mPlayer.prepare(); // 播放器准备就绪
    mPlayer.play(); // 播放器开始播放
}

可见主要改动是增加判断RTMP地址,如果是RTMP链接就引入RtmpDataSource作为数据工厂来源。

三、调整SRS的配置文件

通过小程序或者ExoPlayer播放RTMP直播流时,可能出现播放界面黑屏,但有声音传出的情况。这是因为SRS默认没有缓存关键帧,使得拉流一开始没找到关键帧就黑屏了。

解决办法是修改SRS配置,指定开启缓存GOP,这样客户端在拉流时总能找到已缓存的关键帧。打开srs安装目录下的conf/srs.conf,在“vhost __defaultVhost__”节点内部添加下面一行:

gop_cache   on;

该行配置的作用是开启缓存关键帧,实际应用记得设置为on,否则客户端拉流找不到关键帧就无法渲染画面。

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

FFmpeg开发笔记(三十八)APP如何访问SRS推流的RTMP直播地址的更多相关文章

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

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

  2. 安卓开发笔记(十八):实现button按钮事件的三种方法

    Android开发中有三种主要的方式用于设置View的点击事件,1.创建内部类:2.主类中实现OnClickListener接口:3.使用匿名内部类.这三种方式都用到了OnClickListener接 ...

  3. BizTalk开发系列(三十八)微软BizTalk Server定价和许可[解读]

    做BizTalk的项目一段时间了,但是对BizTalk的价格和许可还不是很了解.给客户设计解决方案时大部分产品都是直接按照企业版的功能来设计,很 少考虑到价格和许可方面的因素,以为这个不是我们的事情或 ...

  4. 【Unity 3D】学习笔记三十八:角色控制器

    角色控制器 在unity中,已经帮我们实现的上下左右跳等动作,并将他们封装成了角色控制器.角色控制器保存在unity标准资源包中,能够说是很的强大.能够模拟第一或者第三人称视角.不受刚体的限制,很适用 ...

  5. 网站开发进阶(三十八)Web前端开发规范文档你需要知道的事

    Web前端开发规范文档你需要知道的事 规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进 ...

  6. .net开发笔记(十八) winform中的等待框

    winform中很多任务是需要在后台线程(或类似)中完成的,也就是说,经常容易涉及到UI界面与后台工作线程之间的交互.比如UI界面控制后台工作的执行(启动.暂停.停止等),后台工作进度在UI界面上的显 ...

  7. JavaScript学习笔记(三十八) 复制属性继承

    复制属性继承(Inheritance by Copying Properties) 让我们看一下另一个继承模式—复制属性继承(inheritance by copying properties).在这 ...

  8. PHP学习笔记三十八【下载】

    <?php //演示下载一个图片 $file_name="SunSet.jpg"; $file_name=iconv("utf-8","gb23 ...

  9. Java开发笔记(十八)上下求索的while循环

    循环是流程控制的又一重要结构,“白天-黑夜-白天-黑夜”属于时间上的循环,古人“年复一年.日复一日”的“日出而作.日落而息”便是每天周而复始的生活.计算机程序处理循环结构时,给定一段每次都要执行的代码 ...

  10. 论文阅读笔记三十八:Deformable Convolutional Networks(ECCV2017)

    论文源址:https://arxiv.org/abs/1703.06211 开源项目:https://github.com/msracver/Deformable-ConvNets 摘要 卷积神经网络 ...

随机推荐

  1. MySQL慢查询及优化

    最近做一个CRM系统,发现了慢查询日志里记载了许多的慢sql,于是就对其进行了sql优化.在优化的过程中,自己也归纳整理了一些sql优化的方案.今天就来和大家聊聊. **1.慢查询的分析** 常见的分 ...

  2. 一个与 WSL2 建立远程的简单方法

    前言 众所周知,windows 会通过虚拟交换机给本机和 wsl2(Linux 子系统)分别分配 ip.于是本机重启或重启 wsl 服务的时候会重新分配 ip.之前所作的端口转发,监听之类的都会失效. ...

  3. WPF 滚动条ScrollViewer样式记录

    WPF 应用程序中有两个支持滚动的预定义元素:ScrollBar 和 ScrollViewer. ScrollViewer 控件封装了水平和垂直 ScrollBar 元素以及一个内容容器(如 Pane ...

  4. 003. git标签

    git标签 标签用于记录详细修改内容,为后续使用提供帮助. 也方便快速的回滚. 每一次提交[commit]都可以打一个tag标签. 测试阶段标签规则: 以 0.01 0.02版本为主 正式上线标签规则 ...

  5. Stable diffusion采样器详解

    在我们使用SD web UI的过程中,有很多采样器可以选择,那么什么是采样器?它们是如何工作的?它们之间有什么区别?你应该使用哪一个?这篇文章将会给你想要的答案. 什么是采样? Stable Diff ...

  6. 操作标签的属性和属性值 table表格

     // 操作标签的属性和属性值         // 特殊的属性           // 可以直接通过 点语法或者[]语法来操作的属性         // id 和 class           ...

  7. [SWPUCTF 2021 新生赛]easy_md5

    打开靶场可以看到一串代码,进行代码审计我们可以知道这个网页包含了一个叫flag2.php的文件,如果想要得到这个文件就得进行GET传参和POST传参. 并且这里用到一个MD5绕过,传参的值不能相等,但 ...

  8. kettle从入门到精通 第十八课 kettle Metadata Injection

    1.Metadata Injection 类似于java里面的模版,设置通用的模版,通过输入不同的数据,得到不同的结果.本示例演示两个字段拼接成一个新字段. 2.设置模版,设置模版时,只需要根据自己的 ...

  9. 一文带你搞清楚Python的多线程和多进程

    本文分享自华为云社区<Python中的多线程与多进程编程大全[python指南]>,作者:柠檬味拥抱. Python作为一种高级编程语言,提供了多种并发编程的方式,其中多线程与多进程是最常 ...

  10. 记Codes 重新定义 SaaS模式开源免费研发项目管理平台——多事项闭环迭代的创新实现

    1.简介 Codes 重新定义 SaaS 模式 = 云端认证 + 程序及数据本地安装 + 不限功能 + 30 人免费 Codes 是一个 高效.简洁.轻量的一站式研发项目管理平台.包含需求管理,任务管 ...