「FFmpeg」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎AMD AMF: 追加(英語版より))
(→‎セカンドパス: Tip ではなく ic に)
 
(2人の利用者による、間の12版が非表示)
3行目: 3行目:
 
[[en:FFmpeg]]
 
[[en:FFmpeg]]
 
[[zh-hans:FFmpeg]]
 
[[zh-hans:FFmpeg]]
  +
{{Related articles start}}
プロジェクトの[http://www.ffmpeg.org/ ホームページ] より:
 
  +
{{Related|Flac を Mp3 に変換#FFmpeg を使う}}
:''FFmpeg は音声や動画ストリームを記録・変換するためのクロスプラットフォームの完全なソリューションです。先進的な音声・動画コーデックライブラリである libavcodec が含まれています。''
 
  +
{{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 こちらのブログ記事] を読んでください。}}
+
{{Note|''libav'' や ''avconv'' など FFmpeg のフォークも存在しています。FFmpeg の現在の状態やプロジェクトの違いについては [http://blog.pkh.me/p/13-the-ffmpeg-libav-situation.html The FFmpeg/Libav situation] を読んでください。}}
   
 
{{Pkg|ffmpeg}} パッケージを[[インストール]]してください。
 
{{Pkg|ffmpeg}} パッケージを[[インストール]]してください。
   
開発版は {{AUR|ffmpeg-git}} パッケージでインストールできます。多のオプション機能を有効 {{AUR|ffmpeg-full}} も存在します。
+
開発版は {{AUR|ffmpeg-git}} パッケージでインストールできます。可能な限りのオプション機能を有効てビルドする {{AUR|ffmpeg-full}} も存在します。
   
 
== エンコードの例 ==
 
== エンコードの例 ==
   
 
{{Note|
 
{{Note|
* (input, video, filters, audio, output などの) パラメータの順番は正し指定しないとパラメータがスキップされたり、あるいは FFmpeg が実行できなくなったりすることがあります。
+
* パラメータ正しい順序で指定するこが重要です (例: input、video、filters、audio、output)。順序を間違うと、パラメータがスキップされたり、FFmpeg が実行されったりする場合があります。
* FFmpeg は自動的に使用る CPU スレッド数を決定します。ただし {{ic|-threads <number>}} パラメータを使うこと明示的にスレッド数を指定すること可能です。
+
* FFmpeg は使用できる CPU スレッド数を自動的に選択するはずです。しかし、パラメータ {{ic|-threads ''number''}} を使って、使用きるスレッド数を強制したほうが良い場合あります。
 
}}
 
}}
   
  +
[https://trac.ffmpeg.org/wiki#Encoding FFmpeg のエンコード wiki] と {{man|1|ffmpeg|EXAMPLES}} を参照してください。
=== スクリーンキャスト ===
 
   
  +
=== スクリーンキャプチャ ===
FFmpeg には [http://www.ffmpeg.org/ffmpeg-devices.html#x11grab x11grab] と [http://www.ffmpeg.org/ffmpeg-devices.html#alsa-1 ALSA] 仮想デバイスが含まれており、ユーザーの画面と音声入力を記録することが可能です。
 
   
  +
FFmpeg には [https://www.ffmpeg.org/ffmpeg-devices.html#x11grab x11grab] と [https://www.ffmpeg.org/ffmpeg-devices.html#alsa-1 ALSA] の仮想デバイスが含まれており、ユーザのディスプレイ全体と音声入力をキャプチャすることができます。
まずはロスレスエンコードで {{ic|test.mkv}} を作成してみましょう:
 
   
  +
スクリーンショットを撮って {{ic|screen.png}} に保存するには:
$ ffmpeg -f x11grab -video_size 1920x1080 -i $DISPLAY -f alsa -i default -c:v ffvhuff -c:a flac test.mkv
 
   
  +
$ ffmpeg -f x11grab -video_size 1920x1080 -i $DISPLAY -vframes 1 screen.png
{{ic|-video_size}} には録画する領域のサイズを指定します。スクリーンや録画領域の位置を変更する方法は FFmpeg のマニュアルをチェックしてください。さらに MKV をより小さな [[Wikipedia:ja:WebM|WebM]] ファイルに加工することができます:
 
   
  +
ここで、{{ic|-video_size}} はキャプチャする領域のサイズを指定します。
$ ffmpeg -i test.mkv -c:v libvpx -c:a libvorbis -b:v 2000k -q:a 3 test.webm
 
  +
  +
ロスレスエンコードで音声なしのスクリーンキャストを撮って {{ic|screen.mkv}} に保存するには:
  +
  +
$ ffmpeg -f x11grab -video_size 1920x1080 -framerate 25 -i $DISPLAY -c:v ffvhuff screen.mkv
  +
  +
ここでは、Huffyuv コーデックが使用されます。このコーデックは高速ですが、ファイルサイズが大きくなります。
  +
  +
ロッシーエンコードで音声ありのスクリーンキャストを撮って {{ic|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 をキャストする]] を参照してください。
  +
  +
[https://trac.ffmpeg.org/wiki/Capture/Desktop#Linux 公式のドキュメント]も参照してください。
   
 
=== ウェブカメラの録画 ===
 
=== ウェブカメラの録画 ===
   
  +
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]] を使うには:
 
   
$ 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''
 
''ultrafast'' プリセットの反対は ''veryslow'' で、''ultrafast'' よりもエンコードが遅いかわりに出力するファイルのサイズが小さくなります:
 
$ ffmpeg -i input -vcodec libx264 -preset veryslow -qp 0 -acodec copy ''output.mkv''
 
どちらでも出力のクオリティは同じです。
 
   
  +
$ ffmpeg -i input -c:v libx264 -preset ultrafast -qp 0 -c:a copy output
{{Tip|あなたの使っているコンピュータがリアルタイムで {{ic|-preset superfast}} を処理できる場合、{{ic|-preset ultrafast}} の代わりに使用してください。Ultrafast は superfast よりも圧縮率がかなり落ちます。}}
 
   
  +
''ultrafast'' プリセットの反対は ''veryslow'' で、''ultrafast'' よりもエンコードが遅いかわりに出力するファイルのサイズが小さくなります:
=== x265 ===
 
   
  +
$ ffmpeg -i input -c:v libx264 -preset veryslow -qp 0 -c:a copy output
x265 ファイルをエンコードするには、{{ic|-aspect <width:height>}} でファイルのアスペクト比を指定する必要があります。例:
 
{{bc|<nowiki>$ ffmpeg -i test.mp4 -c:v hevc -aspect 1920:1080 test_hevc.mp4</nowiki>}}
 
   
  +
どちらでも出力のクオリティは同じです。
=== シングルパス MPEG-2 (ニアロスレス) ===
 
   
  +
{{Tip|あなたの使っているコンピュータがリアルタイムで {{ic|-preset superfast}} を処理できる場合、{{ic|-preset ultrafast}} ではなく {{ic|-preset superfast}} を使用してください。Ultrafast は superfast よりも圧縮率が''かなり''落ちます。}}
DVD 標準のパラメータに FFmpeg を自動的に設定することができます。~30 FPS の DVD [[Wikipedia:ja:MPEG-2|MPEG-2]] にエンコードするには:
 
   
  +
==== Constant rate factor ====
$ ffmpeg -i ''video''.VOB -target ntsc-dvd -q:a 0 -q:v 0 ''output''.mpg
 
   
  +
出力する品質を指定したいときに使います。一般的に使われているのは最高の {{ic|-crf}} 値で、これでも許容範囲内の画質になります。値が低いほど画質は高くなります。0はロスレス、18は見た目がロスレス、そして23がデフォルトの値です。賢明な値は18から28の範囲になります。一番遅い {{ic|-preset}} を使うなら辛抱する必要があります。詳しくは [https://ffmpeg.org/trac/ffmpeg/wiki/x264EncodingGuide x264 Encoding Guide] を見て下さい。
~24 FPS の DVD MPEG-2 にエンコードするには:
 
   
$ ffmpeg -i ''video''.VOB -target film-dvd -q:a 0 -q:v 0 ''output''.mpg
+
$ ffmpeg -i ''video'' -c:v libx264 -tune film -preset slow -crf 22 -x264opts fast_pskip=0 -c:a libmp3lame -aq 4 ''output''.mkv
   
  +
{{ic|-tune}} オプションを使うことで[https://forum.doom9.org/showthread.php?t=149394 エンコードされるメディアの中身とタイプにあった設定にすることができます]。
=== x264: constant rate factor ===
 
   
  +
==== ツーパス (超高品質) ====
出力する品質を指定したいときに使います。一般的に使われているのは最高の {{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 エンコードされるメディアの中身とタイプにあった設定にすることができます]。
 
   
  +
マルチパスの始めは動画の統計が記録されるため、音声が無効化されます:
=== ツーパス x264 (高画質) ===
 
   
  +
$ 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
$ 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
 
   
  +
コンテナの形式は出力ファイルの拡張子 ({{ic|.mkv}}) から自動的に検出して変換されます:
{{Tip|(libvo-aacenc を有効にして ffmpeg をコンパイルしたのに) {{ic|Unknown encoder 'libvo-aacenc'}} エラーが発生する場合は、ハイフンの代わりにアンダースコアを使って {{ic|-acodec libvo_aacenc}} で試行してください。}}
 
   
  +
$ ffmpeg -i ''video''.VOB -acodec aac -b:a 256k -ar 96000 -vcodec libx264 \
=== ツーパス MPEG-4 (高画質) ===
 
  +
-pass 2 -preset veryslow -threads 0 -b:v 3000k -x264opts frameref=15:fast_pskip=0 ''video''.mkv
   
  +
==== 動画の手ブレ補正 ====
マルチパスでは初めに音声を無効にして動画の統計だけを記録します:
 
$ 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
 
   
コンテナの形式は出力ファイルの拡張子から自動的に検出して変換されます ({{ic|.avi}}):
 
$ ffmpeg -i ''video''.VOB -acodec copy -vcodec mpeg4 -vtag DX50 -pass 2 -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 ''video''.avi
 
* {{ic|-vcodec mpeg4}} に {{ic|threads}}={{ic|n}}>{{ic|1}} を使うと[[Wikipedia:Motion_estimation|動き推定]]の効きが悪くなって[https://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}} に置き換えてください)。
 
 
==== 出力するファイルのサイズからビットレートを計算する ====
 
 
* (出力するファイルのサイズ (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 のサイズのファイルが出力されます
 
 
=== x264 手ブレ補正 ===
 
 
vbid.stab プラグインを使ってツーパスで手ブレ補正 (ビデオ安定化) を行います。
 
vbid.stab プラグインを使ってツーパスで手ブレ補正 (ビデオ安定化) を行います。
   
==== ファーストパス ====
+
===== ファーストパス =====
   
 
ファーストパスでは補正パラメータを記録してファイルに書き出します、または視覚分析のテスト動画を作成します。
 
ファーストパスでは補正パラメータを記録してファイルに書き出します、または視覚分析のテスト動画を作成します。
The first pass records stabilization parameters to a file and/or a test video for visual analysis.
 
 
* 補正パラメータを記録してファイルに書き出す:
 
 
$ 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 -f output-stab
+
* 補正パラメータを記録してファイルだけに書き出す: {{bc|1=$ ffmpeg -i input -vf vidstabdetect=stepsize=4:mincontrast=0:result=transforms.trf -f null -}}
  +
* 補正パラメータをファイルに書きだして、視覚分析用のテストビデオ "output-stab" を作成: {{bc|1=$ ffmpeg -i input -vf vidstabdetect=stepsize=4:mincontrast=0:result=transforms.trf output-stab}}
   
==== セカンドパス ====
+
===== セカンドパス =====
   
 
セカンドパスではファーストパスで作成した補正パラメータを解析して、それを使って "output-stab_final" を生成します。セカンドパスで他のフィルターを適用することもでき、変換を繰り返す必要をなくして画質を最大限保つことができます。下のコマンドでは以下のオプションを使っています:
 
セカンドパスではファーストパスで作成した補正パラメータを解析して、それを使って "output-stab_final" を生成します。セカンドパスで他のフィルターを適用することもでき、変換を繰り返す必要をなくして画質を最大限保つことができます。下のコマンドでは以下のオプションを使っています:
140行目: 129行目:
 
* {{ic|unsharp}}: vid.stab の作者によって推奨されています。下の例ではデフォルトの 5:5:1.0:5:5:1.0 を使っています。
 
* {{ic|unsharp}}: vid.stab の作者によって推奨されています。下の例ではデフォルトの 5:5:1.0:5:5:1.0 を使っています。
 
* {{ic|1=fade=t=in:st=0:d=4}}: 4秒間のフェードインをファイルの冒頭に挟みます。
 
* {{ic|1=fade=t=in:st=0:d=4}}: 4秒間のフェードインをファイルの冒頭に挟みます。
* {{Tip|1=fade=t=out:st=60:d=4}}: 動画の60秒目から4秒間のフェードアウトを挟みます。
+
* {{ic|1=fade=t=out:st=60:d=4}}: 動画の60秒目から4秒間のフェードアウトを挟みます。
 
* {{ic|-c:a pcm_s16le}}: XAVC-S コーデックは pcm_s16be で記録されロスレスの pcm_s16le に変換されます。
 
* {{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 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 の [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
   
 
=== 字幕 ===
 
=== 字幕 ===
149行目: 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)
164行目: 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 の字幕が埋め込まれており、別のファイルに抽出することが可能です:
170行目: 178行目:
 
$ ffmpeg -i foo.mkv foo.ssa
 
$ ffmpeg -i foo.mkv foo.ssa
   
  +
字幕を望ましい形式 (例として [[Wikipedia:ja:SubRip|SubRip]]) に保存するには {{ic|-c:s srt}} を追加してください:
複数の字幕が存在する場合、{{ic|-map <key>:<stream>}} パラメータを使用して抽出するストリームを指定する必要があります:
 
  +
  +
$ ffmpeg -i foo.mkv -c:s srt foo.srt
  +
  +
複数の字幕が存在する場合、{{ic|-map ''key'':''stream''}} パラメータを使用して抽出するストリームを指定する必要があります:
   
 
$ ffmpeg -i foo.mkv -map 0:2 foo.ssa
 
$ ffmpeg -i foo.mkv -map 0:2 foo.ssa
176行目: 188行目:
 
==== ハードサブ ====
 
==== ハードサブ ====
   
([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|ハードサブ]]は動画に字幕を焼きこむことになります。ハードサブは無効にすることが不可能で、言語の切り替えなどもできません。
182行目: 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':
214行目: 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}} で長さを指定します。
   
228行目: 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|
247行目: 277行目:
 
$ 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
   
=== ハードウェアアクセラレーション ===
+
=== ハードウェアビデオアクセラレーション ===
{{Warning|ハードウェアアクセラレーションでエンコードができない場合、ソフトウェアエンコードを使ってください。}}
 
   
[https://trac.ffmpeg.org/wiki/HWAccelIntro ハードウェアアクセラレーション API] を使ことでエンコード性能改善することができます使用することができるコーデックは限られておりさらにソフトウェアエンコードと全く同じ結果が得られるとは限りません。
+
[https://trac.ffmpeg.org/wiki/HWAccelIntro ハードウェアアクセラレーション API] を使用することでエンコード/デコードのパフォーマンス向上させることができます。しかし特定の種類のコーデックしか使えませんし場合よっては、ソフトウェアエンコードを使ったときと同じ結果が得られるとは限りません。
   
 
==== VA-API ====
 
==== VA-API ====
Intel の CPU ({{Pkg|libva-intel-driver}} が必要) や特定の AMD GPU でオープンソースの [[AMDGPU]] ドライバー ({{Pkg|libva-mesa-driver}} が必要) を使っている場合、[[VA-API]] を使用してエンコード・デコードができます。
 
   
  +
Intel CPU ({{Pkg|intel-media-driver}} か {{Pkg|libva-intel-driver}} が必要) を使っている場合や、特定の AMD GPU でオープンソースの [[AMDGPU]] ドライバー ({{Pkg|libva-mesa-driver}} が必要) を使っている場合、[[VA-API]] を使用してエンコードとデコードができます。
[[VA-API]] を使用する場合、利用可能なパラメータやサポートされている [[Intel]] のプラットフォームなどの情報は [https://gist.github.com/Brainiarc7/95c9338a737aa36d9bb2931bed379219 GitHub gist] や [https://wiki.libav.org/Hardware/vaapi Libav ドキュメント] を見てください。
 
   
  +
利用可能なパラメータとサポートされているプラットフォームに関する情報は、[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 コーデックを使用してエンコードする例:
 
  +
  +
サポートされている H.264 コーデックを使用してエンコードする例:
   
 
$ ffmpeg -threads 1 -i file.ext -vaapi_device /dev/dri/renderD128 -vcodec h264_vaapi -vf format='nv12|vaapi,hwupload' output.mp4
 
$ 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}} の自動検出機能によって有効化されます。}}
==== Nvidia NVENC ====
 
プロプライエタリの [[NVIDIA]] ドライバーでは {{Pkg|nvidia-utils}} パッケージをインストールして NVENC でエンコードができます。サポートされている GPU は 600 シリーズ以上です ([[w:Nvidia NVENC]] や[[ハードウェアビデオアクセラレーション#フォーマット]]を参照)。
 
   
  +
クイックリファレンスとして、constant quality エンコードを行う例を以下に挙げます:
テクニックが [https://gist.github.com/Brainiarc7/8b471ff91319483cdb725f615908286e こちら gist] に載っています。NVENC は [[CUDA]] と似ているため、ターミナルセッションからでも動作します。ハードウェア NVENC は Intel の VA-API エンコーダよりも数倍高速です。
 
   
  +
$ 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
利用可能なオプションを表示するには以下のコマンドを実行 ({{ic|hevc_nvenc}} も使えます):
 
  +
  +
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 -help encoder=h264_nvenc
274行目: 313行目:
 
$ ffmpeg -i source.ext -c:v h264_nvenc -rc constqp -qp 28 output.mkv
 
$ ffmpeg -i source.ext -c:v h264_nvenc -rc constqp -qp 28 output.mkv
   
==== Nvidia NVDEC ====
+
==== Intel QuickSync (QSV) ====
  +
プロプライエタリの [[NVIDIA]] ドライバーでは {{Pkg|nvidia-utils}} パッケージをインストールして NVDEC でデコードができます。サポートされている GPU は 600 シリーズ以上です ([[w:Nvidia NVDEC]] や[[ハードウェアビデオアクセラレーション#フォーマット]]を参照)。
 
  +
[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 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 ファイルを使用してしまい、このビデオエンコーダを使用できません。エンコードを行うコマンドの例は以下のようになります:
AMD added support for H264 only video encoding on Linux through AMD Video Coding Engine (GPU encoding) with the [[AMDGPU PRO]] proprietary packages, and ffmpeg added support for AMF video encoding, so in order to encode using the h264_amf video encoder, {{AUR|amf-amdgpu-pro}} is required. You may need to link to the ICD file provided by the [[AMDGPU PRO]] packages as a variable or ffmpeg could use the open AMDGPU's ICD file and not be able to use this video encoder. An example of a command for encoding could be as follows:
 
   
 
$ 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
 
$ 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 エンコードを行う例を挙げましょう:
For a quick reference, a constant quality encoding can be achieved with:
 
   
 
$ 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
 
$ 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 から非常に小さな視覚的な損失が発生し始めます。
Tune the three -qp_(b|i|p) together being 18 visually identical and 22 starting to have very small visual loss.
 
  +
  +
=== アニメーション 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 を見てください。
   
 
== プリセットファイル ==
 
== プリセットファイル ==
   
デフォルトの[https://ffmpeg.org/ffmpeg.html#Preset-files プリセットファイル] で {{ic|~/.ffmpeg}} を作成する:
+
デフォルトの[https://ffmpeg.org/ffmpeg.html#Preset-files プリセットファイル]で {{ic|~/.ffmpeg}} を作成する:
   
 
$ cp -iR /usr/share/ffmpeg ~/.ffmpeg
 
$ cp -iR /usr/share/ffmpeg ~/.ffmpeg
313行目: 370行目:
 
=== プリセットファイルを使う ===
 
=== プリセットファイルを使う ===
   
好きな {{ic|-vcodec}} の宣言の後に {{ic|-vpre}} オプションを加えて下さい。
+
{{ic|-vcodec}} の宣言の後に {{ic|-vpre}} オプションを加えて下さい。
   
 
==== libavcodec-vhq.ffpreset ====
 
==== libavcodec-vhq.ffpreset ====
321行目: 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
 
 
* [http://www.xiph.org/ Xiph.Org] による [http://vorbis.com/ libvorbis] よりも [http://www.geocities.jp/aoyoume/aotuv/ aoTuV] の方が一般に好まれており {{AUR|libvorbis-aotuv}} パッケージとして提供されています。
 
   
== FFserver ==
+
=== 出力を簡略化 ===
   
  +
以下のオプションを組み合わせて使うことで、出力の詳細さを好きなレベルまで減らすことができます:
FFmpeg パッケージにはネットワーク経由でメディアをストリーミングできる FFserver が含まれています。使用するには {{ic|/etc/ffserver.conf}} 設定ファイルを作成して''フィード''と''ストリーム''を定義してください。フィードには ffserver に送信するメディアの送信方法を指定し、ストリームにはネットワーク上でストリーミングするためにフィードを変換する方法を指定します。[https://www.ffmpeg.org/sample.html サンプル設定ファイル] や {{man|1|ffserver|url=}} の[[man ページ]]に書かれているフィードやストリームの例も見てください。以下は Flash 動画をストリーミングする設定ファイルの例です:
 
   
  +
* {{ic|-hide_banner}}: 著作権表示、ビルドオプション、そしてライブラリのバージョンが表示されなくなります
{{hc|/etc/ffserver.conf|<nowiki>HTTPPort 8090
 
  +
* {{ic|-loglevel}}: ログレベルを調整します (微調整オプションが利用できます)。例: {{ic|-loglevel warning}}
HTTPBindAddress 0.0.0.0
 
  +
* {{ic|-nostats}}: エンコードの進捗/統計が表示されなくなります
MaxHTTPConnections 2000
 
MaxClients 1000
 
MaxBandwidth 10000
 
CustomLog -
 
 
<Feed av_feed.ffm>
 
File /tmp/av_feed.ffm
 
FileMaxSize 1G
 
ACL allow 127.0.0.1
 
</Feed>
 
 
<Stream av_stream.flv>
 
Feed av_feed.ffm
 
Format flv
 
 
VideoCodec libx264
 
VideoFrameRate 25
 
VideoSize hd1080
 
VideoBitRate 400
 
AVOptionVideo qmin 10
 
AVOptionVideo qmax 42
 
AVOptionVideo flags +global_header
 
 
AudioCodec libmp3lame
 
AVOptionAudio flags +global_header
 
 
Preroll 15
 
</Stream>
 
 
<Stream stat.html>
 
Format status
 
ACL allow localhost
 
ACL allow 192.168.0.0 192.168.255.255
 
</Stream>
 
 
<Redirect index.html>
 
URL http://www.ffmpeg.org/
 
</Redirect></nowiki>}}
 
 
設定ファイルを作成したら、サーバーを起動してメディアをフィードに送信してください。上記の例の場合、以下のコマンドを実行します:
 
 
$ ffserver &
 
$ ffmpeg -i myvideo.mkv <nowiki>http://localhost:8090/av_feed.ffm</nowiki>
 
 
{{ic|<nowiki>http://yourserver.net:8090/av_stream.flv</nowiki>}} でメディアをストリーミングすることができるようになります。
 
 
== ヒントとテクニック ==
 
   
 
=== 動画の再生時間を出力 ===
 
=== 動画の再生時間を出力 ===
400行目: 396行目:
 
$ ffprobe -v quiet -print_format json -show_format -show_streams file.ext
 
$ 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
 
$ ffmpeg -i file.ext -an -s 319x180 -vf fps=1/'''100''' -qscale:v 75 %03d.jpg
406行目: 402行目:
 
== 参照 ==
 
== 参照 ==
   
* [http://mewiki.project357.com/wiki/X264_Settings x264 Settings] - MeWiki ドキュメント
+
* [https://ffmpeg.org/ffmpeg.html FFmpeg documentation] - 公式ドキュメント
* [https://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
 
* サポートしている音声・動画ストリームの[https://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 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。