web-dev-qa-db-ja.com

複数のMP4ファイルから最初と最後をまとめて削除する

の最初の20秒と最後の30秒を削除する必要がある100本の動画がいくつかあります。

明らかに、これを一度に1つずつ実行するのは実用的ではありません。どういうわけか、OS X Automatorスクリプトでこれを自動化できますか?

3
bumble_bee_tuna

* nixとBashを実行していると仮定すると、オペレーティングシステムに対して ffmpeg静的ビルドをダウンロード 。次に、ffmpegファイルを取得して/usr/bin/ffmpegにコピーします。

Sudo cp ~/Downloads/ffmpeg/ffmpeg /usr/bin/ffmpeg
Sudo chmod +x /usr/bin/ffmpeg

これで、このシェルスクリプトをBashで実行できます—ビデオがあるフォルダーにコピーアンドペーストするのに十分なはずです。

for f in *.mp4; do
    duration=$(ffmpeg -i "$f" 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,//)
    length=$(echo "$duration" | awk '{ split($1, A, ":"); print 3600*A[1] + 60*A[2] + A[3] }' )
    trim_start=20
    trim_end=$(echo "$length" - 30 - "$trim_start" | bc)
    echo ffmpeg -ss "$trim_start" -i "$f" -c copy -map 0 -t "$trim_end" "${f%.mp4}-trimmed.mp4"
done

注:echoステートメントを削除して、実際にコマンドを実行します。生成されたコマンドの精度を最初にテストすることをお勧めします。これにより、次のようなものが生成されます。

ffmpeg -ss 20 -i input.mp4 -c copy -map 0 -t 161.58 input-trimmed.mp4

スクリプトが行うことは、入力の合計実行時間を計算し、開始時間と終了から削除する時間を差し引いて、指定された開始時間から新しく計算された終了までストリームコピーを実行するようにffmpegに指示することです。時間。これにより、ビデオとオーディオの品質が損なわれることはありません。大きなファイルの場合でも、数秒以内に実行されるはずです。

明確にするために、-ssは開始時間を設定し、-c copy -map 0はすべてのビデオ、オーディオ、字幕ストリームをオリジナルからカットバージョンにコピーします。 -tは終了時間を設定します。シークの詳細については、 FFmpeg Wikiのこの記事 を参照してください。

4
slhck

コマンドラインに慣れている場合は、 FFmpeg をお勧めします

ffmpeg -i file.mp4 -vcodec copy -acodec copy -ss 00:00:20.000 -t 00:00:30.000 output.mp4

もう1つのオプションは、ファイルをループして、ファイルごとに1ファイルのFFmpegジョブを実行する小さなシェルスクリプトです。繰り返しになりますが、私はMacシェルを使用したことはありません:)

for f in *.mp4; do ffmpeg -i $f -vcodec copy -acodec copy -ss 00:00:20.000 -t 00:00:30.000 output/$f; done

これが少し役立つことを願っています。

0
oli.G