科技 > 软件教程 > 媒体工具

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

59人参与 2024-08-04 媒体工具

《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开发实战:从零基础到短视频上线》。

 

 

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

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

08-04

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

08-04

FFmpeg开发笔记(四十)Nginx集成rtmp模块实现RTMP推拉流

08-04

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

08-04

装anaconda默认下载路径在d盘,现在想用ipython的时候用不了了咋办?

08-04

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

08-04

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论