我很难找到一个 cli 应用程序,它可以获取视频文件(最好是 avi、mkv 和 mp4)并以精确的时间精度剪切非常短的剪辑(2-6 秒)。我试过ffmpeg、mencoder、avidemux和mp4box但它们都在关键帧上剪切,从而创建了 6 秒以上的剪辑。有没有什么工具可以把输入文件重新编码后切准确时间或切不准确,重新编码再准确切?
不是使用-ss
和-to
寻找看起来不太准确的参数,我可以根据给定的帧数剪切视频吗?例如;
ffmpeg -i video.webm -startingframe 80 -endingframe 560 output.webm
Run Code Online (Sandbox Code Playgroud)
[包括第 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
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,输出正好是 20 秒。
对音频使用相同的方法:
ffmpeg -i movie.mp4 -vn -af "aselect=between(n\,480\,1440),setpts=PTS-STARTPTS" a_stream.webm
Run Code Online (Sandbox Code Playgroud)
出乎意料的是,这个精度很差。它应该给了我 960001 (960k+1) 个等于 20 秒音频的样本。但是,输出的长度为 20.505 秒,并且有 984240 个样本。此外,如果我增加持续时间,错误也会增加。
然后我尝试使用 -ss -to 参数来切割音频流:
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm
Run Code Online (Sandbox Code Playgroud)
旧的经典方式效果更好。输出长度为 20.003 …