1. 概要

このチュートリアルでは、Linuxコマンドラインを使用してビデオをカットする方法を見ていきます。 ビデオ操作用に提供されているツールスイートであるFFmpegを使用してビデオをクリッピングするためのいくつかのアプローチについて説明します。

2. 最新バージョンのインストール

FFmpeg の新しいバージョンは、より多くのオプションとフィルターをサポートしています。 そのため、FFmpegの最新バージョンが必要になります。 ffmpeg パッケージは、ほとんどのディストリビューションのパッケージリポジトリで利用できます。 yumまたはaptを使用してFFmpegをインストールできます。

さらに、Snapを使用して最新バージョンのFFmpegをインストールすることもできます。

$ sudo snap install ffmpeg

FFmpegがインストールされると、次のコマンドで確認できます。

$ ffmpeg -version
ffmpeg version n4.4 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 11.1.0 (GCC)

3. 再エンコードによるクリッピング

基本的に、ビデオエンコーディングは、出力用にビデオを圧縮して準備するプロセスであり、したがって、ビデオサイズを適度に小さくして処理を高速化します。 FFmpegを使用すると、ビデオの一部を切り取り、その部分を再エンコードして、最後にファイルとして保存できます。 デフォルトでは、再エンコードは元のビデオで使用されているコーデックを使用します。 実際の動作を見てみましょう。

$ ffmpeg -i my_video.mp4 -ss 00:00:15 -t 00:00:10 -async -1 clip.mp4
frame= 250 fps= 19 q=-1.0 Lsize= 5297kB time=00:00:09.98 bitrate=4346.5kbits/s speed=0.767x
video:5132kB audio:157kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.167893%

ここで、ここで使用した各オプションと引数を確認しましょう。

  • -i 引数は、入力ファイルを指定するために使用されます。
  • -ss 引数は、引数として指定されたタイムスタンプをシークします。
  • -t 引数は、クリップの長さを指定するために使用されます。 この場合、10秒です。
  • -async オプションは、タイムスタンプに一致するようにオーディオを縮小するか拡大するかを指定します。 値1は、後で修正することなく、ストリームの開始を修正します。

上記のコマンドは、 my_video.mp4 入力ファイルを処理し、ビデオの15秒先をシークします。 次に、ビデオを 00:00:15から00:00:25にカットします。 -t の値が、求められるタイムスタンプ(15秒)に追加されます。 最後に、タイムスタンプに一致するように音声補正を実行し、ビデオを元のmy_video.mp4コーデックで再エンコードします。

または、より正確なカットが必要な場合は、クリップされたビデオの開始と終了にキーフレームを手動で追加できます

$ ffmpeg -i my_video.mp4 -force_key_frames 00:00:15,00:00:25 clip.mp4

ビデオクリッピングはキーフレームで発生するため、-force_key_framesオプションを使用しました。 ただし、最初のフレームがキーフレームでない場合、クリップの最初のキーフレームより前のフレームは再生できません。 したがって、完全なクリップを確実にエンコードするために、FFmpegに最初と最後のフレームにキーフレームを追加するように強制しました。 さらに、エラーを制限するために、多くのキーフレームを追加することは避けてください。

使用するコーデックのサイズとタイプによっては、再エンコードに時間がかかることに注意してください。 ただし、次のセクションで説明する代替案があります。

4. ストリームコピーを介して即座にクリッピング

場合によっては、ビデオを再エンコードしたくない場合があります。 幸い、FFmpegを使用すると、コーデックを元のビデオからトリミングされたビデオにコピーできます。これには数秒しかかかりません。

ビデオには2つのコーデックが含まれる場合があります。1つはビデオトラック用で、もう1つはオーディオトラック用です。 両方のコーデックをカットクリップにコピーする必要がある場合は、-cオプションを使用するだけです。

$ ffmpeg -i my_video.mp4 -ss 00:00:15 -to 00:00:25 -c copy clip.mp4
frame= 247 fps=0.0 q=-1.0 Lsize= 3455kB time=00:00:09.98 bitrate=2835.6kbits/s speed= 745x
video:3279kB audio:167kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.263277%

コマンドで使用したオプションを確認してみましょう。

  • -to オプションは、クリップの終わりを指定します。 つまり、ビデオは00:00:15から00:00:25にカットされます。
  • -c オプションは、オーディオコーデックとビデオコーデックの両方をmy_video.mp4コンテナからclip.mp4コンテナにコピーするようにFFmpegに指示します。

上記のコマンドは、入力ビデオと出力ビデオの両方に同じコンテナーを使用している場合に適切に機能します。 別のコンテナを使用している場合は、コンテナの不一致エラーが表示されます。 幸いなことに、回避策があります。 2つの異なるコンテナがある場合、コピーオプションを個別に指定できます。

$ ffmpeg -i my_video.mkv -ss 00:00:15 -to 00:00:25 -acodec copy -vcodec copy clip.mp4

入力ファイルはMKVコンテナを使用しているのに対し、出力ファイルはMP4コンテナを使用していることに注意してください。

5. トリムフィルターを使用したクリッピング

これは、カットされたビデオも再エンコードする最初の方法の代替手段です。 短いビデオ(できれば1分未満)があり、その一部を切り取りたい場合に便利です

$ ffmpeg -i my_video -vf trim=10:25,setpts=PTS-STARTPTS clip.mp4

上記のコマンドのオプションを詳しく見てみましょう。

  • vf オプションは、ビデオフィルターを使用していることを指定します。
  • Trimフィルターに値10:25を指定しました。これにより、ビデオが 00:00:10から00:00:25にスライスされます。
  • setpts フィルターは、クリップ内の各ビデオフレームのプレゼンテーションタイムスタンプを設定します。 この例では、値を PTS-STARTPTS に設定して、クリップが開始時に遅延または停止しないようにし、フレームがsetpts値に対して同期されるようにします。 、これは0です。

6. 結論

このチュートリアルでは、タイムスタンプの提供に基づいてビデオの一部を切り取る方法を説明しました。 さまざまな状況で利用できる3つの異なる方法を検討しました。