編集リストに基づいてビデオをカットするスクリプト

編集リストに基づいてビデオをカットするスクリプト

私はサッカーチームのシーズンの試合映像をたくさん持っており、チームメイトそれぞれに 1 試合ずつ観戦して、ハイライトの時間帯を書き留めるように割り当てています。

これらすべてを手動でカットする代わりに、これを自動的に実行するスクリプトを作成したいと思います。私はシェル スクリプト、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

ビデオおよびオーディオのビットストリームを出力ファイルにコピーし、接尾辞などの連番を付けます0000100002


以下に古い回答があります…

私はかつて、まさにそれを実行するRubyスクリプトを書きました。Ruby 1.9.2以上が必要です(例えばRVM)と最新バージョンのFFmpegインストール済み(参照ここソースからインストールする方法については、こちらを参照してください。

  1. 私のスクリプトはここから入手できます:video-extract.rb

  2. 編集内容の CSV 入力リストを入力する必要があります。最も重要なのは、次の列が含まれていることです。

  • プレフィックス(空でも可)
  • ビデオID(連続した番号)
  • 入力ファイル名
  • インポイントHH:MM:SS.ms(秒)
  • 編集の長さHH:MM:SS.ms(単位:秒)

たとえば、Out列は未使用であることに注意してください。

  1. 次に、スクリプト ヘッダーの変数を調整します。最も重要なのは、ビットストリームのコピーが必要で再エンコードしない場合はCOPYに変更することです。また、CSV 列のインデックスと CSV セパレーターも変更します。true

スクリプトを改良したり、変更を提案したりしてください (特に、すでに Ruby を知っている場合)。私はこのスクリプトを頻繁に使用していますが、まだ問題は発生していません。唯一欠けているのは適切なオーディオ サポートです。オーディオ ストリームをコピーするだけなので、お使いの環境では機能しない可能性があります。問題が発生した場合は、報告してください。

インポイントとアウトポイントの差を計算する必要がある場合は、次の小さなRubyスクリプトで計算できます。このStack OverflowのQ&A:

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.txtouts.txt各行はインポイントとアウトポイントに対応します (上のスクリーンショットを参照)。違いは に書き込まれますdiffs.txt。とても簡単です。

答え2

MEncoder はここで役に立ちます。ビデオの操作をスクリプト化するのに最適なツールです。私は個々のフレームからビデオ ファイルを作成するためにこれをよく使用します。

まさにあなたが望んでいることを実現するかもしれない次の Perl スクリプトを見つけました:ビデオカッター 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

関連情報