登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
园子
关于
博客
发1篇日志+1圆
记录
发1条记录+2圆币
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
VIP申请
网盘
联系我们
道具
勋章
任务
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
资源区
›
代码
›
FFmpeg开发笔记(三十八)APP如何访问SRS推流的RTMP直播 ...
FFmpeg开发笔记(三十八)APP如何访问SRS推流的RTMP直播地址
[ 复制链接 ]
巨到
4 天前
《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开发实战:从零基础到短视频上线》一书。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
本地部署deepseek,并投喂数据
[技术探索者手记] C++自学之路 × linux下搭建属于自己风格的FFmpeg开发项目框架
HTTP-获取天气-dns版
Swift whit Xcode 递归枚举实现(使用枚举模拟加减乘除复合运算)
libevent之bufferevents
JAVA 24 环境安装与配置
RabbitMQ简单介绍及常见面试题
物联网之使用Vertx实现UDP最佳实践【响应式】
FastAPI与Tortoise-ORM开发的神奇之旅
mORMot 1.18 第23章 使用纯SQL
CMake构建学习笔记14-依赖库管理工具
【日记】每次修机器都有些头疼(721 字)
重温c语言之,7天开整,就是随便的写写,第七天
【日记】今天好忙(391 字)
FFmpeg开发笔记(四十三)使用SRS开启SRT协议的视频直播服务
c语言的编译与调试
模拟实现 strcat(字符串追加) --浅谈C语言
线性dp:大盗阿福(打家劫舍)
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
教程
软件
签约作者
程序园优秀签约作者
发帖
巨到
4 天前
关注
0
粉丝关注
11
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9988
森萌黠
9996
堵赫然
9996
4
凶契帽
9996
5
处匈跑
9996
6
柴古香
9996
7
背竽
9996
8
斜素欣
9994
9
恐肩
9994
10
里豳朝
9994
查看更多