# FFmpeg (日本語)

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

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

## パッケージのインストール

公式リポジトリや AUR から様々な関連プロジェクトをインストールすることができます:

- ffmpeg – 公式パッケージ

その他のパッケージ:

- ffmpeg-git – 開発版
- ffmpeg-full – 可能なかぎり多くの機能を付けてビルドしたバージョン

フォーク:

- ffmbc – ブロードキャスト用
- libav-git – `ffmpeg` の代わりに `avconv` という名前のバイナリを提供

## エンコードの例

### スクリーンキャスト

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

Tip: (libvo-aacenc を有効にして ffmpeg をコンパイルしたのに) `Unknown encoder 'libvo-aacenc'` エラーが発生する場合は、ハイフンの代わりにアンダースコアを使って `-acodec libvo_aacenc` で試行してください。

### ツーパス 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` で長さを指定します。

### 音声を除去する

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 \
    -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

Note: Removing undesired audio streams allows for additional bits to be allocated towards improving video quality.

### ファイルを分割する

`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 (高画質)

First pass of a multipass (bitrate) ratecontrol transcode:

    $ ffmpeg -i video.mpg -an -vcodec mpeg4 -pass 1 -vpre vhq -f rawvideo -y /dev/null

Ratecontrol based on the video statistics logged from the first pass:

    $ 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
- サポートしている音声・動画ストリームのリスト

Category:

- Audio/Video (日本語)