View on GitHub

北川映像 HP

FFmpeg チートシート

よく使うコマンドや Tips などを始めとした豆知識などをまとめるページ
随時更新

基本的な使い方

単純に異なる拡張子(コンテナ形式)に変換する場合は、変換元のファイル input.mkv と変換後のファイル output.mp4 を以下の通りに指定して実行するだけで OK です。

$ ffmpeg -i input.mkv -c copy output.mp4

OBS で Matroska Video 形式(.mkv)で録画した動画を MP4 形式に変換(最多重化)する場合などに便利です。
-c copy オプションは、変換元のファイルの映像・音声ストリームを再エンコードせずにそのままコピーすることを指定しています。

もう少し複雑な変換を行う場合は、以下のようにオプションを追加していきます。

ffmpeg -hwaccel cuda -i input.mp4 -s 1920x1080 -c:v h264_nvenc -preset slow -b:v 20M -c:a libopus -ar 48000 -b:a 160k output.mp4

やってること別に分けると以下の通り。

ffmpeg \
 -hwaccel cuda \   # CUDA を使用してハードウェアアクセラレーションを有効化
 -i input.mp4 \    # 入力ファイルの指定
 -s 1920x1080 \    # 出力解像度の指定
 -c:v h264_nvenc \ # NVIDIA GPU を使用して映像を H.264 形式でエンコード
 -preset slow \    # エンコードプリセットの指定(品質と速度のバランスを調整)
 -b:v 20M \        # 映像のビットレートを 20Mbps に指定
 -c:a libopus \    # 音声を Opus 形式でエンコード
 -ar 48000 \       # 音声のサンプリングレートを 44.1kHz に指定
 -b:a 160k \       # 音声のビットレートを 160kbps に指定
 output.mp4        # 出力ファイルの指定

映像データの変換

映像エンコーダの指定

データ容量の圧縮などのために、映像データを再エンコードする場合は、以下のように -c:v オプションを追加して映像エンコーダを指定します。
-c オプションがエンコーダを指定するためのもので、 :v を付けることで映像ストリームに対してエンコーダを指定することを意味します。

$ ffmpeg -i input.mp4 -c:v libx264 output.mp4

ここでは libx264 を指定しています。これは H.264 形式の映像エンコーダを使用し、CPU で処理することを意味します。エンコード処理に CPU を使用するため低速ではあるものの、実行環境を問わないというメリットがあります。
GPU を使用して高速化する場合、搭載している GPU に合わせたエンコーダを指定する必要があります。

GPU ベンダ パラメータ
NVIDIA h264_nvenc
Intel h264_qsv
AMD h264_amf

コーデック自体にも種類がいくつかありますが、基本的に H.264 を使用しましょう。特別な理由がある場合は、それに合わせたものを選択してください。

コーデック アクセラレータ パラメータ
H.264 AVC CPU libx264
H.264 AVC NVIDIA GPU h264_nvenc
H.264 AVC Intel GPU h264_qsv
H.264 AVC AMD GPU h264_amf
VP9 CPU(リファレンス実装) libvpx-vp9
AOMedia Video 1 (AV1) CPU(リファレンス実装) libaom-av1
AOMedia Video 1 (AV1) CPU(OSS 実装) libsvtav1
AOMedia Video 1 (AV1) NVIDIA GPU av1_nvenc
AOMedia Video 1 (AV1) Intel GPU av1_qsv

H.265 HEVC は、H.264 AVC よりも高い圧縮率を実現できる次世代の映像コーデックとして開発されたものですが、互換性に問題があり、権利関係も複雑なため、あまりおすすめしません。特別な理由がある場合を除いては、H.264 を使用することをおすすめします。

ビットレートの指定

-b オプションを使用してビットレートを指定することができます。映像ストリームに対してビットレートを指定するため、エンコーダと同様に :v を付加し、 -b:v とします。
10Mbps のビットレートを指定する場合は -b:v 10M のようにします。数字が大きいほどファイルサイズが大きい代わりに低圧縮高品質、数字が小さいほどファイルサイズが小さい代わりに高圧縮低品質になります。

例:NVIDIA GPU を使用して目標ビットレート 20Mbps でエンコードする場合

$ ffmpeg -i input.mp4 -c:v h264_nvenc -b:v 20M output.mp4

NVIDIA NVEnc は NVIDIA の GPU に搭載されているハードウェアエンコーダで、非常に高速にエンコード処理を実行できる優秀なアクセラレータです。
Intel QSV は Intel の GPU に搭載されているハードウェアエンコーダで、こちらも高速にエンコード処理を実行できます。CPU 内蔵の iGPU である Intel UHD Graphics や Intel Iris Graphics 等でも使用できるため、Intel CPU 搭載の PC であれば広く使用できるアクセラレータです。出力の品質が高いことで知られています。
AMD は使ったことないので知りません。

音声データの変換

音声データを再エンコードする場合は、以下のように -c:a オプションを追加して音声エンコーダを指定します。:a を付けることで音声ストリームに対してエンコーダを指定することを意味します。
音声に関しても複数のコーデックが存在し、そのほとんどに FFmpeg も対応しています。以下に、よく使われるものをいくつか挙げます。

コーデック パラメータ
16bit PCM pcm_s16le
24bit PCM pcm_s24le
32bit-float pcm_f32le
Advanced Audio Coding (AAC) aac
Apple Lossless Audio Codec (ALAC) alac
Free Lossless Audio Codec (FLAC) flac
MP3 mp3
Opus libopus

例:NVIDIA GPU を使用して目標ビットレート 20Mbps で映像をエンコードし、AAC 形式で音声をエンコードする場合

$ ffmpeg -i input.mp4 -c:v libx264 -b:v 20M -c:a aac output.mp4