请教一个直播流延时的问题,不是降低延迟,是增加延迟

2020-04-28 22:28:10 +08:00
 bing0

需要实现在客户端观看这个直播的时候,是延时 3-5 分钟之后的画面。

1.推上来的流是实时的(不是用 OBS 延时推流做的)

2.这个延时可以在 rtmp 服务端做,也可以在客户端做,我不知道怎么样实现起来比较简单。

3.服务端到客户端未必一定要用 rtmp 或者 hls 有别的办法也行,客户端是 windows,倾向通过 web 页面来展示。

大佬们有没有好的想法。 可以有偿开发。

3924 次点击
所在节点    程序员
20 条回复
chinvo
2020-04-28 22:43:26 +08:00
Nginx rtmp module 里加延迟

这个模块是 rtmp 推流,出 rtmp 、hls 、dash
shadowind
2020-04-28 23:20:11 +08:00
录制,再延时转推即可。
bing0
2020-04-28 23:23:36 +08:00
@chinvo 你好,我的理解是增加 buffer,但是你不知道过来的码率是多少,结果输出的延时结果就不好控制…
JerryCha
2020-04-28 23:26:00 +08:00
在客户端做不会被破解吗
bing0
2020-04-28 23:27:07 +08:00
@JerryCha 不需要考虑安全性…
chinvo
2020-04-28 23:31:24 +08:00
@bing0 #3 这个模块是用 ffmpeg 处理的,会自动计算这个
bing0
2020-04-28 23:39:46 +08:00
@chinvo 请问我应该怎么配置
chinvo
2020-04-29 00:48:54 +08:00
@bing0 #7 通过 exec 指令调用 ffmpeg, 你可以看下他的 README 和 wiki 里面的说明

很久没做过相关项目了, 基本忘光了
jinliming2
2020-04-29 01:04:10 +08:00
按照我的理解,客户端应该是不好做的,特别你还是 web 端……
不考虑被破解的安全问题。如果是要客户端做,那么服务端推送的就是实时视频,那么为了延迟播放,用户在进入页面后的 3 分钟内将不允许看到任何画面,直到 3 分钟后才开始播放 3 分钟前收到的实时画面。那么这延迟的 3 分钟显示什么?
所以这个肯定是要服务端来做的,这样在用户进入页面的时候,才可以请求到 3 分钟前的画面,立即开始播放。

如果对延迟时间的控制精度不需要太高的话,实际上可以采用分段存文件的方式,比如是每十秒的视频流存一个文件,在客户开始请求的时候就从 3 分钟前的文件开始返回即可。
ThinkZ
2020-04-29 01:22:35 +08:00
ffmpeg 参数 添加 -vf tpad=start_duration=15 -af "adelay=15s|15s"
图像 15 秒,前 15 秒补黑场,简单粗暴,声音同时也要加上 15 秒相同延时

PS,需要重新编码。

ffmpeg -re -i rtmp://xx.xx.xx.xx/xx.xx -vf tpad=start_duration=15 -af "adelay=15s|15s" -acodec aac -vcodec libx264 -f flv rtmp://yy.yy.yy.yy/yy.yy
p2p
2020-04-29 02:18:03 +08:00
所以你保留三分钟的 buffer 不就可以了嘛
noobsheldon
2020-04-29 08:34:05 +08:00
把直播视频的时间调快三分钟? /doge
cq65617875
2020-04-29 08:47:18 +08:00
我记得 m3u8 跟 dash 自带切片延时 15s 左右
然后再在上面加分块时间……

dash_fragment
Syntax: dash_fragment time
Context: rtmp, server, application
Sets MPEG-DASH fragment length. Defaults to 5 seconds.
liukanshan
2020-04-29 09:02:13 +08:00
不能增加 buffer 你让别人一进来 难道还要等待 3 分钟吗?告诉楼主比较简单的实现方式 hls 自己建立维护列表 当 web 端请求时 构建一个 3 分钟之前的列表即可 也可有偿开发 d3g6eXVtZW1vcg==
p2p
2020-04-29 13:13:02 +08:00
realtime stream -> 3 mins+ buffer -> HLS

所以流开始的时间就延迟 3 分钟+ 但这不代表用户进来必然要等三分钟,只是代表用户看到的内容是三分钟+之前发生的

如果三分钟前什么都没发生,那自然是要等
xmge
2020-04-29 14:54:37 +08:00
别的不知道,我感觉也应该是服务端来做的,服务端负责数组,客户端负责展示。

感觉保存 3 分钟的 buffer 靠谱。
zhuweiyou
2020-04-29 15:14:30 +08:00
提前 3 分钟开直播,完美解决。
heiyutian
2020-09-27 22:53:09 +08:00
@p2p 你这个怎么在 ffmpeg 写出来,能帮忙给个命令例子吗
heiyutian
2020-09-27 22:57:31 +08:00
@ThinkZ 你这个命令例子很有帮助,一下子就看懂了,请问有没有用-codec -cody 这样直接复制同时不处理视频直接增加延迟推流的方法?
heiyutian
2020-09-27 22:58:32 +08:00
楼上打错了,是 -codec copy

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/667100

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX