我收藏了大量我所在的足球队每个赛季的比赛录像,我指定每个队友观看一场比赛,并记下精彩场面出现的时间间隔。
现在,我不再需要手动完成所有这些操作,而是想编写一个脚本来帮我完成这些操作。我熟悉 shell 脚本、python 和 ruby。
你们当中有谁知道有什么好的视频编辑工具可以帮助自动完成这项任务吗?我希望能够将间隔放在一个简单的输入文件中,以便我的队友可以使用。
答案1
为此你需要 FFmpeg(下载静态构建)和 Bash。
创建类似 CSV 的输入和输出点列表,例如:
00:01:00,00:02:00
00:03:00,00:03:02
…
然后,您可以运行以下 Bash 脚本将视频剪切成各个部分:
#!/usr/bin/env bash
if [[ $# -ne 2 ]]; then
echo "Usage: $0 <input> <editList>"
exit 1
fi
inputFile=$1
editFile=$2
inputFileBase="${inputFile%.*}"
extension="${inputFile##*.}"
cnt=0
while IFS=, read -r start end; do
suffix="$(printf "%05d" $cnt)"
outfile="${inputFileBase}-${suffix}.${extension}"
ffmpeg -nostdin -ss "$start" -i "$inputFile" -to "$end" -c copy -map 0 "$outfile"
cnt=$((cnt+1))
done < "$editFile"
将此文件另存为cut.sh
(或类似文件),然后运行:
chmod +x cut.sh
./cut.sh /path/to/input.mp4 /path/to/editList.csv
它会将视频和音频比特流复制到输出文件中,并按后缀按顺序编号00001
,00002
依此类推。
以下是旧答案……
我曾经写过一个 Ruby 脚本,它就是用来做这个的。你需要 Ruby ≥1.9.2(例如通过右心室)和最新版本的FFmpeg已安装(见这里如何从源代码安装)。
我的脚本可以在这里找到:
video-extract.rb
您需要向其提供一个 CSV 输入编辑列表,最重要的是包含以下列:
- 前缀(可以为空)
- 视频 ID(某个序列号)
- 输入文件名
- 在点
HH:MM:SS.ms
或秒 - 编辑的长度(以秒为
HH:MM:SS.ms
单位)
例如(请注意,该Out
列未使用):
- 然后,调整脚本头中的变量。最重要的是,如果您想要比特流副本并且不重新编码,请更改
COPY
为。还要更改 CSV 列的索引和 CSV 分隔符。true
欢迎随时改进脚本或提出修改建议(特别是如果您已经了解 Ruby)。我经常使用此脚本,但尚未遇到问题。唯一缺少的是适当的音频支持 - 它只会复制音频流,这可能适用于您,也可能不适用。如果遇到问题,请报告。
如果你需要计算入点和出点之间的差异,你可以用这个小 Ruby 脚本来计算,基于此 Stack Overflow 问答:
require "Time"
def time_diff(time1_str, time2_str)
t = Time.at( Time.parse(time2_str) - Time.parse(time1_str) )
(t - t.gmt_offset).strftime("%H:%M:%S.%L")
end
ins, outs, diffs = File.open("ins.txt"), File.open("outs.txt"), File.new("diffs.txt", "w")
inlines, outlines = [], []
ins.each { |l| inlines << l }
outs.each { |l| outlines << l }
inlines.zip(outlines).each { |ins, outs| diffs.puts time_diff(ins, outs) }
diffs.close
您只需创建一个名为ins.txt
和的文件,outs.txt
其中每行对应一个入点和出点(见上面的屏幕截图)。差异将写入diffs.txt
。就这么简单。
答案2
MEncoder 是你的好朋友。它是编写视频操作脚本的绝佳工具。我经常使用它从单个帧创建视频文件。
我发现这个 Perl 脚本可能正好可以满足你的要求:Video Cutter V2:使用 Mencoder 剪切视频
答案3
尝试ffmpeg。
例如:
ffmpeg -i original.mpg -ss 20 -t 30 newmovie.mpg
将打开原始视频文件 ( -i original.mpg
),跳过前 20 秒 ( -ss 20
),然后将 30 秒 ( -t 30
) 保存到名为newmovie.mpg