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

ffmpeg,app,srs,rtmp · 浏览次数 : 12

小编点评

《FFmpeg开发实战:从零基础到短视频上线》是一本全面介绍FFmpeg流媒体开发的书籍,其中第10章详细讲解了轻量级流媒体服务器MediaMTX的使用。然而,MediaMTX的功能相对简单,不适用于生产环境。真正能用于生产环境的流媒体服务器有SRS和ZLMediaKit。 SRS是一个开源流媒体服务器,最初设计用于RTMP直播,后来增加了对其他流媒体协议的支持,如HLS、SRT、WebRTC等。要使用SRS,你需要先编译、安装和启动它。关于SRS的安装教程,请参考之前的文章《Linux环境安装SRS实现视频推流》。 在将视频文件推送到SRS时,需要注意FFmpeg的版本。从FFmpeg 6.1开始,它才支持RTMP协议中的HEVC、VP9、AV1视频编码器。因此,如果你的FFmpeg版本低于6.1,你需要升级到这个版本或更高才能以HEVC格式向SRS推送视频。 在手机上,可以使用APP或小程序播放RTMP直播流。小程序可以使用video标签播放RTMP链接,而APP则需要使用ExoPlayer播放RTMP链接。要在APP中使用ExoPlayer播放RTMP直播流,你需要进行以下操作: 1. 在APP模块的build.gradle文件中添加ExoPlayer和相关依赖。 2. 修改播放代码,支持RTMP流。 3. 调整SRS的配置文件,启用缓存GOP。 通过以上步骤,你可以实现在APP中播放RTMP直播流的功能。更多关于FFmpeg和流媒体开发的知识,可以参考《FFmpeg开发实战:从零基础到短视频上线》一书。

正文

《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直播地址相似的内容:

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

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

FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流

​RTMP Streamer是一个安卓手机端的开源RTMP直播推流框架,可用于RTMP直播和RTSP直播,其升级版还支持SRT直播(腾讯视频云就采用SRT协议)。RTMP Streamer支持的视频编码包括H264、H265、AV1等等,支持的音频编码包括AAC、G711、OPUS等等,可谓功能强大

FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg

​《FFmpeg开发实战:从零基础到短视频上线》一书的“第11章 FFmpeg的桌面开发”介绍了如何在Windows环境对Qt结合FFmpeg实现桌面程序,那么Windows系统通过Visual Studio开发桌面程序也是很常见的,下面就介绍如何在Visual Studio的C++工程中集成FFm

FFmpeg开发笔记(三十七)分析SRS对HLS协议里TS包的插帧操作

​《FFmpeg开发实战:从零基础到短视频上线》一书的“2.1.2 音视频文件的封装格式”介绍了视频流的PS格式和TS格式。由于TS包的长度固定,从TS流的任一片段开始都能独立解码,因此可以把TS当成音视频文件的封装格式。 鉴于TS包的独立解码特性,HLS协议引入了TS格式作为传输单元。HLS协议的

FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流

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

FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt

​《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2 FFmpeg推流和拉流”提到直播行业存在RTSP和RTMP两种常见的流媒体协议。除此以外,还有比较两种比较新的流媒体协议,分别是SRT和RIST。 其中SRT全称为Secure Reliable Transport,中文叫做安全可靠传

FFmpeg开发笔记(三十四)Linux环境给FFmpeg集成libsrt和librist

​《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2 FFmpeg推流和拉流”提到直播行业存在RTSP和RTMP两种常见的流媒体协议。除此以外,还有比较两种比较新的流媒体协议,分别是SRT和RIST。 其中SRT全称为Secure Reliable Transport,中文叫做安全可靠传

FFmpeg开发笔记(三十三)分析ZLMediaKit对H.264流的插帧操作

​《FFmpeg开发实战:从零基础到短视频上线》一书的“3.4.3 把原始的H264文件封装为MP4格式”介绍了如何把H.264裸流封装为MP4文件。那么在网络上传输的H.264裸流是怎样被接收端获取视频格式的呢?前文指出H.264流必定以“SPS帧→PPS帧→IDR帧”开头,接下来就来验证是否确实

FFmpeg开发笔记(三十二)利用RTMP协议构建电脑与手机的直播Demo

不管是传统互联网还是移动互联网,实时数据传输都是刚需,比如以QQ、微信为代表的即时通信工具,能够实时传输文本和图片。其中一对一的图文通信叫做私聊,多对多的图文通信叫做群聊。 除了常见的图文即时通信,还有实时音视频通信,比如一对一的音频通话、一对一的视频通话等等,此时可采用WebRTC技术,有关Web

FFmpeg开发笔记(三十)解析H.264码流中的SPS帧和PPS帧

​《FFmpeg开发实战:从零基础到短视频上线》一书的“2.1.1 音视频编码的发展历程”介绍了H.26x系列的视频编码标准,其中H.264至今仍在广泛使用,无论视频文件还是网络直播,H.264标准都占据着可观的市场份额。 之所以H.264取得了巨大的成功,是因为它提出了一个新概念,把标准框架划分为