将视频文件切成几段

将视频文件切成几段

我目前正在使用 ffmpeg 来对视频文件进行切片。我通过一个名为 ffmpeg_split.sh 的脚本自动执行了该过程。虽然这很慢,但它可以有效地将视频分割成等效设置。唯一的问题是它存在帧速率问题。下面 evil soup 推荐了一种segment在 ffmpeg 中完成所有这些操作的方法。我试过了,但它没有给我等效的持续时间片段。

更新

根据 evilsoup 使用此命令来分割视频:

ffmpeg -i input.mp4 -c copy -map 0 -segment_time 8 -f segment output%03d.mp4

老的:

以下是使用脚本切片视频的语法:ffmpeg_split.sh -s test_vid.mp4 -o video-part%03d.mp4 -c 00:00:08

结果

我的拆分脚本

input.mp4 – Duration 00:01:20
#EXTINF:10,
Output01.mp4
#EXTINF:10,
Output02.mp4
#EXTINF:10,
Output03.mp4
#EXTINF:9,
Output04.mp4
#EXTINF:10,
Output05.mp4
#EXTINF:10,
Output06.mp4
#EXTINF:11,
Output07.mp4
#EXTINF:10,
Output08.mp4
real    0m30.517s #execution time

ffmpeg

input.mp4 – Duration 00:01:20
#EXTINF:10,
Output01.mp4
#EXTINF:10,
Output02.mp4
#EXTINF:6,
Output03.mp4
#EXTINF:10,
Output04.mp4
#EXTINF:10,
Output05.mp4
#EXTINF:7,
Output06.mp4
#EXTINF:10,
Output07.mp4
#EXTINF:9,
Output08.mp4
real    0m7.493s #executition time

答案1

您可以直接从 ffmpeg 执行此操作,而无需使用脚本。基本上,只要您使用ffmpeg segment,它就会继续并尽力将每个片段分割到您指定的时间附近。这是因为key_frames它会找到最接近的关键帧并在那里剪切。为了剪切精确的片段,您需要重新编码整个视频。

ffmpeg -i input.mp4 -c:v libx264 -crf 22 -map 0 -segment_time 9 -g 9 -sc_threshold 0 -force_key_frames "expr:gte(t,n_forced*9)" -f segment output%03d.mp4

您需要阅读和-crf。在 wiki 中-sc_threshold-force_key_framesffmpeg

答案2

ffmpeg实际上可以自己做到这一点,使用段复用器

ffmpeg -i input.mp4 -c copy -map 0 -segment_time 8 -f segment output%03d.mp4

您一定要阅读文档并稍微尝试一下以获得最佳结果(默认值对于大多数目的来说已经足够好了,但不会让您获得 100% 准确的分割)。


一般来说,如果您需要从文件中获取诸如持续时间之类的信息,最好使用ffprobe与之捆绑在一起的ffmpeg- 它将信息打印为一key=value对,使其更容易处理。

ffprobe -show_format file.mp4 | grep -F duration | cut -d= -f2
## or, if you want hh:mm:ss format:
ffprobe -show_format -sexagesimal file.mp4 | grep -F duration | cut -d= -f2

...但我认为最好依赖ffmpeg自己的选项,而不是 shell 脚本(效率会低得多,因为它需要调用许多实例ffmpeg)。

相关内容