V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bing0
V2EX  ›  程序员

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

  •  
  •   bing0 · 2020-04-28 22:28:10 +08:00 · 3957 次点击
    这是一个创建于 1680 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    20 条回复    2020-09-27 22:58:32 +08:00
    chinvo
        1
    chinvo  
       2020-04-28 22:43:26 +08:00 via iPhone
    Nginx rtmp module 里加延迟

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

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

    如果对延迟时间的控制精度不需要太高的话,实际上可以采用分段存文件的方式,比如是每十秒的视频流存一个文件,在客户开始请求的时候就从 3 分钟前的文件开始返回即可。
    ThinkZ
        10
    ThinkZ  
       2020-04-29 01:22:35 +08:00   ❤️ 1
    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
        11
    p2p  
       2020-04-29 02:18:03 +08:00 via iPhone
    所以你保留三分钟的 buffer 不就可以了嘛
    noobsheldon
        12
    noobsheldon  
       2020-04-29 08:34:05 +08:00
    把直播视频的时间调快三分钟? /doge
    cq65617875
        13
    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
        14
    liukanshan  
       2020-04-29 09:02:13 +08:00
    不能增加 buffer 你让别人一进来 难道还要等待 3 分钟吗?告诉楼主比较简单的实现方式 hls 自己建立维护列表 当 web 端请求时 构建一个 3 分钟之前的列表即可 也可有偿开发 d3g6eXVtZW1vcg==
    p2p
        15
    p2p  
       2020-04-29 13:13:02 +08:00
    realtime stream -> 3 mins+ buffer -> HLS

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

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

    感觉保存 3 分钟的 buffer 靠谱。
    zhuweiyou
        17
    zhuweiyou  
       2020-04-29 15:14:30 +08:00
    提前 3 分钟开直播,完美解决。
    heiyutian
        18
    heiyutian  
       2020-09-27 22:53:09 +08:00
    @p2p 你这个怎么在 ffmpeg 写出来,能帮忙给个命令例子吗
    heiyutian
        19
    heiyutian  
       2020-09-27 22:57:31 +08:00
    @ThinkZ 你这个命令例子很有帮助,一下子就看懂了,请问有没有用-codec -cody 这样直接复制同时不处理视频直接增加延迟推流的方法?
    heiyutian
        20
    heiyutian  
       2020-09-27 22:58:32 +08:00
    楼上打错了,是 -codec copy
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1075 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:24 · PVG 06:24 · LAX 14:24 · JFK 17:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.