将视频文件切成几段

Cod*_*ent 11 video linux unix bash ffmpeg

我目前正在使用 ffmpeg 来切片视频文件。我通过一个名为 ffmpeg_split.sh 的脚本自动化了这个过程。虽然这很慢,但它可以有效地将视频拆分为等效的设置。唯一的问题是它有帧速率问题。下面的邪恶汤推荐了一种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

结果

my_split_script.sh

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

小智 14

您可以直接从 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
Run Code Online (Sandbox Code Playgroud)

您需要阅读-crf,-sc_threshold-force_key_frames。在ffmpeg的 wiki 中。

  • @Code_Ed_Student 这取决于您的申请。如果您的目标是从预计不会出现丢包或帧解码问题的媒体播放,请使用最多 10 秒的更大 GOP(例如,25fps 下的“-g 250”)。对于自适应流媒体(例如 DASH、HLS),片段可能只有一秒长,因此 GOP 大小将等于 FPS。但肯定不亚于 FPS,因为它效率低下。 (2认同)

evi*_*oup 13

ffmpeg实际上可以自己完成,使用段复用器

ffmpeg -i input.mp4 -c copy -map 0 -segment_time 8 -f segment output%03d.mp4
Run Code Online (Sandbox Code Playgroud)

您绝对应该阅读文档并进行一些尝试以获得最佳结果(默认值对于大多数用途已经足够了,但不会让您获得 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
Run Code Online (Sandbox Code Playgroud)

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