我可以使用给定的帧号剪切视频,而不是使用-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
过滤器不适用于我尝试过的某些输入文件。它成功完成了该工作(?),但从未停止过编码过程,因此每次都必须关闭命令提示符。
select
和aselect
过滤器。Select
视频的帧精确度很高,但aselect
样本的精度不高。实际上,它远非准确的。与使用简单的-ss
-to
参数相比,结果要差得多。因此,就目前而言,我结合使用select
过滤器和-ss
-to
参数来实现最精确的切割。但这是一种gr脚的方法。请查看我的第一篇文章,我添加了一些命令行及其结果