【问题标题】:FFMpeg Copy Live Stream (Limit to 60s file)FFMpeg 复制直播流(限制为 60 秒文件)
【发布时间】:2020-03-13 12:19:10
【问题描述】:

我目前有一种可行的方法来获取实时流,并在它还处于实时状态时开始在本地下载它。

ffmpeg -i source_hls.m3u8 -c copy output.mkv -y

问题是我实际上并不想保存整个内容,我只是定期在 output.mkv 命令上运行另一个命令来创建部分直播流的剪辑。

我想知道是否可以将 output.mkv 文件限制为只有 60 秒长,这样一旦流超过 1 分钟,它就会切断旧视频并被新的滚动视频替换。

这可能吗?

【问题讨论】:

    标签: ffmpeg http-live-streaming


    【解决方案1】:

    您可以使用分段复用器接近。

    ffmpeg -i source_hls.m3u8 -c copy -f segment -segment_time 60 -segment_wrap 2 -reset_timestamps 1 out%02d.mkv -y
    

    这将写入 out00.mkv,然后是 out01.mkv,然后覆盖 out00.mkv,然后覆盖 out01.mkv,依此类推。

    分段时间设置为 60 秒,因此每个分段将在 60 秒左右。分割的目标是输入的 60,120,180,240... 秒。但是,视频流只会在分割目标处或之后的关键帧处分割。因此,如果 t=59 之后的第一个关键帧是 66,那么第一个片段将是 66s 长。下一个目标是 120 秒。假设在 121 秒处有一个 KF,那么第二段的长度将是 66 到 121 秒 = 55 秒。检查细分时要记住的一些事情。

    检查文件修改时间以查看哪个段包含较早的数据。

    如果你想减少剩余的持续时间,相应地减少segment_time和增加segment_wrap。 segment_time x segment_wrap 应该是 target saved duration + segment_time 长。

    【讨论】:

    • 谢谢,我试试这个。
    • 好的另一个问题,假设我在最新的仍在写入并且文件中只有 10 秒时运行命令,如果我想获得最近的 30 秒,我该怎么做从正在写入的文件中获取 10 秒,然后是完成写入的文件的最后 20 秒。
    • 嗯,顺便说一句,只是让这个运行,看看我是否能解决这个问题,当我让它运行超过 1 分钟时,我得到这个错误:错误:ffmpeg 退出,代码 1:写入路径预告片时出错/to/out%02d.mkv: 无效参数帧= 3130 fps= 49 q=-1.0 Lsize=N/A time=00:01:00.18 bitrate=N/A speed=0.938x video:52256kB audio:875kB subtitle: 0kB 其他流:0kB 全局标头:0kB 复用开销:未知转换失败!
    • 添加 -report 并运行。分享报告链接。
    • 我注销了 ffmpeg 进程正在发送的输出,它显示“解析 AAC 额外数据时出错,无法确定采样率。”这会是因为我用来在节点中运行它的库吗? (github.com/fluent-ffmpeg/node-fluent-ffmpeg) 因为它可以在节点中正常工作
    【解决方案2】:

    迟到的答案,但您可以使用-t duration,即:

    ffmpeg -y -t 60 -i source_hls.m3u8 -c copy output.mkv
    

    来自ffmpeg docs

    -t duration (input/output)
    

    用作输入选项时(-i 之前),限制数据的持续时间 从输入文件中读取。

    当用作输出选项时(在输出 url 之前),停止编写 持续时间达到持续时间后输出。

    duration 必须是持续时间规范,请参阅(ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual

    -to和-t互斥,-t优先。


    -t 参数示例:

    • 11 - 11 秒
    • 11.111 - 11.111 秒
    • 1:11:11 - 11 小时 11 分 11 秒

    【讨论】:

    • 据我所知,添加 -t 只会在达到指定时间后完全停止。我认为这行不通,而且我很确定我以前尝试过。
    • 它确实按预期工作,按预期我的意思是它会记录,在这种情况下,60 秒,然后停止。
    猜你喜欢
    • 2011-12-27
    • 2013-11-11
    • 1970-01-01
    • 2017-09-18
    • 2018-07-16
    • 1970-01-01
    • 2015-08-07
    • 2015-01-11
    相关资源
    最近更新 更多