使用 FFMPEG 和确切的帧数将视频文件分割成块

使用 FFMPEG 和确切的帧数将视频文件分割成块

我试图根据固定的帧数(比如)将视频video.avi(即N帧总数)分割成连续的块M = 100。具体来说,这个过程应该产生:

  1. video_0.avi:帧 0 至M-1
  2. video_1.avi: 帧M2M-1
  3. video_2.avi: 帧2M3M-1
  4. ...

重要的是每个块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

相关内容