FFmpeg
プロジェクトのホームページ より:
- FFmpeg は音声や動画ストリームを記録・変換するためのクロスプラットフォームの完全なソリューションです。先進的な音声・動画コーデックライブラリである libavcodec が含まれています。
目次
パッケージのインストール
公式リポジトリや AUR から様々な関連プロジェクトをインストールすることができます:
- ffmpeg – 公式パッケージ
その他のパッケージ:
- ffmpeg-gitAUR – 開発版
- ffmpeg-fullAUR – 可能なかぎり多くの機能を付けてビルドしたバージョン
フォーク:
エンコードの例
スクリーンキャスト
FFmpeg には x11grab と ALSA 仮想デバイスが含まれており、ユーザーの画面と音声入力を記録することが可能です。
まずはロスレスエンコードで test.mkv
を作成してみましょう:
$ ffmpeg -f x11grab -video_size 1920x1080 -i $DISPLAY -f alsa -i default -c:v ffvhuff -c:a flac test.mkv
-video_size
には録画する領域のサイズを指定します。スクリーンや録画領域の位置を変更する方法は FFmpeg のマニュアルをチェックしてください。さらに MKV をより小さな WebM ファイルに加工することができます:
$ ffmpeg -i test.mkv -c:v libvpx -c:a libvorbis -b:v 2000k -q:a 3 test.webm
ウェブカメラの録画
FFmpeg は Video4Linux2 デバイスからの入力をサポートしています。ウェブカメラが /dev/video0
として正しく認識されていれば、次のコマンドでウェブカメラからの動画を記録できます:
$ ffmpeg -f v4l2 -s 640x480 -i /dev/video0 output.mpg
上のコマンドでは無音声の動画が作られます。マイクから音源を入れることも可能です。次のコマンドで ALSA のデフォルトの録音デバイスからのストリームが動画に入ります:
$ ffmpeg -f alsa -i default -f v4l2 -s 640x480 -i /dev/video0 output.mpg
ALSA バックエンドのある PulseAudio を使うには:
$ ffmpeg -f alsa -i pulse -f v4l2 -s 640x480 -i /dev/video0 output.mpg
もっと高品質に録音するには、高品質なコーデックを使って出力をエンコードしてみてください:
$ ffmpeg -f alsa -i default -f v4l2 -s 640x480 -i /dev/video0 -acodec flac \ -vcodec libx264 output.mkv
VOB から他のコンテナに
VOB ファイルを一つのストリームに連結して MPEG-2 にするには:
$ cat f0.VOB f1.VOB f2.VOB | ffmpeg -i - out.mp2
x264 ロスレス
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
どちらでも出力のクオリティは同じです。
x265
x265 ファイルをエンコードするには、-aspect <width:height>
でファイルのアスペクト比を指定する必要があります。例:
$ ffmpeg -i test.mp4 -c:v hevc -aspect 1920:1080 test_hevc.mp4
シングルパス MPEG-2 (ニアロスレス)
DVD 標準のパラメータに FFmpeg を自動的に設定することができます。~30 FPS の DVD MPEG-2 にエンコードするには:
$ 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
x264: constant rate factor
出力する品質を指定したいときに使います。一般的に使われているのは最高の -crf
で、これでも許容範囲内の画質になります。値が低いほど画質は高くなります。0はロスレス、18は見た目がロスレス、そして23がデフォルトの値です。意味があるのは18から28の範囲になります。一番遅い -preset
を使うなら辛抱する必要があります。詳しくは x264 Encoding Guide を見て下さい。
$ ffmpeg -i video -vcodec libx264 -preset slow -crf 22 -acodec libmp3lame -aq 4 output.mkv
-tune
オプションを使うことでエンコードされるメディアの中身とタイプにあった設定にすることができます。
YouTube
YouTube に動画をアップロードする前にエンコードしてサイズを切りそろえるのにも FFmpeg は便利です。次の一行で入力したファイルから mkv コンテナを出力します。
$ ffmpeg -i video -c:v libx264 -crf 18 -preset slow -pix_fmt yuv420p -c:a copy output.mkv
詳細についてはフォーラムを見て下さい。一番目の引数に入力するファイルの名前を、二番目の引数に .mkv コンテナのファイルの名前を指定するカスタムエイリアス ytconvert
を作ることもできます。以下を ~/.bashrc
に追加してください:
youtubeConvert(){ ffmpeg -i $1 -c:v libx264 -crf 18 -preset slow -pix_fmt yuv420p -c:a copy $2.mkv } alias ytconvert=youtubeConvert
Arch Linux フォーラムのスレッドも見て下さい。
ツーパス x264 (高画質)
マルチパスでは初めに音声を無効にして動画の統計だけを記録します:
$ 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
コンテナの形式は出力ファイルの拡張子から自動的に検出して変換されます (.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
ツーパス MPEG-4 (高画質)
マルチパスでは初めに音声を無効にして動画の統計だけを記録します:
$ 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
コンテナの形式は出力ファイルの拡張子から自動的に検出して変換されます (.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
-vcodec mpeg4
にthreads
=n
>1
を使うと動き推定の効きが悪くなって画質や圧縮効率が落ちる ことがあります。- 上のツーパス MPEG-4 の例では MP4 コンテナへの出力も対応しています (
.avi
を.mp4
に置き換えてください)。
出力するファイルのサイズからビットレートを計算する
- (出力するファイルのサイズ (MB) - 音声ファイルのサイズ (MB) ) x 8192 kb/MB / メディアの秒数 (s) = ビットレート (kb/s)
- (3900 MB - 275 MB) = 3625 MB x 8192 kb/MB / 8830 s = 3363 kb/s でちょうど合計 3900 MB のサイズのファイルが出力されます
字幕
抽出
MPEG-2 や Matroska などのコンテナファイルに埋め込まれた字幕を抽出して、SRT や SSA などの字幕形式に変換することができます。
- ファイルに字幕ストリームが含まれているか確認してください:
$ ffprobe 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
ハードサブ
(FFmpeg wiki の記事 に基づく説明)
ハードサブは動画に字幕を焼きこむことになります。ハードサブは無効にすることが不可能で、言語の切り替えなどもできません。
foo.mpg
にfoo.ssa
の字幕を重ねるには:
$ ffmpeg -i foo.mpg -c copy -vf subtitles=foo.ssa out.mpg
ボリュームゲイン
音量は256の倍数で変更します。256 = 100% が通常のボリュームです。400などの半端な値も使うことができます。
-vol 256 = 100% -vol 512 = 200% -vol 768 = 300% -vol 1024 = 400% -vol 2048 = 800%
MP3 ファイルのボリュームを2倍にするには (512 = 200%):
$ ffmpeg -i file.mp3 -vol 512 louder_file.mp3
Ogg ファイルのボリュームを4倍にするには (1024 = 400%):
$ ffmpeg -i file.ogg -vol 1024 louder_file.ogg
ゲインのメタデータは出力するファイルにだけ書き込まれるので注意してください。mp3gain や ogggain と違って、元の音声ファイルには変更が加えられません。
音声を抽出する
$ ffmpeg -i video.mpg
... 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 libvo-aacenc -ab 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 \ -ab 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
プリセットファイル
デフォルトのプリセットファイル で ~/.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 プリセットの拡張子
ツーパス 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)
-aq 4
= 128 kb/s-aq 5
= 160 kb/s-aq 6
= 192 kb/s-aq 7
= 224 kb/s-aq 8
= 256 kb/s
- Xiph.Org による libvorbis よりも aoTuV の方が一般に好まれており AUR で libvorbis-aotuv として提供されています。
パッケージの削除
pacman はパッケージのインストールで作成されたデフォルトの設定ファイル以外の設定ファイルを削除しません。ユーザーが作成したプリセットのファイルなども残ります。
参照
- x264 Settings - MeWiki ドキュメント
- FFmpeg documentation - 公式ドキュメント
- Encoding with the x264 codec - MEncoder ドキュメント
- H.264 encoding guide - Avidemux wiki
- Using FFmpeg - Linux how to pages
- サポートしている音声・動画ストリームのリスト