ffmpeg について


ffmpeg の記事で使われているタグ一覧

ffmpeg の使い方

Windows だとコマンドプロンプトから起動するので、実行ファイル自体を起動しても黒い画面がパッと表示してすぐに消えるだけ。起動方法は ffmpeg があるフォルダのエクスプローラーの部分で cmd を入力するとか、Shift+右クリック から「コマンドウィンドウをここで開く」などからコマンドプロンプトを起動する。出力コーデックは指定しなければ出力ファイルの拡張子を見て適宜自動で設定される。このブログでは入力ファイルと出力ファイルは基本的には拡張子(コンテナ)を記載していないので適宜求める拡張子を指定する。

ffmpeg にはコマンドの記述する順番(記述の先のほうが前)がとても重要で、入力ファイルより前に指定する「入力オプション」、入力ファイルの後に指定する「出力オプション」がある。さらに「出力オプション」にはフィルタの前に指定してフィルタに適用されるのと、フィルタの後ろに指定してフィルタに適用しないこともできる。

コマンド例
ffmpeg 入力オプション -i 入力ファイル 出力オプション フィルタ 出力ファイル
開始10秒から読み込んだ input.mp4 をそこから10秒、320×240 にリサイズして output.mp4 にエンコードするffmpeg -ss 10 -i input.mp4 -t 10 -vf scale=320:240 output.mp4

ffmpeg でなにができるのか

世間一般的には映像や音声、画像ファイルのエンコーダーとして認知されているが以下のこともできる。

  • 字幕を異なるフォーマットにエンコードできる。対応フォーマットは ffmpeg -codecs で確認できる。一般的な動画字幕である、ass, srt, dvd_subtitle の他にブラウザの字幕である webvtt にも対応している
  • 映像や音声に様々なフィルタを当てられる FFmpeg Filters Documentation
  • USB接続したウェブカメラや、HDMIキャプチャを入力と一部出力などいろいろな形で入出力ができる FFmpeg Devices Documentation
  • 対応したプロトコルに入出力できる FFmpeg Protocols Documentation
  • サーバ機能がある(廃止予定) ffserver Documentation

具体的になにができるのか

映像フィルタには色を変えるフィルタ、ノイズ除去のフィルタ、インターレース解除のフィルタ、YUV/RGB のデータを可視化するフィルタ、リサイズ、クロップなど解像度を変えるフィルタ、テキストを表示するフィルタなどがある。

音声フィルタにはハイパス・ローパスなど特定周波数の音量を変えるフィルタ、音量やサンプリング周波数を変えるフィルタ、無音検出フィルタなどがある。
フィルタなど ffmpeg の使い方はこのブログのタグから検索
カテゴリ検索 FFmpeg | ニコラボ

フィルタの記述方法

一般的にフィルタの指定方法はビデオフィルタ -vf、オーディオフィルタ -af、複合フィルタ(ビデオ、オーディオ混合)-filter_complex がある。ビデオフィルタやオーディオフィルタはそれぞれ映像だけ、音声だけしか読み込めないのに対して、複合フィルタは映像と音声どちらも扱うことができる。複合フィルタで映像と音声を切り替える場合は ;(セミコロン)を使う。

crop(切り出しフィルタ) を例にする。最初の引数の前に =(イコール) でつなげて第1引数を指定、第2引数以降は :(コロン) でつなげる。引数を指定しない場合は初期値が自動入力される。
-vf crop=x=320:y=180:w=0:h=0
オプション名は引数の順番通りに指定する場合は指定しなくてもよい。
-vf crop=320:180:0:0
複数のフィルタを同時に使う場合は、,(カンマ) で複数のフィルタをつなげる。
-vf crop=320:180:0:0,unsharp
複合フィルタの例(volume は音量を一律に上げ下げする音声フィルタ)
-filter_complex crop=320:180:0:0;volume=1.5

フィルタの効果を調べる

詳しくはこちら:映像フィルタを当てる前後のデータを見える化する

ぼかしフィルタとシャープフィルタについて

ぼかしフィルタを使うことでビットレート不足でもブロックノイズを減らすことができる。シャープフィルタを使うことで映像が鮮明になる反面ビットレート不足だとブロックノイズが乗りやすくなる。つまり、動画配信などでビットレート制限がある場合はうまくぼかしフィルタを使うことで何もしないよりも見栄えを良くすることができる。

チャンネルの順番と注意点

公式のドキュメントには plane と書いてあるが、日本語ではチャンネルの方が一般的なのでチャンネルで統一する。そしてチャンネルの順番は表記の順番になる。ffmpeg のビデオフィルタには大まかに分けて YUV で処理するもの、RGB で処理するもの、個別チャンネルをグレースケールで出力するものの3通りがある。その中で注意しなければならないのが RGB で取り込んで処理するチャンネルの順番が GBRP(Planar RGB)になるフィルタである。表記の通り順番は RGB ではなく GBR の順番になる。

具体的には以下のフィルタである。

チャンネルを選択するときの番号(opt)と選択されるチャンネル番号の一覧

option 1st plane 2nd plane 3rd plane 4th plane
0
1 1
2 2
3 1 2
4 3
5 1 3
6 2 3
7 1 2 3
8 4
9 1 4
10 2 4
11 1 2 4
12 3 4
13 1 3 4
14 2 3 4
15 1 2 3 4

特定の時間だけフィルタを当てる

詳しくはこちら:特定の区間だけフィルタを当てるタイムライン編集について

フィルタが使えない

この記事で紹介しているフィルタを使おうとして使えない場合、多くの場合でフィルタの記述を間違えているか、そのフィルタのコミットが含まれていないか、外部ライブラリを使っていてそれが含まれていない場合のどれかである。というのも ffmpeg は 2.8 以降から小数点第1位が増えるか、整数部分が増えるメジャーアップデートまでマスターで追加されたフィルタが追加されなくなっているからである。どのバージョンで新しく追加されたフィルタかを調べるには Changelog から調べられる。

ありがちな例

  • 誤字がある:コンソールに該当部分が表示されるので直す
  • : を使っている::; に置き換える
  • , が2連続している:, が連続していないか確認しあれば1つにする
  • 引数の型を間違えている:オプションは無指定で試し、それからオプション名と引数を指定する
  • split を多用して識別子の始点終点が途切れている:それぞれ改行して読みやすくして見直す
  • 目的のフィルタが使えない:ffmpeg -h=filters で確認する
  • 複数入力や複数出力のフィルタが使えない:ffmpeg -h=filters で確認し入力数、出力数を見直す

github と videolan どちらからでも調べられる
FFmpeg/Changelog at master · FFmpeg/FFmpeg
git.videolan.org Git – ffmpeg.git/blob – Changelog

ソースコードとバイナリについて

ソースコードは常に最新版のマスターと特定の区切りでまとめてアップデートされるリリースの2種類がある。バイナリは OS によって異なるサイトが公式サイトからリンクされている。Windows のバイナリは公式サイトでリンクされている Zeranoe の他に、お気に入りの動画を携帯で見よう、einguste がある。einguste は他にはない opengl 出力が可能である。お気に入りの動画を携帯で見ようで配布している ffmpeg にも opengl に対応している。

Download FFmpeg:公式サイト
Zeranoe FFmpeg – Builds:マスターとリリースで更新。更新頻度は高めだが最近は更新が停滞することもある
お気に入りの動画を携帯で見よう:更新は不定期。最適化の種類が複数ある
einguste:マスターとリリースで更新。更新は停止中