FFmpeg

提供: ArchWiki
2023年7月23日 (日) 22:30時点におけるAshMyzk (トーク | 投稿記録)による版 (→‎スクリーンキャプチャ: リンクを修正)
ナビゲーションに移動 検索に移動

関連記事

プロジェクトのホームページ より:

FFmpeg は、音声と動画を記録、変換、そしてストリーミングするための完全でクロスプラットフォームなソリューションです。先進的な音声・動画コーデックライブラリである libavcodec が含まれています。

インストール

ノート: libavavconv など FFmpeg のフォークも存在しています。FFmpeg の現在の状態やプロジェクトの違いについては The FFmpeg/Libav situation を読んでください。

ffmpeg パッケージをインストールしてください。

開発版は ffmpeg-gitAUR パッケージでインストールできます。可能な限り多くのオプション機能を有効化してビルドする ffmpeg-fullAUR も存在します。

エンコードの例

ノート:
  • パラメータを正しい順序で指定することが重要です (例: input、video、filters、audio、output)。順序を間違うと、パラメータがスキップされたり、FFmpeg が実行されなかったりする場合があります。
  • FFmpeg は、使用できる CPU スレッド数を自動的に選択するはずです。しかし、パラメータ -threads number を使って、使用できるスレッド数を強制したほうが良い場合もあります。

FFmpeg のエンコード wikiffmpeg(1) § EXAMPLES を参照してください。

スクリーンキャプチャ

FFmpeg には x11grabALSA の仮想デバイスが含まれており、ユーザのディスプレイ全体と音声入力をキャプチャすることができます。

スクリーンショットを撮って screen.png に保存するには:

$ ffmpeg -f x11grab -video_size 1920x1080 -i $DISPLAY -vframes 1 screen.png

ここで、-video_size はキャプチャする領域のサイズを指定します。

ロスレスエンコードで音声なしのスクリーンキャストを撮って screen.mkv に保存するには:

$ ffmpeg -f x11grab -video_size 1920x1080 -framerate 25 -i $DISPLAY -c:v ffvhuff screen.mkv

ここでは、Huffyuv コーデックが使用されます。このコーデックは高速ですが、ファイルサイズが大きくなります。

ロッシーエンコードで音声ありのスクリーンキャストを撮って screen.mp4 に保存するには:

$ ffmpeg -f x11grab -video_size 1920x1080 -framerate 25 -i $DISPLAY -f alsa -i default -c:v libx264 -preset ultrafast -c:a aac screen.mp4

ここでは、x264 コーデックが最も高速なオプションで使用されます。他のコーデックを使用することもできます。(ディスクのパフォーマンスが十分でなかったり、エンコードが遅かったりで) 各フレームの書き込みが遅すぎる場合、フレームがドロップされ、動画出力がカクカクになります。

動画ストリームをファイルとして保存する必要はないが、画面共有のために仮想ウェブカメラとして使う場合、v4l2loopback#FFmpeg を使って X11 をキャストする を参照してください。

公式のドキュメントも参照してください。

ウェブカメラの録画

FFmpeg には video4linux2ALSA の入力デバイスが含まれています。これらにより、ウェブカメラと音声入力をキャプチャすることができます。

以下のコマンドは、ウェブカメラから音声無しで動画を録画し webcam.mp4 に保存します。ウェブカメラが /dev/video0 として正しく認識されていると仮定します:

$ ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -c:v libx264 -preset ultrafast webcam.mp4

ここで、-video_size は、ウェブカメラからの許可されるイメージサイズの最大値を指定します。

上記のコマンドは無音動画を出力します。音声ありでウェブカメラから動画を録画し webcam.mp4 に保存するには:

$ ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -f alsa -i default -c:v libx264 -preset ultrafast -c:a aac webcam.mp4

ここでは、x264 コーデックが最も高速なオプションで使用されます。他のコーデックを使用することもできます。(ディスクのパフォーマンスが十分でなかったり、エンコードが遅かったりで) 各フレームの書き込みが遅すぎる場合、フレームがドロップされ、動画出力がカクカクになります。

公式のドキュメントも参照してください。

VOB から他のコンテナに

VOB ファイルを一つのストリームに連結して MPEG-2 にするには:

$ cat f0.VOB f1.VOB f2.VOB | ffmpeg -i - out.mp2

x264

ロスレス

ultrafast プリセットは最速のエンコードをするので素早い録画をしたいときに有用です (スクリーンキャストなど):

$ ffmpeg -i input -c:v libx264 -preset ultrafast -qp 0 -c:a copy output

ultrafast プリセットの反対は veryslow で、ultrafast よりもエンコードが遅いかわりに出力するファイルのサイズが小さくなります:

$ ffmpeg -i input -c:v libx264 -preset veryslow -qp 0 -c:a copy output

どちらでも出力のクオリティは同じです。

ヒント: あなたの使っているコンピュータがリアルタイムで -preset superfast を処理できる場合、-preset ultrafast ではなく -preset superfast を使用してください。Ultrafast は superfast よりも圧縮率がかなり落ちます。

Constant rate factor

出力する品質を指定したいときに使います。一般的に使われているのは最高の -crf 値で、これでも許容範囲内の画質になります。値が低いほど画質は高くなります。0はロスレス、18は見た目がロスレス、そして23がデフォルトの値です。賢明な値は18から28の範囲になります。一番遅い -preset を使うなら辛抱する必要があります。詳しくは x264 Encoding Guide を見て下さい。

$ ffmpeg -i video -c:v libx264 -tune film -preset slow -crf 22 -x264opts fast_pskip=0 -c:a libmp3lame -aq 4 output.mkv

-tune オプションを使うことでエンコードされるメディアの中身とタイプにあった設定にすることができます

ツーパス (超高品質)

マルチパスの始めは動画の統計が記録されるため、音声が無効化されます:

$ ffmpeg -i video.VOB -an -vcodec libx264 -pass 1 -preset veryslow \
-threads 0 -b:v 3000k -x264opts frameref=15:fast_pskip=0 -f rawvideo -y /dev/null

コンテナの形式は出力ファイルの拡張子 (.mkv) から自動的に検出して変換されます:

$ ffmpeg -i video.VOB -acodec aac -b:a 256k -ar 96000 -vcodec libx264 \
-pass 2 -preset veryslow -threads 0 -b:v 3000k -x264opts frameref=15:fast_pskip=0 video.mkv

動画の手ブレ補正

vbid.stab プラグインを使ってツーパスで手ブレ補正 (ビデオ安定化) を行います。

ファーストパス

ファーストパスでは補正パラメータを記録してファイルに書き出します、または視覚分析のテスト動画を作成します。

  • 補正パラメータを記録してファイルだけに書き出す:
    $ ffmpeg -i input -vf vidstabdetect=stepsize=4:mincontrast=0:result=transforms.trf -f null -
  • 補正パラメータをファイルに書きだして、視覚分析用のテストビデオ "output-stab" を作成:
    $ ffmpeg -i input -vf vidstabdetect=stepsize=4:mincontrast=0:result=transforms.trf output-stab
セカンドパス

セカンドパスではファーストパスで作成した補正パラメータを解析して、それを使って "output-stab_final" を生成します。セカンドパスで他のフィルターを適用することもでき、変換を繰り返す必要をなくして画質を最大限保つことができます。下のコマンドでは以下のオプションを使っています:

  • unsharp: vid.stab の作者によって推奨されています。下の例ではデフォルトの 5:5:1.0:5:5:1.0 を使っています。
  • ヒント: fade=t=in:st=0:d=4
    : 4秒間のフェードインをファイルの冒頭に挟みます。
  • ヒント: fade=t=out:st=60:d=4
    : 動画の60秒目から4秒間のフェードアウトを挟みます。
  • -c:a pcm_s16le: XAVC-S コーデックは pcm_s16be で記録されロスレスの pcm_s16le に変換されます。
$  ffmpeg -i input -vf vidstabtransform=smoothing=30:interpol=bicubic:input=transforms.trf,unsharp,fade=t=in:st=0:d=4,fade=t=out:st=60:d=4 -c:v libx264 -tune film -preset veryslow -crf 8 -x264opts fast_pskip=0 -c:a pcm_s16le output-stab_final

x265

以下の例は、パラメータを指定せずに libx265 を呼び出した場合のデフォルトを示します (Constant Rate Factor エンコード):

ffmpeg -i input -c:v libx265 -crf 28 -preset medium -c:a libvorbis output.mp4

詳細は FFmpeg の H.265/HEVC Video Encoding Guide を参照してください。

シングルパス MPEG-2 (ニアロスレス)

DVD 標準のパラメータに FFmpeg を自動的に設定することができます。約 30 FPS の DVD MPEG-2 にエンコードするには:

$ ffmpeg -i video.VOB -target ntsc-dvd output.mpg

約 24 FPS の DVD MPEG-2 にエンコードするには:

$ ffmpeg -i video.VOB -target film-dvd output.mpg

字幕

抽出

MPEG-2 や Matroska などのコンテナファイルに埋め込まれた字幕を抽出して、SRT や SSA、WebVTT などの字幕形式に変換することができます。[1]

  • ファイルに字幕ストリームが含まれているか確認してください:
$ ffprobe -hide_banner foo.mkv
...
Stream #0:0(und): Video: h264 (High), yuv420p, 1920x800 [SAR 1:1 DAR 12:5], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
  Metadata:
  CREATION_TIME   : 2012-06-05 05:04:15
  LANGUAGE        : und
Stream #0:1(und): Audio: aac, 44100 Hz, stereo, fltp (default)
 Metadata:
 CREATION_TIME   : 2012-06-05 05:10:34
 LANGUAGE        : und
 HANDLER_NAME    : GPAC ISO Audio Handler
Stream #0:2: Subtitle: ssa (default)
  • foo.mkv には SSA の字幕が埋め込まれており、別のファイルに抽出することが可能です:
$ ffmpeg -i foo.mkv foo.ssa

字幕を望ましい形式 (例として SubRip) に保存するには -c:s srt を追加してください:

$ ffmpeg -i foo.mkv -c:s srt foo.srt

複数の字幕が存在する場合、-map key:stream パラメータを使用して抽出するストリームを指定する必要があります:

$ ffmpeg -i foo.mkv -map 0:2 foo.ssa

ハードサブ

(FFmpeg wiki の記事の HowToBurnSubtitlesIntoVideo に基づく説明)

ハードサブは動画に字幕を焼きこむことになります。ハードサブは無効にすることが不可能で、言語の切り替えなどもできません。

  • foo.mpgfoo.ssa の字幕を重ねるには:
$ ffmpeg -i foo.mpg -vf subtitles=foo.ssa out.mpg

ボリュームゲイン

ボリュームゲインは ffmpeg のフィルタ機能で変更できます。まず、-af または -filter:a を使って音声ストリームを選択し、次に、volume フィルタの後にそのストリームに対するゲインを指定してください。例えば:

$ ffmpeg -i input.flac -af volume=1.5 ouput.flac

ここで、volume=1.5 によって 150% のボリュームゲインとなります。1.5 から 0.5 にすると、ボリュームが半分になります。ボリュームフィルタにはデシベル単位を渡すこともできます。volume=3dB とすると、ボリュームが 3dB 増え、volume=-3dB とすると 3dB 減ります。

ノート: ファイルのボリュームゲインを倍にすることは、ボリュームを倍にすることと同じではありません。実験して正しいボリュームを見つける必要があります。
ヒント: volumedetect フィルタを使用することで、ファイルの現在の平均ボリュームとピークボリュームを調べることができます: ffmpeg -i input.flac -af volumedetect -f null -。そして、目標のレベルと現在のレベルとの差を volume フィルタに渡すことで、望みのレベルにすることができます。

ボリュームノーマライゼーション

loudnorm フィルタによるノーマライゼーションにより、平均ボリュームとピークボリュームを特定の値にすることができます。fmpeg のデフォルトの平均ラウドネス、ピークラウドネス、そしてレンジラウドネスの目標値 (それぞれ、-24 LUFS、-2 dBTP、7 LU) を使って、ファイルの知覚ラウドネスを正規化するには、以下のコマンドを使用してください:

$ ffmpeg -i input.flac -af loudnorm output.flac

別のラウドネスプロファイルを得るには、loudnorm フィルタのパラメータ itp、そして lra を使って、それぞれ integrated、true peak、loudness range を指定してください。例えば、デフォルトよりも高い知覚ラウドネスにするには:

$ ffmpeg -i input.flac -af loudnorm=i=-16:tp=-1.5:lra=11:print_format=summary output.flac

この例では、オーディオファイルの入力ラウドネスと出力ラウドネスを表示するために print_format=summary も追加しています。

ノート: このフィルタはツーパスモードもサポートしています。最初の実行から測定されたラウドネス値を抽出し、その値を使って2回めの実行で線形ノーマライゼーションを行います。詳細は ffmpeg loudnorm ドキュメントを参照してください。
ヒント: ファイルの現在のラウドネスを調べるには、ffmpeg -i input.flac -af loudnorm=print_format=summary -f null - を使ってください。

音声を抽出する

$ ffmpeg -i video.mpg output.ext
...
Input #0, avi, from 'video.mpg':
  Duration: 01:58:28.96, start: 0.000000, bitrate: 3000 kb/s
    Stream #0.0: Video: mpeg4, yuv420p, 720x480 [PAR 1:1 DAR 16:9], 29.97 tbr, 29.97 tbn, 29.97 tbc
    Stream #0.1: Audio: ac3, 48000 Hz, stereo, s16, 384 kb/s
    Stream #0.2: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
    Stream #0.3: Audio: dts, 48000 Hz, 5.1 768 kb/s
...

多重化されている一番目の (-map 0:1) AC-3 でエンコードされた音声ストリームをファイルに抽出する:

$ ffmpeg -i video.mpg -map 0:1 -acodec copy -vn video.ac3

三番目の (-map 0:3) DTS 音声ストリームをビットレートが 192 kb/s でサンプリングレートが 96000 Hz の AAC ファイルに変換する:

$ ffmpeg -i video.mpg -map 0:3 -acodec aac -b:a 192k -ar 96000 -vn output.aac

-vn は動画ストリームの処理を無効にします。

時間を指定して音声ストリームを抽出する:

$ ffmpeg -ss 00:01:25 -t 00:00:05 -i video.mpg -map 0:1 -acodec copy -vn output.ac3

-ss で開始時間を、-t で長さを指定します。

音声を除去する

  1. 一番目の動画ストリーム (-map 0:0) と二番目の AC-3 音声ストリーム (-map 0:2) をコピーします。
  2. AC-3 音声ストリームをビットレートが 128 kb/s でサンプリングレートが 48000 Hz の2チャンネルの MP3 に変換します。
$ ffmpeg -i video.mpg -map 0:0 -map 0:2 -vcodec copy -acodec libmp3lame \
-b:a 128k -ar 48000 -ac 2 video.mkv
$ ffmpeg -i video.mkv
...
Input #0, avi, from 'video.mpg':
  Duration: 01:58:28.96, start: 0.000000, bitrate: 3000 kb/s
    Stream #0.0: Video: mpeg4, yuv420p, 720x480 [PAR 1:1 DAR 16:9], 29.97 tbr, 29.97 tbn, 29.97 tbc
    Stream #0.1: Audio: mp3, 48000 Hz, stereo, s16, 128 kb/s
ノート: 無駄な音声ストリームを削除することで余ったビットを画質の向上に割り当てることができます。

ファイルを分割する

copy コーデックを使うことでエンコーディングを変更せずにファイルの操作を行うことができます。例えば、次のコマンドであらゆるメディアファイルを簡単に2つに分けることが可能です:

$ ffmpeg -i file.ext -t 00:05:30 -c copy part1.ext -ss 00:05:30 -c copy part2.ext

ハードウェアビデオアクセラレーション

ハードウェアアクセラレーション API を使用することで、エンコード/デコードのパフォーマンスを向上させることができます。しかし、特定の種類のコーデックしか使えませんし、場合によっては、ソフトウェアエンコードを使ったときと同じ結果が得られるとは限りません。

VA-API

Intel CPU (intel-media-driverlibva-intel-driver が必要) を使っている場合や、特定の AMD GPU でオープンソースの AMDGPU ドライバー (libva-mesa-driver が必要) を使っている場合、VA-API を使用してエンコードとデコードができます。

利用可能なパラメータとサポートされているプラットフォームに関する情報は、FFmpeg のドキュメントLibav のドキュメント[リンク切れ 2023-04-23] を参照してください。

サポートされている H.264 コーデックを使用してエンコードする例:

$ ffmpeg -threads 1 -i file.ext -vaapi_device /dev/dri/renderD128 -vcodec h264_vaapi -vf format='nv12|vaapi,hwupload' output.mp4
ノート: 通常、VA-API は、(FFmpeg パッケージの依存関係である) libva に含まれるヘッダとライブラリが検出されれば、ビルド時に ffmpeg の自動検出機能によって有効化されます。

クイックリファレンスとして、constant quality エンコードを行う例を以下に挙げます:

$ ffmpeg -vaapi_device /dev/dri/renderD128 -i input.mp4 -vf 'format=nv12,hwupload' -c:v hevc_vaapi -f mp4 -rc_mode 1 -qp 25 output.mp4

hevc_vaapi を使用する場合、-qp を 25 (視覚的に等価) からそれ以上 (28 から非常に小さな視覚的な損失が発生し始めます) の間で調整してください。h264_vaapi を使用する場合、18 (視覚的に等価) からそれ以上 (20 から非常に小さな視覚的な損失が発生し始めます) の間で調整してください。また、hevc_vaapi は h264_vaapi よりも 50% 高速にエンコードできるようです。

NVIDIA NVENC/NVDEC

プロプライエタリな NVIDIA ドライバを使用していて、nvidia-utils パッケージがインストールされている場合、NVENCNVDEC をエンコード/デコードに使用できます。サポートされている GPU は 600 シリーズからです。詳細は ハードウェアビデオアクセラレーション#NVIDIA を参照してください。

テクニックがこちらの古い gist に載っています。NVENC は CUDA と似ているため、ターミナルセッションからでも動作します。ハードウェア NVENC は Intel の VA-API エンコーダよりも数倍高速です。

利用可能なオプションを表示するには以下のコマンドを実行してください (hevc_nvenc も使えます):

$ ffmpeg -help encoder=h264_nvenc

使用例:

$ ffmpeg -i source.ext -c:v h264_nvenc -rc constqp -qp 28 output.mkv

Intel QuickSync (QSV)

Intel® Quick Sync Video は、Intel GPU のメディア処理機能を使用して高速なデコードとエンコードを行い、プロセッサが他のタスクを処理できるようにしてシステムの応答性を向上させます。

これを使用するには、libmfx ランタイム実装がインストールされている必要があります。libmfx は、ハードウェアプラットフォームに基づいて実行時に実装をロードするディスパッチャライブラリです。Broadwell から Rocket Lake までの GPU で実行する場合、このライブラリは intel-media-sdk をランタイム実装としてロードします。Alder Lake 及びそれ以降の GPU においては、libmfxonevpl-intel-gpu をロードします。単一の Intel GPU を搭載しているシステムでは、ランタイム実装を変更したり選択したりできません。対応する実装は、ハードウェアに応じてインストールする必要があります。

上記のランタイムをインストールしないと、以下のようなエラーが発生します:

[AVHWDeviceContext @ 0x558283838c80] Error initializing an MFX session: -3.
Device creation failed: -1313558101.

QuickSync の使用方法は FFmpeg Wiki で説明されています。libmfx を直接使わずに iHD ドライバか i965 ドライバで VA-API [2] を使用することが推奨されます。エンコード例は FFmpeg Wiki の Hybrid transcode セクションを、ドライバに関する指示は ハードウェアビデオアクセラレーション#VA-API の設定 を参照してください。

AMD AMF

AMD は、AMDGPU PRO プロプライエタリパッケージを使用して AMD Video Coding Engine (GPU エンコード) によって Linux で H264 のみのビデオエンコードを行うためのサポートを追加し、ffmpeg は AMF ビデオエンコードのサポートを追加しました。なので、h264_amf ビデオエンコーダを使ってエンコードするには、amf-amdgpu-proAUR が必要です。AMDGPU PRO パッケージによって提供されている ICD ファイルを環境変数でリンクする必要がある場合があります。そうしないと、ffmpeg はオープンな AMDGPU の ICD ファイルを使用してしまい、このビデオエンコーダを使用できません。エンコードを行うコマンドの例は以下のようになります:

$ VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/amd_pro_icd64.json ffmpeg -hwaccel auto -vaapi_device /dev/dri/renderD128 -i input.mkv -c:v h264_amf -rc 1 -b:v 8M h264_amf_8M.mp4

クイックリファレンスとして、constant quality エンコードを行う例を挙げましょう:

$ VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/amd_pro_icd64.json ffmpeg -hwaccel auto -vaapi_device /dev/dri/renderD128 -i input.mp4 -c:v h264_amf -f mp4 -rc 0 -qp_b 22 -qp_i 22 -qp_p 22 -quality 2 output.mp4

3つの -qp_(b|i|p) を調整してください。18 にすると視覚的に等価で、22 から非常に小さな視覚的な損失が発生し始めます。

アニメーション GIF

一般に、アニメーション GIF は、画像品質が悪く、ファイルサイズが比較的大きく、音声サポートもないので、動画フォーマットとして素晴らしい選択肢とは言えません。しかし、ウェブでは依然として頻繁に使用されています。以下のコマンドを使うことで、動画をアニメーション GIF に変換することができます:

$ ffmpeg -i input.mp4 -vf "fps=10,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop -1 output.gif

パレットフィルタを使って高品質な GIF を生成する方法については、http://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html を見てください。

プリセットファイル

デフォルトのプリセットファイル~/.ffmpeg を作成する:

$ cp -iR /usr/share/ffmpeg ~/.ffmpeg

新しいファイルを作成したりデフォルトのプリセットファイルを編集する:

~/.ffmpeg/libavcodec-vhq.ffpreset
vtag=DX50
mbd=2
trellis=2
flags=+cbp+mv0
pre_dia_size=4
dia_size=4
precmp=4
cmp=4
subcmp=4
preme=2
qns=2

プリセットファイルを使う

-vcodec の宣言の後に -vpre オプションを加えて下さい。

libavcodec-vhq.ffpreset

  • libavcodec = vcodec/acodec の名前
  • vhq = 使用するプリセットの名前
  • ffpreset = FFmpeg プリセットの拡張子

ヒントとテクニック

出力を簡略化

以下のオプションを組み合わせて使うことで、出力の詳細さを好きなレベルまで減らすことができます:

  • -hide_banner: 著作権表示、ビルドオプション、そしてライブラリのバージョンが表示されなくなります
  • -loglevel: ログレベルを調整します (微調整オプションが利用できます)。例: -loglevel warning
  • -nostats: エンコードの進捗/統計が表示されなくなります

動画の再生時間を出力

$ ffprobe -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 file.ext

ストリーム情報を JSON で出力

$ ffprobe -v quiet -print_format json -show_format -show_streams file.ext

X フレームごとに動画のスクリーンショットを作成する

$ ffmpeg -i file.ext -an -s 319x180 -vf fps=1/100 -qscale:v 75 %03d.jpg

参照

翻訳ステータス: このページは en:FFmpeg の翻訳バージョンです。最後の翻訳日は 2023-07-23 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。