登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
签到
每天签到奖励2-10圆
导读
排行榜
TG频道
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
VIP申请
VIP网盘
网盘
联系我们
发帖说明
每日签到
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
资源区
›
代码
›
FFmpeg开发笔记(三十八)APP如何访问SRS推流的RTMP直播 ...
FFmpeg开发笔记(三十八)APP如何访问SRS推流的RTMP直播地址
[ 复制链接 ]
巨到
2025-6-4 18:32:28
《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
相关帖子
Transformer模型开发从0到1——原理深入与项目实践
我开发的 Chrome 插件 SEO Tools Extension 今天上线了
《阿里Java开发手册》【强制】所有的覆写方法
【一步步开发AI运动APP】十二、自定义扩展新运动项目2
强化学习系统性学习笔记(二):策略优化的理论基础与算法实现
QGIS开发笔记(四):QgsRasterLayer加载Cesium二维地图的瓦片地图数据到QGIS
读高性能MySQL(第4版)笔记15_备份与恢复(下)
Python3开发敏感词过滤程序底层逻辑记录
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
Transformer模型开发从0到1——原理深入与项目实践
0
867
段干叶农
2025-10-08
安全
我开发的 Chrome 插件 SEO Tools Extension 今天上线了
0
705
尤晓兰
2025-10-08
业界
《阿里Java开发手册》【强制】所有的覆写方法
0
444
赶塑坠
2025-10-08
安全
【一步步开发AI运动APP】十二、自定义扩展新运动项目2
0
405
毁抨句
2025-10-09
业界
强化学习系统性学习笔记(二):策略优化的理论基础与算法实现
0
497
副我
2025-10-09
业界
QGIS开发笔记(四):QgsRasterLayer加载Cesium二维地图的瓦片地图数据到QGIS
0
949
姘轻拎
2025-10-10
安全
读高性能MySQL(第4版)笔记15_备份与恢复(下)
1
5
蓝娅萍
2025-10-10
业界
Python3开发敏感词过滤程序底层逻辑记录
0
992
劳暄美
2025-10-11
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
巨到
2025-6-4 18:32:28
关注
0
粉丝关注
18
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
anyue1937
9994888
dage888
999994
3934307807
993690
4
富账慕
10007
5
柴古香
9992
6
匝抽
9986
7
筒濂
9983
8
孙淼淼
9992
9
凌彦慧
9985
10
崔瑜然
9984
查看更多