![使用 FFMPEG 和确切的帧数将视频文件分割成块](https://linux22.com/image/201638/%E4%BD%BF%E7%94%A8%20FFMPEG%20%E5%92%8C%E7%A1%AE%E5%88%87%E7%9A%84%E5%B8%A7%E6%95%B0%E5%B0%86%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E5%88%86%E5%89%B2%E6%88%90%E5%9D%97.png)
我试图根据固定的帧数(比如)将视频video.avi
(即N
帧总数)分割成连续的块M = 100
。具体来说,这个过程应该产生:
video_0.avi
:帧 0 至M-1
video_1.avi
: 帧M
到2M-1
video_2.avi
: 帧2M
到3M-1
- ...
重要的是每个块video_*.avi
都有精确的M
帧。因此,如果N
不能被 整除,则可以丢弃最后一个块M
。
我发现了相关问题(例如使用 ffmpeg 将视频文件分割成多个片段)但发现自己正在努力更换规范秒与帧数。
答案1
对于第一个块,您应该能够使用-vframes M-1
并且没问题(即使-c copy
我记得)。
其他块比较棘手,我没有成功:
-vf 'select=gte(n\,M)'
- 它无论如何都需要重新编码,但使用不同的编解码器会做奇怪的事情 - 例如,留下前面的持续时间与静止帧,并播放声音......
您可以通过将帧数除以 FPS 来获得以秒为单位的时间,例如,如果您的 FPS 是$fps
并且 M 是$M
:
ffmpeg -i video.avi -ss `echo "scale=6; $M / $fps" | bc` -to `echo "scale=6; (2 * $M) / $fps" | bc` video_01.avi
等等。如果您有脚本语言来计算这些时间,那就更容易了。另外,请注意,重新编码时(即没有-c copy
),-ss
并且-to
将是精确的,另请参阅:https://superuser.com/questions/459313/how-to-cut-at-exact-frames-using-ffmpeg