我目前正在使用 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_frames
ffmpeg。
答案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
)。