当我试图切割视频的多个部分时,我遵循这个问题的解决方案,Cut multiple parts of a video with ffmpeg。但问题是,如果我削减了超过几次(比如大约20次或更多),视频和音频将不会同步。
这是我使用的基线:
ffmpeg -i video \
-vf "select='between(t,4,6.5)+between(t,17,26)+between(t,74,91)',
setpts=N/FRAME_RATE/TB" \
-af "aselect='between(t,4,6.5)+between(t,17,26)+between(t,74,91)',
asetpts=N/SR/TB" out.mp4发布于 2022-02-26 14:19:21
首先是解释。罪魁祸首是骨折者: 23.98 =24000/1001fps。以between(t,4,6.5)为例,这些时间戳以秒为单位转换为第95.904帧和第155.844帧,两种帧都不存在.假设select选择最近的帧(它可以截断,但您可以理解):它实际上设置了框架96 = 4.004 s和帧156 = 6.5065 s的边界,同时,aselect可以在任意整数或半秒内选择准确的音频样本。因此,在本例中,所选的音频样本占您指定的2.5秒,而视频帧跨度为2.5025秒,因此后者的长度为2.5ms。虽然这种数量的同步丢失可能并不明显,但当您进行20次削减时,此错误会复合。
那么,如何解决这个问题?我可以想到两种方法:
select的时间调整到(接近)精确的帧时间.像上面的例子一样,计算所有裁剪上最近的帧时间,并在select和aselect上使用它们。以防万一,公式是t = round(t_desired*24000/1001)*1001/24000。音频样本可能不会对齐调整的时间,但每次切割只会引入小于1/44100 = 22.68 us的错误。这不应该是显而易见的,即使是20次削减也是如此。
fps=24过滤器前面加上一个fps=24过滤器来更改视频帧。此框架保证帧与整数/半/四分之一秒对齐。如果需要23.98 fps,还可以添加-r 24000/1001输出选项以恢复到原来的速率。。
希望其中之一能对你的案子有所帮助。
https://stackoverflow.com/questions/71265774
复制相似问题