如何使用命令行工具将视频剪切成统一的部分

如何使用命令行工具将视频剪切成统一的部分

我想使用命令行工具根据特定间隔(例如 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)。

相关内容