使用ffmpeg选择过滤器以精确的帧剪切视频


16

我可以使用给定的帧号剪切视频,而不是使用-ss-to寻找似乎不太准确的参数?例如;

ffmpeg -i video.webm -startingframe 80 -endingframe 560 output.webm

[包括第80帧和第560帧。因此,总共制作(560-80 +1)帧]

在答案和一点搜索之后,我尝试了一些命令。但是到目前为止,我还没有找到可接受的方法。

如果有人想在第250帧和第750帧之间剪切视频流,这就是方法。它将给出501帧作为输出:

注意: movie.mp4具有25 fps,其音频采样率48k

ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm

正如预期的那样,输出的长度为20秒。

使用相同的音频方法:

ffmpeg -i movie.mp4 -vn -af "aselect=between(n\,480\,1440),setpts=PTS-STARTPTS" a_stream.webm

出乎意料的是,这一准确性非常差。它应该给了我960001(960k + 1)个等于20秒音频的采样。但是,输出的长度为20.505秒,并具有984240个样本。另外,如果我增加持续时间,错误也会增加。

然后我尝试使用-ss -to参数来剪切音频流:

ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm

旧的经典方法效果更好。输出时间为20.003秒,有960144个样本。另外,持续时间的增加不会增加误差,误差是恒定的,该输入文件中总是有144个样本剩余。

总结: select过滤器在大多数情况下都能正常工作,但选择却不行。经典-ss参数对音频效果更好,但对样本不准确。另外,不可能同时使用-vf select-ss参数,因为-ss它将同时影响音频和视频流,而我们希望仅影响音频。

因此,要精确地剪切媒体文件,我必须执行以下三个步骤:

ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm 
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm 
ffmpeg -i v_stream.webm -i a_stream.webm -c:v copy -c:a copy  movie-between_10th_and 20th_seconds.webm

这样可以得到最准确的结果。视频的时长为20.000秒,音频帧的时长为20.003秒,并具有960144个样本。与视频流不完全匹配,但是可以。只有144个样本剩余。最大的缺点是,每当我要剪切文件时,都必须发送3条命令来完成一个简单的工作,它会创建两个不必要的文件:a_stream.webm和v_stream.webm。而且select过滤器不适用于我尝试过的某些输入文件。它成功完成了该工作(?),但从未停止过编码过程,因此每次都必须关闭命令提示符。


在发布此问题之前,我已经阅读了该页面。该页面没有帮助我。如果输入的fps可变,我们可以简单地使用该方程来计算吗?我不这么认为。同样,我也不认为“ -ss”会给我准确的位置。我猜逐帧查找会更好。
destor 2015年

请注意,这-ss是精确到帧的(请参阅此处)。您实际上有可变fps输入吗?我的答案链接到邮件列表线程,其中提到使用select过滤器,您可以在其中指定帧号。你有尝试过吗?
slhck

我尝试对视频和音频流使用selectaselect过滤器。Select视频的帧精确度很高,但aselect样本的精度不高。实际上,它远非准确的。与使用简单的-ss -to参数相比,结果要差得多。因此,就目前而言,我结合使用select过滤器和-ss -to参数来实现最精确的切割。但这是一种gr脚的方法。请查看我的第一篇文章,我添加了一些命令行及其结果
destor 2015年

ffmpeg版本?
剑联2017年

您为什么要尝试减少帧数。如果需要那种准确性,那为什么不使用avidemux?也许您最初的问题是因为它选择了最接近的关键帧?
剑联2017年

Answers:


3

音频来自秒而不是帧,因此,如果要剪切视频,则必须像这样计算视频fps×20秒:23.97 fps的20秒= 479.4

切帧不准确,因为您无法在最后一秒钟获得完整的fps,因此音频将获得更多的秒,或者只有半秒或更多或更少!也许您应该使用秒而不是帧来获得准确的剪切,您告诉ffmpeg帮您完成。如果您再获得1帧,该如何将第250和750帧更改为第250和749帧?在那里使用负1总是得到您要求的帧数!


实际上音频来自样本,而不是秒...
Anubioz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.