「FFmpeg」の版間の差分
(→プリセットファイル: 同期) |
(→エンコードの例: 同期) |
||
20行目: | 20行目: | ||
{{Note| |
{{Note| |
||
− | * |
+ | * パラメータを正しい順序で指定することが重要です (例: input、video、filters、audio、output)。順序を間違うと、パラメータがスキップされたり、FFmpeg が実行されなかったりする場合があります。 |
− | * FFmpeg は |
+ | * FFmpeg は、使用できる CPU スレッド数を自動的に選択するはずです。しかし、パラメータ {{ic|-threads ''number''}} を使って、使用できるスレッド数を強制したほうが良い場合もあります。 |
}} |
}} |
||
+ | |||
+ | [https://trac.ffmpeg.org/wiki#Encoding FFmpeg のエンコード wiki] と {{man|1|ffmpeg|EXAMPLES}} を参照してください。 |
||
=== スクリーンキャプチャ === |
=== スクリーンキャプチャ === |
||
− | FFmpeg には [ |
+ | FFmpeg には [https://www.ffmpeg.org/ffmpeg-devices.html#x11grab x11grab] と [https://www.ffmpeg.org/ffmpeg-devices.html#alsa-1 ALSA] の仮想デバイスが含まれており、ユーザのディスプレイ全体と音声入力をキャプチャすることができます。 |
+ | スクリーンショットを撮って {{ic|screen.png}} に保存するには: |
||
− | まずはロスレスエンコードで {{ic|test.mkv}} を作成してみましょう: |
||
− | $ ffmpeg -f x11grab -video_size 1920x1080 -i $DISPLAY - |
+ | $ ffmpeg -f x11grab -video_size 1920x1080 -i $DISPLAY -vframes 1 screen.png |
− | {{ic|-video_size}} |
+ | ここで、{{ic|-video_size}} はキャプチャする領域のサイズを指定します。 |
+ | ロスレスエンコードで音声なしのスクリーンキャストを撮って {{ic|screen.mkv}} に保存するには: |
||
− | $ ffmpeg -i test.mkv -c:v libvpx -c:a libvorbis -b:v 2000k -q:a 3 test.webm |
||
+ | |||
+ | $ 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 |
+ | $ 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'' |
+ | $ 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" を作成: |
||
− | + | * 補正パラメータを記録してファイルだけに書き出す: {{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" を生成します。セカンドパスで他のフィルターを適用することもでき、変換を繰り返す必要をなくして画質を最大限保つことができます。下のコマンドでは以下のオプションを使っています: |
||
* {{ic|unsharp}}: vid.stab の作者によって推奨されています。下の例ではデフォルトの 5:5:1.0:5:5:1.0 を使っています。 |
* {{ic|unsharp}}: vid.stab の作者によって推奨されています。下の例ではデフォルトの 5:5:1.0:5:5:1.0 を使っています。 |
||
− | * {{ |
+ | * {{Tip|1=fade=t=in:st=0:d=4}}: 4秒間のフェードインをファイルの冒頭に挟みます。 |
* {{Tip|1=fade=t=out:st=60:d=4}}: 動画の60秒目から4秒間のフェードアウトを挟みます。 |
* {{Tip|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 |
||
=== 字幕 === |
=== 字幕 === |
||
152行目: | 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) |
||
167行目: | 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 の字幕が埋め込まれており、別のファイルに抽出することが可能です: |
||
173行目: | 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 |
||
179行目: | 188行目: | ||
==== ハードサブ ==== |
==== ハードサブ ==== |
||
− | ([ |
+ | (FFmpeg wiki の記事の [https://trac.ffmpeg.org/wiki/HowToBurnSubtitlesIntoVideo HowToBurnSubtitlesIntoVideo] に基づく説明) |
[[Wikipedia:Hardsub|ハードサブ]]は動画に字幕を焼きこむことになります。ハードサブは無効にすることが不可能で、言語の切り替えなどもできません。 |
[[Wikipedia:Hardsub|ハードサブ]]は動画に字幕を焼きこむことになります。ハードサブは無効にすることが不可能で、言語の切り替えなどもできません。 |
||
185行目: | 194行目: | ||
* {{ic|foo.mpg}} に {{ic|foo.ssa}} の字幕を重ねるには: |
* {{ic|foo.mpg}} に {{ic|foo.ssa}} の字幕を重ねるには: |
||
− | $ ffmpeg -i foo.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% |
||
+ | $ ffmpeg -i input.flac -af '''volume=1.5''' ouput.flac |
||
− | -vol 512 = 200% |
||
+ | |||
− | -vol 768 = 300% |
||
+ | ここで、{{ic|1=volume=1.5}} によって 150% のボリュームゲインとなります。1.5 から 0.5 にすると、ボリュームが半分になります。ボリュームフィルタにはデシベル単位を渡すこともできます。{{ic|1=volume=3dB}} とすると、ボリュームが 3dB 増え、{{ic|1=volume=-3dB}} とすると 3dB 減ります。 |
||
− | -vol 1024 = 400% |
||
+ | |||
− | -vol 2048 = 800% |
||
+ | {{Note|ファイルのボリュームゲインを倍にすることは、ボリュームを倍にすることと同じではありません。実験して正しいボリュームを見つける必要があります。}} |
||
+ | |||
+ | {{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}} も追加しています。 |
||
− | [[Wikipedia:ja:Mp3|MP3]] ファイルのボリュームを2倍にするには '''(512 = 200%)''': |
||
− | $ ffmpeg -i ''file''.mp3 -vol 512 ''louder_file''.mp3 |
||
+ | {{Note|このフィルタはツーパスモードもサポートしています。最初の実行から測定されたラウドネス値を抽出し、その値を使って2回めの実行で線形ノーマライゼーションを行います。詳細は [https://ffmpeg.org/ffmpeg-filters.html#loudnorm ffmpeg loudnorm ドキュメント]を参照してください。}} |
||
− | [[Wikipedia:ja:Ogg|Ogg]] ファイルのボリュームを4倍にするには '''(1024 = 400%)''': |
||
− | $ ffmpeg -i ''file''.ogg -vol 1024 ''louder_file''.ogg |
||
+ | {{Tip|ファイルの現在のラウドネスを調べるには、{{ic|1=ffmpeg -i input.flac -af loudnorm=print_format=summary -f null -}} を使ってください。}} |
||
− | ゲインのメタデータは出力するファイルにだけ書き込まれるので注意してください。mp3gain や ogggain と違って、元の音声ファイルには変更が加えられません。 |
||
=== 音声を抽出する === |
=== 音声を抽出する === |
||
− | {{hc|$ ffmpeg -i ''video''.mpg| |
+ | {{hc|$ ffmpeg -i ''video''.mpg output.ext| |
... |
... |
||
Input #0, avi, from '''video''.mpg': |
Input #0, avi, from '''video''.mpg': |
||
217行目: | 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}} で長さを指定します。 |
||
231行目: | 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 \ |
||
− | - |
+ | -b:a 128k -ar 48000 -ac 2 ''video''.mkv |
{{hc|$ ffmpeg -i ''video''.mkv| |
{{hc|$ ffmpeg -i ''video''.mkv| |
||
250行目: | 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|ハードウェアアクセラレーションでエンコードができない場合、ソフトウェアエンコードを使ってください。}} |
||
+ | Encoding/decoding performance may be improved by using [https://trac.ffmpeg.org/wiki/HWAccelIntro hardware acceleration API's], however only a specific kind of codec(s) are allowed and/or may not always produce the same result when using software encoding. |
||
− | [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]] を使用してエンコード・デコードができます。 |
||
+ | [[VA-API]] can be used for encoding and decoding on Intel CPUs (requires {{Pkg|intel-media-driver}} or {{Pkg|libva-intel-driver}}) and on certain AMD GPUs when using the open-source [[AMDGPU]] driver (requires {{Pkg|libva-mesa-driver}}). |
||
− | [[VA-API]] を使用する場合、利用可能なパラメータやサポートされている [[Intel]] のプラットフォームなどの情報は [https://gist.github.com/Brainiarc7/95c9338a737aa36d9bb2931bed379219 GitHub gist] や [https://wiki.libav.org/Hardware/vaapi Libav ドキュメント] を見てください。 |
||
+ | See the [https://trac.ffmpeg.org/wiki/Hardware/VAAPI FFmpeg documentation] or [https://wiki.libav.org/Hardware/vaapi Libav documentation]{{Dead link|2023|04|23|status=domain name not resolved}} for information about available parameters and supported platforms. |
||
+ | An example of encoding using the supported H.264 codec: |
||
− | 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 is generally enabled by {{Pkg|ffmpeg}}'s autodetect feature during build time, as long as it detects the respective headers and libraries included in {{Pkg|libva}}, which should be a dependency of the FFmpeg package.}} |
||
− | ==== Nvidia NVENC ==== |
||
− | プロプライエタリの [[NVIDIA]] ドライバーでは {{Pkg|nvidia-utils}} パッケージをインストールして NVENC でエンコードができます。サポートされている GPU は 600 シリーズ以上です ([[w:Nvidia NVENC]] や[[ハードウェアビデオアクセラレーション#フォーマット]]を参照)。 |
||
+ | For a quick reference, a constant quality encoding can be achieved with: |
||
− | テクニックが [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 |
||
+ | |||
+ | If using hevc_vaapi, tune -qp between 25 (visually identical) and more (28 starts to have very small visual loss). If using h264_vaapi, tune between 18 (visually identical) and more (20 starts to have very small visual loss). Also, hevc_vaapi seems to encode 50% faster than h264_vaapi. |
||
+ | |||
+ | ==== NVIDIA NVENC/NVDEC ==== |
||
+ | |||
+ | [[Wikipedia:Nvidia NVENC|NVENC]] and [[Wikipedia:Nvidia NVDEC|NVDEC]] can be used for encoding/decoding when using the proprietary [[NVIDIA]] driver with the {{Pkg|nvidia-utils}} package installed. Minimum supported GPUs are from [[Wikipedia:GeForce 600 series|600 series]], see [[Hardware video acceleration#NVIDIA]] for details. |
||
+ | |||
+ | [https://web.archive.org/web/20190808223352/https://gist.github.com/Brainiarc7/8b471ff91319483cdb725f615908286e This old gist] provides some techniques. NVENC is somewhat similar to [[CUDA]], thus it works even from terminal session. Depending on hardware NVENC is several times faster than Intel's VA-API encoders. |
||
+ | To print available options execute ({{ic|hevc_nvenc}} may also be available): |
||
− | 利用可能なオプションを表示するには以下のコマンドを実行 ({{ic|hevc_nvenc}} も使えます): |
||
$ ffmpeg -help encoder=h264_nvenc |
$ ffmpeg -help encoder=h264_nvenc |
||
+ | Example usage: |
||
− | 使用例: |
||
$ 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 |
||
− | ==== |
+ | ==== 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] uses media processing capabilities of an [[Intel]] GPU to decode and encode fast, enabling the processor to complete other tasks and improving system responsiveness. |
||
+ | |||
+ | This requires a '''libmfx''' runtime implementation to be installed. '''libmfx''' is a dispatcher library that loads an implementation at runtime based on the underlying hardware platform. When running under [[Wikipedia:Broadwell_(microarchitecture)|Broadwell]] to [[Wikipedia:Rocket_Lake|Rocket Lake]] GPUs, it will load {{Pkg|intel-media-sdk}} as the runtime implementation. When running under [[Wikipedia:Alder_Lake|Alder Lake]] and newer GPUs, '''libmfx''' will load {{Pkg|onevpl-intel-gpu}}. The runtime implementation cannot be changed or chosen on systems with a single Intel GPU, and the corresponding implementation should be installed following the hardware where it will run. |
||
+ | |||
+ | Failure to install said runtime will result in errors like the following: |
||
+ | |||
+ | [AVHWDeviceContext @ 0x558283838c80] Error initializing an MFX session: -3. |
||
+ | Device creation failed: -1313558101. |
||
+ | |||
+ | The usage of QuickSync is describe in the [https://trac.ffmpeg.org/wiki/Hardware/QuickSync FFmpeg Wiki]. It is recommended to use [[VA-API]] [https://trac.ffmpeg.org/wiki/Hardware/VAAPI] with either the ''iHD'' or ''i965'' driver instead of using ''libmfx'' directly, see the FFmpeg Wiki section ''Hybrid transcode'' for encoding examples and [[Hardware video acceleration#Configuring VA-API]] for driver instructions. |
||
==== AMD AMF ==== |
==== AMD AMF ==== |
||
291行目: | 336行目: | ||
Tune the three -qp_(b|i|p) together being 18 visually identical and 22 starting to have very small visual loss. |
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 を見てください。 |
||
== プリセットファイル == |
== プリセットファイル == |
2023年7月23日 (日) 21:51時点における版
プロジェクトのホームページ より:
- FFmpeg は、音声と動画を記録、変換、そしてストリーミングするための完全でクロスプラットフォームなソリューションです。先進的な音声・動画コーデックライブラリである libavcodec が含まれています。
目次
インストール
開発版は ffmpeg-gitAUR パッケージでインストールできます。可能な限り多くのオプション機能を有効化してビルドする ffmpeg-fullAUR も存在します。
エンコードの例
FFmpeg のエンコード wiki と ffmpeg(1) § EXAMPLES を参照してください。
スクリーンキャプチャ
FFmpeg には x11grab と ALSA の仮想デバイスが含まれており、ユーザのディスプレイ全体と音声入力をキャプチャすることができます。
スクリーンショットを撮って 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 には video4linux2 と ALSA の入力デバイスが含まれています。これらにより、ウェブカメラと音声入力をキャプチャすることができます。
以下のコマンドは、ウェブカメラから音声無しで動画を録画し 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
どちらでも出力のクオリティは同じです。
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 を使っています。- : 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.mpg
にfoo.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 減ります。
ボリュームノーマライゼーション
loudnorm フィルタによるノーマライゼーションにより、平均ボリュームとピークボリュームを特定の値にすることができます。fmpeg のデフォルトの平均ラウドネス、ピークラウドネス、そしてレンジラウドネスの目標値 (それぞれ、-24 LUFS、-2 dBTP、7 LU) を使って、ファイルの知覚ラウドネスを正規化するには、以下のコマンドを使用してください:
$ ffmpeg -i input.flac -af loudnorm output.flac
別のラウドネスプロファイルを得るには、loudnorm フィルタのパラメータ i
、tp
、そして 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
も追加しています。
音声を抽出する
$ 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
で長さを指定します。
音声を除去する
- 一番目の動画ストリーム (
-map 0:0
) と二番目の AC-3 音声ストリーム (-map 0: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
ハードウェアビデオアクセラレーション
Encoding/decoding performance may be improved by using hardware acceleration API's, however only a specific kind of codec(s) are allowed and/or may not always produce the same result when using software encoding.
VA-API
VA-API can be used for encoding and decoding on Intel CPUs (requires intel-media-driver or libva-intel-driver) and on certain AMD GPUs when using the open-source AMDGPU driver (requires libva-mesa-driver). See the FFmpeg documentation or Libav documentation[リンク切れ 2023-04-23] for information about available parameters and supported platforms.
An example of encoding using the supported H.264 codec:
$ ffmpeg -threads 1 -i file.ext -vaapi_device /dev/dri/renderD128 -vcodec h264_vaapi -vf format='nv12|vaapi,hwupload' output.mp4
For a quick reference, a constant quality encoding can be achieved with:
$ 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
If using hevc_vaapi, tune -qp between 25 (visually identical) and more (28 starts to have very small visual loss). If using h264_vaapi, tune between 18 (visually identical) and more (20 starts to have very small visual loss). Also, hevc_vaapi seems to encode 50% faster than h264_vaapi.
NVIDIA NVENC/NVDEC
NVENC and NVDEC can be used for encoding/decoding when using the proprietary NVIDIA driver with the nvidia-utils package installed. Minimum supported GPUs are from 600 series, see Hardware video acceleration#NVIDIA for details.
This old gist provides some techniques. NVENC is somewhat similar to CUDA, thus it works even from terminal session. Depending on hardware NVENC is several times faster than Intel's VA-API encoders.
To print available options execute (hevc_nvenc
may also be available):
$ ffmpeg -help encoder=h264_nvenc
Example usage:
$ ffmpeg -i source.ext -c:v h264_nvenc -rc constqp -qp 28 output.mkv
Intel QuickSync (QSV)
Intel® Quick Sync Video uses media processing capabilities of an Intel GPU to decode and encode fast, enabling the processor to complete other tasks and improving system responsiveness.
This requires a libmfx runtime implementation to be installed. libmfx is a dispatcher library that loads an implementation at runtime based on the underlying hardware platform. When running under Broadwell to Rocket Lake GPUs, it will load intel-media-sdk as the runtime implementation. When running under Alder Lake and newer GPUs, libmfx will load onevpl-intel-gpu. The runtime implementation cannot be changed or chosen on systems with a single Intel GPU, and the corresponding implementation should be installed following the hardware where it will run.
Failure to install said runtime will result in errors like the following:
[AVHWDeviceContext @ 0x558283838c80] Error initializing an MFX session: -3. Device creation failed: -1313558101.
The usage of QuickSync is describe in the FFmpeg Wiki. It is recommended to use VA-API [2] with either the iHD or i965 driver instead of using libmfx directly, see the FFmpeg Wiki section Hybrid transcode for encoding examples and Hardware video acceleration#Configuring VA-API for driver instructions.
AMD AMF
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, amf-amdgpu-proAUR 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
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
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 を見てください。
プリセットファイル
デフォルトのプリセットファイルで ~/.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
参照
- FFmpeg documentation - 公式ドキュメント
- FFmpeg Wiki - 公式 wiki
- Encoding with the x264 codec - MEncoder ドキュメント
- H.264 encoding guide - Avidemux wiki
- Using FFmpeg - Linux how to pages
- サポートしている音声・動画ストリームのリスト