「FFmpeg」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(1版 をインポートしました)
(→‎セカンドパス: Tip ではなく ic に)
 
(4人の利用者による、間の22版が非表示)
1行目: 1行目:
[[Category:音声/動画]]
+
[[Category:オーディオ]]
  +
[[Category:ビデオ]]
 
[[en:FFmpeg]]
 
[[en:FFmpeg]]
  +
[[zh-hans:FFmpeg]]
プロジェクトの[http://www.ffmpeg.org/ ホームページ] より:
 
  +
{{Related articles start}}
:''FFmpeg は音声や動画ストリームを記録・変換するためのクロスプラットフォームの完全なソリューションです。先進的な音声・動画コーデックライブラリである libavcodec が含まれています。''
 
  +
{{Related|Flac を Mp3 に変換#FFmpeg を使う}}
  +
{{Related articles end}}
  +
プロジェクトの[https://www.ffmpeg.org/ ホームページ] より:
  +
:FFmpeg は、音声と動画を記録、変換、そしてストリーミングするための完全でクロスプラットフォームなソリューションです。先進的な音声・動画コーデックライブラリである libavcodec が含まれています。
   
== パッケージのインストール ==
+
== インストール ==
   
  +
{{Note|''libav'' や ''avconv'' など FFmpeg のフォークも存在しています。FFmpeg の現在の状態やプロジェクトの違いについては [http://blog.pkh.me/p/13-the-ffmpeg-libav-situation.html The FFmpeg/Libav situation] を読んでください。}}
[[公式リポジトリ]]や [[AUR|AUR]] から様々な関連プロジェクトを[[pacman|インストール]]することができます:
 
   
* {{Pkg|ffmpeg}} – 公式パッケージ
+
{{Pkg|ffmpeg}} パッケージを[[インストール]]してください。
   
  +
開発版は {{AUR|ffmpeg-git}} パッケージでインストールできます。可能な限り多くのオプション機能を有効化してビルドする {{AUR|ffmpeg-full}} も存在します。
その他のパッケージ:
 
   
  +
== エンコードの例 ==
* {{AUR|ffmpeg-git}} – 開発版
 
* {{AUR|ffmpeg-full}} – 可能なかぎり多くの機能を付けてビルドしたバージョン
 
   
  +
{{Note|
フォーク:
 
  +
* パラメータを正しい順序で指定することが重要です (例: input、video、filters、audio、output)。順序を間違うと、パラメータがスキップされたり、FFmpeg が実行されなかったりする場合があります。
  +
* FFmpeg は、使用できる CPU スレッド数を自動的に選択するはずです。しかし、パラメータ {{ic|-threads ''number''}} を使って、使用できるスレッド数を強制したほうが良い場合もあります。
  +
}}
   
  +
[https://trac.ffmpeg.org/wiki#Encoding FFmpeg のエンコード wiki] と {{man|1|ffmpeg|EXAMPLES}} を参照してください。
* {{AUR|ffmbc}} – ブロードキャスト用
 
<!-- Why is highlighting the differance in binary name useful? Needs to be replaced with a meaningful description of libav. -->
 
* {{AUR|libav-git}} – {{ic|ffmpeg}} の代わりに {{ic|avconv}} という名前のバイナリを提供
 
   
== エンコドの例 ==
+
=== スクリンキャプチャ ===
  +
  +
FFmpeg には [https://www.ffmpeg.org/ffmpeg-devices.html#x11grab x11grab] と [https://www.ffmpeg.org/ffmpeg-devices.html#alsa-1 ALSA] の仮想デバイスが含まれており、ユーザのディスプレイ全体と音声入力をキャプチャすることができます。
  +
  +
スクリーンショットを撮って {{ic|screen.png}} に保存するには:
  +
  +
$ ffmpeg -f x11grab -video_size 1920x1080 -i $DISPLAY -vframes 1 screen.png
  +
  +
ここで、{{ic|-video_size}} はキャプチャする領域のサイズを指定します。
  +
  +
ロスレスエンコードで音声なしのスクリーンキャストを撮って {{ic|screen.mkv}} に保存するには:
  +
  +
$ ffmpeg -f x11grab -video_size 1920x1080 -framerate 25 -i $DISPLAY -c:v ffvhuff screen.mkv
   
  +
ここでは、Huffyuv コーデックが使用されます。このコーデックは高速ですが、ファイルサイズが大きくなります。
=== スクリーンキャスト ===
 
   
  +
ロッシーエンコードで音声ありのスクリーンキャストを撮って {{ic|screen.mp4}} に保存するには:
FFmpeg には [http://www.ffmpeg.org/ffmpeg-devices.html#x11grab x11grab] と [http://www.ffmpeg.org/ffmpeg-devices.html#alsa-1 ALSA] 仮想デバイスが含まれており、ユーザーの画面と音声入力を記録することが可能です。
 
   
  +
$ ffmpeg -f x11grab -video_size 1920x1080 -framerate 25 -i $DISPLAY -f alsa -i default -c:v libx264 -preset ultrafast -c:a aac screen.mp4
まずはロスレスエンコードで {{ic|test.mkv}} を作成してみましょう:
 
   
  +
ここでは、x264 コーデックが最も高速なオプションで使用されます。他のコーデックを使用することもできます。(ディスクのパフォーマンスが十分でなかったり、エンコードが遅かったりで) 各フレームの書き込みが遅すぎる場合、フレームがドロップされ、動画出力がカクカクになります。
$ ffmpeg -f x11grab -video_size 1920x1080 -i $DISPLAY -f alsa -i default -c:v ffvhuff -c:a flac test.mkv
 
   
  +
動画ストリームをファイルとして保存する必要はないが、画面共有のために仮想ウェブカメラとして使う場合、[[v4l2loopback#FFmpeg を使って X11 をキャストする]] を参照してください。
{{ic|-video_size}} には録画する領域のサイズを指定します。スクリーンや録画領域の位置を変更する方法は FFmpeg のマニュアルをチェックしてください。さらに MKV をより小さな [[Wikipedia:ja:WebM|WebM]] ファイルに加工することができます:
 
   
  +
[https://trac.ffmpeg.org/wiki/Capture/Desktop#Linux 公式のドキュメント]も参照してください。
$ ffmpeg -i test.mkv -c:v libvpx -c:a libvorbis -b:v 2000k -q:a 3 test.webm
 
   
 
=== ウェブカメラの録画 ===
 
=== ウェブカメラの録画 ===
   
  +
FFmpeg には [https://www.ffmpeg.org/ffmpeg-devices.html#video4linux2_002c-v4l2 video4linux2] と [https://www.ffmpeg.org/ffmpeg-devices.html#alsa-1 ALSA] の入力デバイスが含まれています。これらにより、ウェブカメラと音声入力をキャプチャすることができます。
FFmpeg は Video4Linux2 デバイスからの入力をサポートしています。ウェブカメラが {{ic|/dev/video0}} として正しく認識されていれば、次のコマンドでウェブカメラからの動画を記録できます:
 
   
  +
以下のコマンドは、ウェブカメラから音声無しで動画を録画し {{ic|webcam.mp4}} に保存します。ウェブカメラが {{ic|/dev/video0}} として正しく認識されていると仮定します:
$ ffmpeg -f v4l2 -s 640x480 -i /dev/video0 ''output''.mpg
 
   
  +
$ ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -c:v libx264 -preset ultrafast webcam.mp4
上のコマンドでは無音声の動画が作られます。マイクから音源を入れることも可能です。次のコマンドで [[Advanced Linux Sound Architecture|ALSA]] のデフォルトの録音デバイスからのストリームが動画に入ります:
 
   
  +
ここで、{{ic|-video_size}} は、ウェブカメラからの許可されるイメージサイズの最大値を指定します。
$ ffmpeg -f alsa -i default -f v4l2 -s 640x480 -i /dev/video0 ''output''.mpg
 
   
  +
上記のコマンドは無音動画を出力します。音声ありでウェブカメラから動画を録画し {{ic|webcam.mp4}} に保存するには:
ALSA バックエンドのある [[PulseAudio|PulseAudio]] を使うには:
 
   
$ ffmpeg -f alsa -i pulse -f v4l2 -s 640x480 -i /dev/video0 ''output''.mpg
+
$ ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -f alsa -i default -c:v libx264 -preset ultrafast -c:a aac webcam.mp4
   
  +
ここでは、x264 コーデックが最も高速なオプションで使用されます。他のコーデックを使用することもできます。(ディスクのパフォーマンスが十分でなかったり、エンコードが遅かったりで) 各フレームの書き込みが遅すぎる場合、フレームがドロップされ、動画出力がカクカクになります。
もっと高品質に録音するには、高品質なコーデックを使って出力をエンコードしてみてください:
 
   
  +
[https://trac.ffmpeg.org/wiki/Capture/Webcam#Linux 公式のドキュメント]も参照してください。
$ ffmpeg -f alsa -i default -f v4l2 -s 640x480 -i /dev/video0 -acodec flac \
 
-vcodec libx264 ''output''.mkv
 
   
 
=== VOB から他のコンテナに ===
 
=== VOB から他のコンテナに ===
   
 
[[Wikipedia:VOB|VOB]] ファイルを一つのストリームに連結して MPEG-2 にするには:
 
[[Wikipedia:VOB|VOB]] ファイルを一つのストリームに連結して MPEG-2 にするには:
  +
 
$ cat f0.VOB f1.VOB f2.VOB | ffmpeg -i - out.mp2
 
$ cat f0.VOB f1.VOB f2.VOB | ffmpeg -i - out.mp2
   
=== x264 ロスレス ===
+
=== x264 ===
  +
  +
==== ロスレス ====
   
 
''ultrafast'' プリセットは最速のエンコードをするので素早い録画をしたいときに有用です (スクリーンキャストなど):
 
''ultrafast'' プリセットは最速のエンコードをするので素早い録画をしたいときに有用です (スクリーンキャストなど):
  +
$ ffmpeg -i input -vcodec libx264 -preset ultrafast -qp 0 -acodec copy ''output.mkv''
 
  +
$ ffmpeg -i input -c:v libx264 -preset ultrafast -qp 0 -c:a copy output
  +
 
''ultrafast'' プリセットの反対は ''veryslow'' で、''ultrafast'' よりもエンコードが遅いかわりに出力するファイルのサイズが小さくなります:
 
''ultrafast'' プリセットの反対は ''veryslow'' で、''ultrafast'' よりもエンコードが遅いかわりに出力するファイルのサイズが小さくなります:
  +
$ ffmpeg -i input -vcodec libx264 -preset veryslow -qp 0 -acodec copy ''output.mkv''
 
  +
$ ffmpeg -i input -c:v libx264 -preset veryslow -qp 0 -c:a copy output
  +
 
どちらでも出力のクオリティは同じです。
 
どちらでも出力のクオリティは同じです。
   
  +
{{Tip|あなたの使っているコンピュータがリアルタイムで {{ic|-preset superfast}} を処理できる場合、{{ic|-preset ultrafast}} ではなく {{ic|-preset superfast}} を使用してください。Ultrafast は superfast よりも圧縮率が''かなり''落ちます。}}
=== x265 ===
 
   
  +
==== Constant rate factor ====
x265 ファイルをエンコードするには、{{ic|-aspect <width:height>}} でファイルのアスペクト比を指定する必要があります。例:
 
{{bc|<nowiki>$ ffmpeg -i test.mp4 -c:v hevc -aspect 1920:1080 test_hevc.mp4</nowiki>}}
 
   
  +
出力する品質を指定したいときに使います。一般的に使われているのは最高の {{ic|-crf}} 値で、これでも許容範囲内の画質になります。値が低いほど画質は高くなります。0はロスレス、18は見た目がロスレス、そして23がデフォルトの値です。賢明な値は18から28の範囲になります。一番遅い {{ic|-preset}} を使うなら辛抱する必要があります。詳しくは [https://ffmpeg.org/trac/ffmpeg/wiki/x264EncodingGuide x264 Encoding Guide] を見て下さい。
=== シングルパス MPEG-2 (ニアロスレス) ===
 
   
  +
$ ffmpeg -i ''video'' -c:v libx264 -tune film -preset slow -crf 22 -x264opts fast_pskip=0 -c:a libmp3lame -aq 4 ''output''.mkv
DVD 標準のパラメータに FFmpeg を自動的に設定することができます。~30 FPS の DVD [[Wikipedia:ja:MPEG-2|MPEG-2]] にエンコードするには:
 
   
  +
{{ic|-tune}} オプションを使うことで[https://forum.doom9.org/showthread.php?t=149394 エンコードされるメディアの中身とタイプにあった設定にすることができます]。
$ ffmpeg -i ''video''.VOB -target ntsc-dvd -q:a 0 -q:v 0 ''output''.mpg
 
   
  +
==== ツーパス (超高品質) ====
~24 FPS の DVD MPEG-2 にエンコードするには:
 
   
  +
マルチパスの始めは動画の統計が記録されるため、音声が無効化されます:
$ ffmpeg -i ''video''.VOB -target film-dvd -q:a 0 -q:v 0 ''output''.mpg
 
   
  +
$ ffmpeg -i ''video''.VOB -an -vcodec libx264 -pass 1 -preset veryslow \
=== x264: constant rate factor ===
 
  +
-threads 0 -b:v 3000k -x264opts frameref=15:fast_pskip=0 -f rawvideo -y /dev/null
   
  +
コンテナの形式は出力ファイルの拡張子 ({{ic|.mkv}}) から自動的に検出して変換されます:
出力する品質を指定したいときに使います。一般的に使われているのは最高の {{ic|-crf}} で、これでも許容範囲内の画質になります。値が低いほど画質は高くなります。0はロスレス、18は見た目がロスレス、そして23がデフォルトの値です。意味があるのは18から28の範囲になります。一番遅い {{ic|-preset}} を使うなら辛抱する必要があります。詳しくは [https://ffmpeg.org/trac/ffmpeg/wiki/x264EncodingGuide x264 Encoding Guide] を見て下さい。
 
$ ffmpeg -i ''video'' -vcodec libx264 -preset slow -crf 22 -acodec libmp3lame -aq 4 ''output''.mkv
 
{{ic|-tune}} オプションを使うことで[http://forum.doom9.org/showthread.php?t=149394 エンコードされるメディアの中身とタイプにあった設定にすることができます]。
 
   
  +
$ ffmpeg -i ''video''.VOB -acodec aac -b:a 256k -ar 96000 -vcodec libx264 \
=== YouTube ===
 
  +
-pass 2 -preset veryslow -threads 0 -b:v 3000k -x264opts frameref=15:fast_pskip=0 ''video''.mkv
   
  +
==== 動画の手ブレ補正 ====
YouTube に動画をアップロードする前にエンコードしてサイズを切りそろえるのにも FFmpeg は便利です。次の一行で入力したファイルから mkv コンテナを出力します。
 
   
  +
vbid.stab プラグインを使ってツーパスで手ブレ補正 (ビデオ安定化) を行います。
$ ffmpeg -i ''video'' -c:v libx264 -crf 18 -preset slow -pix_fmt yuv420p -c:a copy ''output''.mkv
 
   
  +
===== ファーストパス =====
詳細については[https://bbs.archlinux.org/viewtopic.php?pid=1200667#p1200667 フォーラム]を見て下さい。一番目の引数に入力するファイルの名前を、二番目の引数に .mkv コンテナのファイルの名前を指定するカスタムエイリアス {{ic|ytconvert}} を作ることもできます。以下を {{ic|~/.bashrc}} に追加してください:
 
   
  +
ファーストパスでは補正パラメータを記録してファイルに書き出します、または視覚分析のテスト動画を作成します。
{{bc|<nowiki>
 
youtubeConvert(){
 
ffmpeg -i $1 -c:v libx264 -crf 18 -preset slow -pix_fmt yuv420p -c:a copy $2.mkv
 
}
 
alias ytconvert=youtubeConvert
 
</nowiki>}}
 
[https://bbs.archlinux.org/viewtopic.php?pid=1200542#p1200542 Arch Linux フォーラムのスレッド]も見て下さい。
 
   
  +
* 補正パラメータを記録してファイルだけに書き出す: {{bc|1=$ ffmpeg -i input -vf vidstabdetect=stepsize=4:mincontrast=0:result=transforms.trf -f null -}}
=== ツーパス x264 (高画質) ===
 
  +
* 補正パラメータをファイルに書きだして、視覚分析用のテストビデオ "output-stab" を作成: {{bc|1=$ ffmpeg -i input -vf vidstabdetect=stepsize=4:mincontrast=0:result=transforms.trf output-stab}}
   
  +
===== セカンドパス =====
マルチパスでは初めに音声を無効にして動画の統計だけを記録します:
 
$ ffmpeg -i ''video''.VOB -an -vcodec libx264 -pass 1 -preset veryslow \
 
-threads 0 -b 3000k -x264opts frameref=15:fast_pskip=0 -f rawvideo -y /dev/null
 
コンテナの形式は出力ファイルの拡張子から自動的に検出して変換されます ({{ic|.mkv}}):
 
$ ffmpeg -i ''video''.VOB -acodec libvo-aacenc -ab 256k -ar 96000 -vcodec libx264 \
 
-pass 2 -preset veryslow -threads 0 -b 3000k -x264opts frameref=15:fast_pskip=0 ''video''.mkv
 
   
  +
セカンドパスではファーストパスで作成した補正パラメータを解析して、それを使って "output-stab_final" を生成します。セカンドパスで他のフィルターを適用することもでき、変換を繰り返す必要をなくして画質を最大限保つことができます。下のコマンドでは以下のオプションを使っています:
{{Tip|(libvo-aacenc を有効にして ffmpeg をコンパイルしたのに) {{ic|Unknown encoder 'libvo-aacenc'}} エラーが発生する場合は、ハイフンの代わりにアンダースコアを使って {{ic|-acodec libvo_aacenc}} で試行してください。}}
 
   
  +
* {{ic|unsharp}}: vid.stab の作者によって推奨されています。下の例ではデフォルトの 5:5:1.0:5:5:1.0 を使っています。
=== ツーパス MPEG-4 (高画質) ===
 
  +
* {{ic|1=fade=t=in:st=0:d=4}}: 4秒間のフェードインをファイルの冒頭に挟みます。
  +
* {{ic|1=fade=t=out:st=60:d=4}}: 動画の60秒目から4秒間のフェードアウトを挟みます。
  +
* {{ic|-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
マルチパスでは初めに音声を無効にして動画の統計だけを記録します:
 
$ ffmpeg -i ''video''.VOB -an -vcodec mpeg4 -pass 1 -mbd 2 -trellis 2 -flags +cbp+mv0 \
 
-pre_dia_size 4 -dia_size 4 -precmp 4 -cmp 4 -subcmp 4 -preme 2 -qns 2 -b 3000k \
 
-f rawvideo -y /dev/null
 
   
  +
=== x265 ===
コンテナの形式は出力ファイルの拡張子から自動的に検出して変換されます ({{ic|.avi}}):
 
  +
$ ffmpeg -i ''video''.VOB -acodec copy -vcodec mpeg4 -vtag DX50 -pass 2 -mbd 2 -trellis 2 \
 
  +
以下の例は、パラメータを指定せずに libx265 を呼び出した場合のデフォルトを示します (Constant Rate Factor エンコード):
-flags +cbp+mv0 -pre_dia_size 4 -dia_size 4 -precmp 4 -cmp 4 -subcmp 4 -preme 2 -qns 2 \
 
  +
-b 3000k ''video''.avi
 
  +
ffmpeg -i input -c:v libx265 -crf 28 -preset medium -c:a libvorbis output.mp4
* {{ic|-vcodec mpeg4}} に {{ic|threads}}={{ic|n}}>{{ic|1}} を使うと[[Wikipedia:Motion_estimation|動き推定]]の効きが悪くなって[http://ffmpeg.org/faq.html#Why-do-I-see-a-slight-quality-degradation-with-multithreaded-MPEG_002a-encoding_003f 画質や圧縮効率が落ちる] ことがあります。
 
  +
* 上のツーパス MPEG-4 の例では [[Wikipedia:ja:MP4|MP4]] コンテナへの出力も対応しています ({{ic|.avi}} を {{ic|.mp4}} に置き換えてください)。
 
  +
詳細は FFmpeg の [https://trac.ffmpeg.org/wiki/Encode/H.265 H.265/HEVC Video Encoding Guide] を参照してください。
  +
  +
=== シングルパス MPEG-2 (ニアロスレス) ===
  +
  +
DVD 標準のパラメータに FFmpeg を自動的に設定することができます。約 30 FPS の DVD [[Wikipedia:ja:MPEG-2|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
* (出力するファイルのサイズ (MB) - 音声ファイルのサイズ (MB) ) '''x''' 8192 kb/MB '''/''' メディアの秒数 (s) '''=''' [[Wikipedia:ja:ビットレート|ビットレート]] (kb/s)
 
:* (3900 MB - 275 MB) = 3625 MB '''x''' 8192 kb/MB '''/''' 8830 s = 3363 kb/s でちょうど合計 3900 MB のサイズのファイルが出力されます
 
   
 
=== 字幕 ===
 
=== 字幕 ===
138行目: 156行目:
 
==== 抽出 ====
 
==== 抽出 ====
   
MPEG-2 や Matroska などのコンテナファイルに埋め込まれた字幕を抽出して、SRT や SSA などの字幕形式に変換することができます。
+
MPEG-2 や Matroska などのコンテナファイルに埋め込まれた字幕を抽出して、SRT や SSA、WebVTT などの字幕形式に変換することができます。[https://trac.ffmpeg.org/wiki/ExtractSubtitles]
   
 
* ファイルに字幕ストリームが含まれているか確認してください:
 
* ファイルに字幕ストリームが含まれているか確認してください:
   
{{hc|$ ffprobe foo.mkv|
+
{{hc|$ 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)
 
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)
153行目: 171行目:
 
LANGUAGE : und
 
LANGUAGE : und
 
HANDLER_NAME : GPAC ISO Audio Handler
 
HANDLER_NAME : GPAC ISO Audio Handler
'''Stream #0:2: Subtitle: ssa (default)}}
+
'''Stream #0:2: Subtitle: ssa (default)'''
  +
}}
   
 
* {{ic|foo.mkv}} には SSA の字幕が埋め込まれており、別のファイルに抽出することが可能です:
 
* {{ic|foo.mkv}} には SSA の字幕が埋め込まれており、別のファイルに抽出することが可能です:
   
 
$ ffmpeg -i foo.mkv foo.ssa
 
$ ffmpeg -i foo.mkv foo.ssa
  +
  +
字幕を望ましい形式 (例として [[Wikipedia:ja:SubRip|SubRip]]) に保存するには {{ic|-c:s srt}} を追加してください:
  +
  +
$ ffmpeg -i foo.mkv -c:s srt foo.srt
  +
  +
複数の字幕が存在する場合、{{ic|-map ''key'':''stream''}} パラメータを使用して抽出するストリームを指定する必要があります:
  +
  +
$ ffmpeg -i foo.mkv -map 0:2 foo.ssa
   
 
==== ハードサブ ====
 
==== ハードサブ ====
   
([http://trac.ffmpeg.org/wiki/How%20to%20burn%20subtitles%20into%20the%20video FFmpeg wiki の記事] に基づく説明)
+
(FFmpeg wiki の記事の [https://trac.ffmpeg.org/wiki/HowToBurnSubtitlesIntoVideo HowToBurnSubtitlesIntoVideo] に基づく説明)
   
 
[[Wikipedia:Hardsub|ハードサブ]]は動画に字幕を焼きこむことになります。ハードサブは無効にすることが不可能で、言語の切り替えなどもできません。
 
[[Wikipedia:Hardsub|ハードサブ]]は動画に字幕を焼きこむことになります。ハードサブは無効にすることが不可能で、言語の切り替えなどもできません。
167行目: 194行目:
 
* {{ic|foo.mpg}} に {{ic|foo.ssa}} の字幕を重ねるには:
 
* {{ic|foo.mpg}} に {{ic|foo.ssa}} の字幕を重ねるには:
   
$ ffmpeg -i foo.mpg -c copy -vf subtitles=foo.ssa out.mpg
+
$ ffmpeg -i foo.mpg -vf subtitles=foo.ssa out.mpg
   
 
=== ボリュームゲイン ===
 
=== ボリュームゲイン ===
   
  +
ボリュームゲインは ''ffmpeg'' のフィルタ機能で変更できます。まず、{{ic|-af}} または {{ic|-filter:a}} を使って音声ストリームを選択し、次に、''volume'' フィルタの後にそのストリームに対するゲインを指定してください。例えば:
音量は256の倍数で変更します。'''256 = 100%''' が通常のボリュームです。400などの半端な値も使うことができます。
 
-vol 256 = 100%
 
-vol 512 = 200%
 
-vol 768 = 300%
 
-vol 1024 = 400%
 
-vol 2048 = 800%
 
   
  +
$ ffmpeg -i input.flac -af '''volume=1.5''' ouput.flac
[[Wikipedia:ja:Mp3|MP3]] ファイルのボリュームを2倍にするには '''(512 = 200%)''':
 
$ ffmpeg -i ''file''.mp3 -vol 512 ''louder_file''.mp3
 
   
  +
ここで、{{ic|1=volume=1.5}} によって 150% のボリュームゲインとなります。1.5 から 0.5 にすると、ボリュームが半分になります。ボリュームフィルタにはデシベル単位を渡すこともできます。{{ic|1=volume=3dB}} とすると、ボリュームが 3dB 増え、{{ic|1=volume=-3dB}} とすると 3dB 減ります。
[[Wikipedia:ja:Ogg|Ogg]] ファイルのボリュームを4倍にするには '''(1024 = 400%)''':
 
$ ffmpeg -i ''file''.ogg -vol 1024 ''louder_file''.ogg
 
   
  +
{{Note|ファイルのボリュームゲインを倍にすることは、ボリュームを倍にすることと同じではありません。実験して正しいボリュームを見つける必要があります。}}
ゲインのメタデータは出力するファイルにだけ書き込まれるので注意してください。mp3gain や ogggain と違って、元の音声ファイルには変更が加えられません。
 
  +
  +
{{Tip|''volumedetect'' フィルタを使用することで、ファイルの現在の平均ボリュームとピークボリュームを調べることができます: {{ic|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'' フィルタのパラメータ {{ic|i}}、{{ic|tp}}、そして {{ic|lra}} を使って、それぞれ ''i''ntegrated、''t''rue ''p''eak、''l''oudness ''ra''nge を指定してください。例えば、デフォルトよりも高い知覚ラウドネスにするには:
  +
  +
$ ffmpeg -i input.flac -af loudnorm=i=-16:tp=-1.5:lra=11:print_format=summary output.flac
  +
  +
この例では、オーディオファイルの入力ラウドネスと出力ラウドネスを表示するために {{ic|1=print_format=summary}} も追加しています。
  +
  +
{{Note|このフィルタはツーパスモードもサポートしています。最初の実行から測定されたラウドネス値を抽出し、その値を使って2回めの実行で線形ノーマライゼーションを行います。詳細は [https://ffmpeg.org/ffmpeg-filters.html#loudnorm ffmpeg loudnorm ドキュメント]を参照してください。}}
  +
  +
{{Tip|ファイルの現在のラウドネスを調べるには、{{ic|1=ffmpeg -i input.flac -af loudnorm=print_format=summary -f null -}} を使ってください。}}
   
 
=== 音声を抽出する ===
 
=== 音声を抽出する ===
   
{{hc|$ ffmpeg -i ''video''.mpg|
+
{{hc|$ ffmpeg -i ''video''.mpg output.ext|
 
...
 
...
 
Input #0, avi, from '''video''.mpg':
 
Input #0, avi, from '''video''.mpg':
199行目: 237行目:
 
}}
 
}}
   
多重化されている一番目の ({{ic|-map 0:1}}) [[Wikipedia:ja:ドルビーデジタル|AC-3]] でエンコードされた音声ストリームをファイルに抽出する:
+
多重化されている一番目の ({{ic|-map 0:1}}) [[Wikipedia:ja:ドルビーデジタル|AC-3]] でエンコードされた音声ストリームをファイルに抽出する:
  +
 
$ ffmpeg -i ''video''.mpg -map 0:1 -acodec copy -vn ''video''.ac3
 
$ ffmpeg -i ''video''.mpg -map 0:1 -acodec copy -vn ''video''.ac3
  +
三番目の ({{ic|-map 0:3}}) [[Wikipedia:ja:デジタル・シアター・システムズ|DTS]] 音声ストリームをビットレートが 192 kb/s でサンプリングレートが 96000 Hz の [[Wikipedia:ja:AAC|AAC]] ファイルに変換する:
 
  +
三番目の ({{ic|-map 0:3}}) [[Wikipedia:ja:デジタル・シアター・システムズ|DTS]] 音声ストリームをビットレートが 192 kb/s で[[Wikipedia:ja:サンプリングレート|サンプリングレート]]が 96000 Hz の [[Wikipedia:ja:AAC|AAC]] ファイルに変換する:
$ ffmpeg -i ''video''.mpg -map 0:3 -acodec libvo-aacenc -ab 192k -ar 96000 -vn ''output''.aac
 
  +
  +
$ ffmpeg -i ''video''.mpg -map 0:3 -acodec aac -b:a 192k -ar 96000 -vn ''output''.aac
  +
 
{{ic|-vn}} は動画ストリームの処理を無効にします。
 
{{ic|-vn}} は動画ストリームの処理を無効にします。
   
 
時間を指定して音声ストリームを抽出する:
 
時間を指定して音声ストリームを抽出する:
  +
 
$ ffmpeg -ss 00:01:25 -t 00:00:05 -i ''video''.mpg -map 0:1 -acodec copy -vn ''output''.ac3
 
$ ffmpeg -ss 00:01:25 -t 00:00:05 -i ''video''.mpg -map 0:1 -acodec copy -vn ''output''.ac3
  +
 
{{ic|-ss}} で開始時間を、{{ic|-t}} で長さを指定します。
 
{{ic|-ss}} で開始時間を、{{ic|-t}} で長さを指定します。
   
213行目: 257行目:
 
# 一番目の動画ストリーム ({{ic|-map 0:0}}) と二番目の AC-3 音声ストリーム ({{ic|-map 0:2}}) をコピーします。
 
# 一番目の動画ストリーム ({{ic|-map 0:0}}) と二番目の AC-3 音声ストリーム ({{ic|-map 0:2}}) をコピーします。
 
# AC-3 音声ストリームをビットレートが 128 kb/s でサンプリングレートが 48000 Hz の2チャンネルの MP3 に変換します。
 
# AC-3 音声ストリームをビットレートが 128 kb/s でサンプリングレートが 48000 Hz の2チャンネルの MP3 に変換します。
  +
 
$ ffmpeg -i ''video''.mpg -map 0:0 -map 0:2 -vcodec copy -acodec libmp3lame \
 
$ ffmpeg -i ''video''.mpg -map 0:0 -map 0:2 -vcodec copy -acodec libmp3lame \
-ab 128k -ar 48000 -ac 2 ''video''.mkv
+
-b:a 128k -ar 48000 -ac 2 ''video''.mkv
   
 
{{hc|$ ffmpeg -i ''video''.mkv|
 
{{hc|$ ffmpeg -i ''video''.mkv|
224行目: 269行目:
 
}}
 
}}
   
  +
{{Note|無駄な音声ストリームを削除することで余ったビットを画質の向上に割り当てることができます。}}
{{Note|Removing undesired audio streams allows for additional bits to be allocated towards improving video quality.}}
 
   
 
=== ファイルを分割する ===
 
=== ファイルを分割する ===
231行目: 276行目:
   
 
$ ffmpeg -i file.ext -t 00:05:30 -c copy part1.ext -ss 00:05:30 -c copy part2.ext
 
$ ffmpeg -i file.ext -t 00:05:30 -c copy part1.ext -ss 00:05:30 -c copy part2.ext
  +
  +
=== ハードウェアビデオアクセラレーション ===
  +
  +
[https://trac.ffmpeg.org/wiki/HWAccelIntro ハードウェアアクセラレーション API] を使用することで、エンコード/デコードのパフォーマンスを向上させることができます。しかし、特定の種類のコーデックしか使えませんし、場合によっては、ソフトウェアエンコードを使ったときと同じ結果が得られるとは限りません。
  +
  +
==== VA-API ====
  +
  +
Intel CPU ({{Pkg|intel-media-driver}} か {{Pkg|libva-intel-driver}} が必要) を使っている場合や、特定の AMD GPU でオープンソースの [[AMDGPU]] ドライバー ({{Pkg|libva-mesa-driver}} が必要) を使っている場合、[[VA-API]] を使用してエンコードとデコードができます。
  +
  +
利用可能なパラメータとサポートされているプラットフォームに関する情報は、[https://trac.ffmpeg.org/wiki/Hardware/VAAPI FFmpeg のドキュメント]や [https://wiki.libav.org/Hardware/vaapi Libav のドキュメント]{{Dead link|2023|04|23|status=domain name not resolved}} を参照してください。
  +
  +
サポートされている H.264 コーデックを使用してエンコードする例:
  +
  +
$ ffmpeg -threads 1 -i file.ext -vaapi_device /dev/dri/renderD128 -vcodec h264_vaapi -vf format='nv12|vaapi,hwupload' output.mp4
  +
  +
{{Note|通常、VA-API は、(FFmpeg パッケージの依存関係である) {{Pkg|libva}} に含まれるヘッダとライブラリが検出されれば、ビルド時に {{Pkg|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]] ドライバを使用していて、{{Pkg|nvidia-utils}} パッケージがインストールされている場合、[[Wikipedia:Nvidia NVENC|NVENC]] と [[Wikipedia:Nvidia NVDEC|NVDEC]] をエンコード/デコードに使用できます。サポートされている GPU は [[Wikipedia:GeForce 600 series|600 シリーズ]]からです。詳細は [[ハードウェアビデオアクセラレーション#NVIDIA]] を参照してください。
  +
  +
テクニックが[https://web.archive.org/web/20190808223352/https://gist.github.com/Brainiarc7/8b471ff91319483cdb725f615908286e こちらの古い gist] に載っています。NVENC は [[CUDA]] と似ているため、ターミナルセッションからでも動作します。ハードウェア NVENC は Intel の VA-API エンコーダよりも数倍高速です。
  +
  +
利用可能なオプションを表示するには以下のコマンドを実行してください ({{ic|hevc_nvenc}} も使えます):
  +
  +
$ ffmpeg -help encoder=h264_nvenc
  +
  +
使用例:
  +
  +
$ ffmpeg -i source.ext -c:v h264_nvenc -rc constqp -qp 28 output.mkv
  +
  +
==== Intel QuickSync (QSV) ====
  +
  +
[https://www.intel.com/content/www/us/en/architecture-and-technology/quick-sync-video/quick-sync-video-general.html Intel® Quick Sync Video] は、[[Intel]] GPU のメディア処理機能を使用して高速なデコードとエンコードを行い、プロセッサが他のタスクを処理できるようにしてシステムの応答性を向上させます。
  +
  +
これを使用するには、'''libmfx''' ランタイム実装がインストールされている必要があります。'''libmfx''' は、ハードウェアプラットフォームに基づいて実行時に実装をロードするディスパッチャライブラリです。[[Wikipedia:ja:Broadwellマイクロアーキテクチャ|Broadwell]] から [[Wikipedia:ja:Rocket Lakeマイクロプロセッサ|Rocket Lake]] までの GPU で実行する場合、このライブラリは {{Pkg|intel-media-sdk}} をランタイム実装としてロードします。[[Wikipedia:ja:Alder Lakeマイクロプロセッサ|Alder Lake]] 及びそれ以降の GPU においては、'''libmfx''' は {{Pkg|onevpl-intel-gpu}} をロードします。単一の Intel GPU を搭載しているシステムでは、ランタイム実装を変更したり選択したりできません。対応する実装は、ハードウェアに応じてインストールする必要があります。
  +
  +
上記のランタイムをインストールしないと、以下のようなエラーが発生します:
  +
  +
[AVHWDeviceContext @ 0x558283838c80] Error initializing an MFX session: -3.
  +
Device creation failed: -1313558101.
  +
  +
QuickSync の使用方法は [https://trac.ffmpeg.org/wiki/Hardware/QuickSync FFmpeg Wiki] で説明されています。''libmfx'' を直接使わずに ''iHD'' ドライバか ''i965'' ドライバで [[VA-API]] [https://trac.ffmpeg.org/wiki/Hardware/VAAPI] を使用することが推奨されます。エンコード例は FFmpeg Wiki の ''Hybrid transcode'' セクションを、ドライバに関する指示は [[ハードウェアビデオアクセラレーション#VA-API の設定]] を参照してください。
  +
  +
==== AMD AMF ====
  +
  +
AMD は、[[AMDGPU PRO]] プロプライエタリパッケージを使用して AMD Video Coding Engine (GPU エンコード) によって Linux で H264 のみのビデオエンコードを行うためのサポートを追加し、ffmpeg は AMF ビデオエンコードのサポートを追加しました。なので、h264_amf ビデオエンコーダを使ってエンコードするには、{{AUR|amf-amdgpu-pro}} が必要です。[[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 を見てください。
   
 
== プリセットファイル ==
 
== プリセットファイル ==
   
デフォルトの[http://ffmpeg.org/ffmpeg-doc.html#SEC13 プリセットファイル] で {{ic|~/.ffmpeg}} を作成する:
+
デフォルトの[https://ffmpeg.org/ffmpeg.html#Preset-files プリセットファイル]で {{ic|~/.ffmpeg}} を作成する:
   
 
$ cp -iR /usr/share/ffmpeg ~/.ffmpeg
 
$ cp -iR /usr/share/ffmpeg ~/.ffmpeg
256行目: 370行目:
 
=== プリセットファイルを使う ===
 
=== プリセットファイルを使う ===
   
好きな {{ic|-vcodec}} の宣言の後に {{ic|-vpre}} オプションを加えて下さい。
+
{{ic|-vcodec}} の宣言の後に {{ic|-vpre}} オプションを加えて下さい。
   
 
==== libavcodec-vhq.ffpreset ====
 
==== libavcodec-vhq.ffpreset ====
264行目: 378行目:
 
* {{ic|ffpreset}} '''=''' FFmpeg プリセットの拡張子
 
* {{ic|ffpreset}} '''=''' FFmpeg プリセットの拡張子
   
  +
== ヒントとテクニック ==
===== ツーパス MPEG-4 (高画質) =====
 
   
  +
=== 出力を簡略化 ===
マルチパスの (ビットレート) レート制御変換の一番目のパス:
 
$ ffmpeg -i ''video''.mpg -an -vcodec mpeg4 -pass 1 -vpre vhq -f rawvideo -y /dev/null
 
最初のパスで記録した動画統計に基づくレート制御:
 
$ ffmpeg -i ''video''.mpg -acodec libvorbis -aq 8 -ar 48000 -vcodec mpeg4 \
 
-pass 2 -vpre vhq -b 3000k ''output''.mp4
 
   
  +
以下のオプションを組み合わせて使うことで、出力の詳細さを好きなレベルまで減らすことができます:
* '''libvorbis 音質設定 (VBR)'''
 
:* {{ic|-aq 4}} = 128 kb/s
 
:* {{ic|-aq 5}} = 160 kb/s
 
:* {{ic|-aq 6}} = 192 kb/s
 
:* {{ic|-aq 7}} = 224 kb/s
 
:* {{ic|-aq 8}} = 256 kb/s
 
   
  +
* {{ic|-hide_banner}}: 著作権表示、ビルドオプション、そしてライブラリのバージョンが表示されなくなります
* [http://www.xiph.org/ Xiph.Org] による [http://vorbis.com/ libvorbis] よりも [http://www.geocities.jp/aoyoume/aotuv/ aoTuV] の方が一般に好まれており [[AUR|AUR]] で [https://aur.archlinux.org/packages.php?ID=6155 libvorbis-aotuv] として提供されています。
 
  +
* {{ic|-loglevel}}: ログレベルを調整します (微調整オプションが利用できます)。例: {{ic|-loglevel warning}}
  +
* {{ic|-nostats}}: エンコードの進捗/統計が表示されなくなります
   
  +
=== 動画の再生時間を出力 ===
== パッケージの削除 ==
 
   
  +
$ ffprobe -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 file.ext
[[pacman|pacman]] はパッケージのインストールで作成されたデフォルトの設定ファイル以外の設定ファイルを[[Pacman#パッケージの削除|削除]]しません。ユーザーが作成したプリセットのファイルなども残ります。
 
  +
  +
=== ストリーム情報を 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
   
 
== 参照 ==
 
== 参照 ==
   
* [http://mewiki.project357.com/wiki/X264_Settings x264 Settings] - MeWiki ドキュメント
+
* [https://ffmpeg.org/ffmpeg.html FFmpeg documentation] - 公式ドキュメント
* [http://ffmpeg.org/ffmpeg-doc.html FFmpeg documentation] - 公式ドキュメント
+
* [https://trac.ffmpeg.org/wiki FFmpeg Wiki] - 公式 wiki
 
* [http://www.mplayerhq.hu/DOCS/HTML/en/menc-feat-x264.html Encoding with the x264 codec] - MEncoder ドキュメント
 
* [http://www.mplayerhq.hu/DOCS/HTML/en/menc-feat-x264.html Encoding with the x264 codec] - MEncoder ドキュメント
* [http://avidemux.org/admWiki/doku.php?id=tutorial:h.264 H.264 encoding guide] - Avidemux wiki
+
* [https://avidemux.org/admWiki/doku.php?id=tutorial:h.264 H.264 encoding guide] - Avidemux wiki
 
* [http://howto-pages.org/ffmpeg/ Using FFmpeg] - Linux how to pages
 
* [http://howto-pages.org/ffmpeg/ Using FFmpeg] - Linux how to pages
* サポートしている音声・動画ストリームの[http://ffmpeg.org/general.html#Supported-File-Formats-and-Codecs リスト]
+
* サポートしている音声・動画ストリームの[https://ffmpeg.org/general.html#Supported-File-Formats-and-Codecs リスト]
  +
  +
{{TranslationStatus|FFmpeg|2023-07-23|776189}}

2023年7月23日 (日) 22:34時点における最新版

関連記事

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

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 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。