LinuxでのFFmpeg活用術:動画処理と圧縮の実践ガイド

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

GUIを使わずに動画を処理する

2GBの生録画データをサーバーにアップロードしたものの、Webアプリケーションが100MB以下のファイルしか受け付けないという状況を想像してみてください。ファイルをダウンロードしてローカルで編集し、再アップロードすることもできますが、それでは時間と帯域幅の無駄です。また、GUIのない(ヘッドレス)Linuxサーバーでは、GUIベースのエディタはそもそも選択肢になりません。

FFmpegはこの問題を解決します。マルチメディア操作の業界標準ツールですが、そのコマンドラインインターフェースは初心者には難解に見えることがよくあります。しかし、その背後にあるロジックを理解すれば、複雑なワークフローを自動化できます。動画エディタで数分かかるタスクも、1つのコマンドで数秒のうちに完了します。

パイプラインを理解する

FFmpegは動画処理を組み立てラインのように扱います。そのフローは、入力 → デマルチクサ(Demuxer) → デコーダ → フィルタ → エンコーダ → マルチクサ(Muxer) → 出力という特定の流れに従います。

密封された箱を取り出し、中身を取り出し、加工して、新しい容器に詰め直すようなものだと考えてください。このツールを使いこなすには、主に3つの概念を知る必要があります。

  • コンテナ(Containers): .mp4や.mkvなどのファイル拡張子です。データを保持する「箱」の役割を果たします。
  • コーデック(Codecs): データを圧縮するための数学的アルゴリズム(例:H.264、H.265、VP9)です。これが箱の中にある実際のコンテンツです。
  • ビットレート(Bitrate): 1秒あたりのデータ処理速度です。ビットレートが高いほど品質は向上しますが、ファイルサイズも大幅に増加します。

標準的な構文

ほとんどのFFmpegコマンドは、以下の予測可能な構造を使用します。

ffmpeg [global_options] {[input_options] -i input_url} ... {[output_options] output_url}

実用的なシナリオとコマンド

開始する前に、ツールがインストールされているか確認してください。UbuntuやDebianを使用している場合は、標準のパッケージマネージャを使ってインストールできます。

sudo apt update && sudo apt install ffmpeg

1. フォーマット変換とファイルの確認

.movファイルをWebに適した.mp4に変換するのは、最も一般的な入門編です。次のコマンドを実行します。

ffmpeg -i input.mov output.mp4

解像度やフレームレートなどの技術仕様を知りたいだけの時もあります。出力先を指定せずに -i フラグを使用すると、メタデータを表示できます。

ffmpeg -i video.mp4 -hide_banner

-hide_banner フラグは便利です。ビルド情報の羅列を非表示にし、関心のあるファイルの詳細のみを表示します。

2. 再エンコードなしでのクリップの切り出し

動画の再エンコードには膨大なCPUサイクルを消費します。長い動画から10秒のセグメントを切り出すだけなら、「copy」コーデックを使用しましょう。ほぼ一瞬で完了します。

ffmpeg -i input.mp4 -ss 00:00:10 -to 00:00:20 -c copy output.mp4
  • -ss: 開始タイムスタンプを設定します。
  • -to: 終了タイムスタンプを設定します。
  • -c copy: ストリームを再処理せずに直接コピーします。これにより、5分間の待ち時間が0.5秒のタスクに変わります。

3. CRFによるファイルサイズの削減

ストレージは高価です。4GBのRAMを搭載した標準的なAWSのt3.mediumインスタンスで、Constant Rate Factor(CRF)を使用して、500MBの録画データを画質の劣化をほとんど感じさせることなく40MBまで縮小したことがあります。

CRFの範囲は0から51までです。数値が小さいほど高品質になります。ほとんどのWebプロジェクトでは、23または24が「スイートスポット(最適解)」です。

ffmpeg -i heavy_video.mp4 -vcodec libx264 -crf 24 -preset medium compressed_video.mp4

-preset フラグは圧縮にかける手間を決定します。「slow」プリセットはファイルサイズをより小さくしますが、時間がかかります。私の4GB RAMサーバーでは、「medium」が速度とディスク節約のバランスが最も良かったです。

4. 複数のクリップの結合

解像度とコーデックが同じであれば、複数の動画を結合できます。まず、files.txt リストを作成します。

file 'part1.mp4'
file 'part2.mp4'
file 'part3.mp4'

次に、concat デマルチクサを使用してそれらを繋ぎ合わせます。

ffmpeg -f concat -safe 0 -i files.txt -c copy final_video.mp4

5. 音声のみの抽出

ポッドキャストを作成している場合や、BGMを抽出したい場合は、動画ストリームを完全に破棄できます。これは専用のオーディオエディタを使うよりもはるかに高速です。

ffmpeg -i input.mp4 -vn -acodec copy output.m4a

-vn フラグはFFmpegにビデオを無視するよう指示します。copy を使用することで、元のオーディオ品質を完璧に維持できます。

スケーリングとリサイズ

4K動画を1080pにリサイズすることは、モバイルユーザーの帯域幅を節約する優れた方法です。これには scale フィルタを使用します。

ffmpeg -i input.mp4 -vf "scale=1920:-1" output.mp4

高さを -1 に設定するのは巧妙なトリックです。これにより、FFmpegはアスペクト比に基づいて高さを自動的に計算します。これにより、動画が引き伸ばされたり押しつぶされたりするのを防げます。

最後に

FFmpegは何千ものオプションを持つ巨大なツールですが、効果的に使うためにエキスパートである必要はありません。フォーマット変換、ストリームコピー、CRF圧縮をマスターするだけで、日常的なメディアタスクの大部分をカバーできます。真の力はコマンドラインにあります。これらのコマンドをシンプルなbashループでラップすれば、コーヒーを飲んでいる間に1,000個のファイルを処理できます。GUIツールではこの効率性には到底太刀打ちできません。

Share: