我正在尝试使用ffmpeg将长视频分割成恰好20秒的长片段,并通过以下方式实现此目的: 在docker内部作为python子进程
subprocess.run(["/usr/sbin/ffmpeg",
"-i", video_loc,
"-async", "1",
"-map", "0",
"-segment_time", "20",
"-f", "segment",
"-reset_timestamps", "1",
"n-%05d.mp4"], cwd=r'/clips')
我的问题是每一个大约20秒,有些低至10秒,有些高至27秒,我会说大多数时间大约是16-23。我还能做些其他事情来确保精确地分开20秒吗?我对任何可能的技术都持开放态度,除了任何手册...
答案 0 :(得分:0)
我有另一种方法可以尝试
假设您有一个名为“ input.mp4”的视频,并且想要将其分割为“ n”个视频,每个视频的长度为20秒。
ffmpeg -ss 00:00:00.000 -i input.mp4 -ss 00:00:19.000 -t 00:00:20.000 -c copy v1.mp4
ffmpeg -ss 00:00:20.000 -i input.mp4 -ss 00:00:39.000 -t 00:00:20.000 -c copy v2.mp4
等等..
答案 1 :(得分:0)
我希望我有幸在Gyan的评论后留下评论,而不是留下答案,但可惜我没有,所以必须这样做。
您仍然会遇到某种程度的变化的原因很可能是因为输入源的帧速率是分数而不是整体。例如-59.94或29.97,而不是30或60。
我已经对分段和强制关键帧进行了广泛的测试,发现当源视频FPS为整数时,这两种方法都只能“完美地”工作。只需将源视频强制为整数帧速率,即可复制帧,并且在长度方面您将体验到更多的一致性。当然,明显的警告是您的输出现在包含重复的帧。之所以能完美地使用引号,是因为仍然很少会有某种程度的变化,在我的情况下,我只注意到两次。
话虽如此,与重复的帧相比,您可能宁愿段长度略有变化。但是,如果您要一次分割多个信号源,则基本上要求所有信号源都具有整数帧速率或缓慢地随着时间推移,当比较编号部分时,您会遇到不同步的情况。
长话短说,如果长度一致性是第一要务,则在输入后同时使用-r [所需整数帧速率]和expr:gte(t,n_forced * 20)。