FFmpeg/AVconc - 捕捉无缝视频

FFmpeg/AVconc - 捕捉无缝视频

我有几个 IP 摄像头,我想连续捕获它们的视频。我正在编写一个脚本,它将围绕 ffmpeg 捕获各种 RTSP 源的视频。但我在如何捕获和存储数据方面遇到了困难……具体来说,如何捕获无缝剪辑?

为了澄清起见,如果我仅运行如下命令:

ffmpeg -i rtsp://ip_cam file.mp4

这将一直运行,直到填满我的硬盘(或者直到我达到 ffmpeg 或文件系统的上限)。所以我的想法是做这样的事情:

ffmpeg -i rtsp://ip_cam -fs 104857600 file-1.mp4

这会将每个文件限制为 100MB。我的包装器脚本可以在此实例完成后立即启动一个新实例:

ffmpeg -i rtsp://ip_cam -fs 104857600 file-2.mp4

等等(我可以有一个单独的进程,确保根据需要清除旧文件以恢复空间)。这种方法的问题是 ffmpeg 需要 1-2 秒才能启动,这意味着在那段时间里,相关摄像头没有录制任何内容

另外要考虑的一件事是,对于每个文件,我需要知道开始和停止时间戳,例如,file-1.mp4可能指“2015-09-12 09:03:42”到“2015-09-12 11:24:21”。这样,如果用户想要检索特定剪辑,我就知道在哪里可以找到它。如果我为每个剪辑启动 ffmpeg,然后在每个剪辑结束时结束,我可以捕获并存储该信息。但如果建议的方法是告诉 ffmpeg 无限期运行,同时将输出保存在单独的块中(如果 ffmpeg 可以这样做),那么这可能行不通,因为我无法收集这些信息。

任何见解都将不胜感激。

答案1

尝试段复用器

ffmpeg -i rtsp://ip_cam -c copy -f segment -segment_list out.list -segment_time 900 \
-segment_atclocktime 1 -strftime 1 "%Y-%m-%d_%H-%M-%S.mkv"
  • -segment_list生成列表文件。

  • -segment_time设置片段持续时间。该值必须是持续时间规范。默认值为 2。请注意,除非您在给定时间强制使用参考流关键帧,否则分割可能不准确。请参阅段复用器文档了解更多信息。

  • -segment_atclocktime如果设置为“1”,则从 00:00 开始按固定的时钟时间间隔进行拆分。 中指定的时间值-segment_time用于设置拆分间隔的长度。例如,将segment_time 设置为“900”,则可以在 12:00、12:15、12:30 等创建文件。

  • -strftime这允许根据文件创建时间来命名段。

输出文件名示例:

$ ls -m1
2015-09-12_14-10-02.mkv
2015-09-12_14-10-14.mkv
2015-09-12_14-10-24.mkv
2015-09-12_14-10-34.mkv
2015-09-12_14-10-44.mkv
2015-09-12_14-10-54.mkv

查看文档获得更多选项和信息。

相关内容