我想使用命令行工具根据特定间隔(例如 1 秒)剪切视频。如果我有一个 60 秒的视频,我希望将其分成 60 个均匀的部分。我唯一的其他要求是无需重新编码。
我已阅读过有关该主题的两个问题。
第 1 个帖子建议使用一种似乎不再维护的不受信任的工具。第 2 个帖子建议avconv
使用手动名称来处理大段视频。由于我将把这些视频分割成数百个较小的部分,这种方法太繁琐了。一位用户提供了一个 Bash 脚本,但他承认这可能会“产生许多错误和空文件”。为了清晰起见,我将在此重新发布此脚本,并鼓励提出更好的解决方案:
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
FILES=$(ls *.mp4|sort)
let START=0
for FILE in $FILES
do
echo Processing $FILE
mkdir "${FILE}-chop"
for COUNT in {1..59}
do
exec avconv -i "${FILE}" -ss $START -t 60 -c:v copy -c:a copy "./${FILE}-chop/${COUNT} - ${FILE}"
let START=$START+60
done
done
IFS=$SAVEIFS
像这样的 Bash 脚本真的是正确的方法吗?或者是否有更简单、更高效、更可靠的工具可用于此目的?
答案1
使用段复用器在ffmpeg
:
ffmpeg -i input -map 0 -f segment -segment_time 60 -reset_timestamps 1 -c copy output_%03d.mp4
使用-c copy
启用流复制模式。片段复用器将在流复制时剪切关键帧,因此片段的时长可能不是 60 秒。如果您需要每个片段正好 60 秒,则需要通过移除-c copy
并设置适当的 GOP 大小来重新编码以适合您的片段时间限制。例如,25 帧速率输出的一秒 GOP -g 25
(默认值为 250)。