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

ffmpeg の使い方

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

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

コマンド例
ffmpeg グローバルオプション 入力オプション -i 入力ファイル 出力オプション フィルタ 出力コーデック 出力ファイル
「入力オプション」で開始10秒(-ss 10)から読み込んだ input.mp4「入力ファイル」を「出力オプション」で動画時間が10秒(-t 10)の 320 x 240 に「ビデオフィルタ」(-vf)でリサイズ(scale=320:240)して、「出力ビデオコーデック」は libx264、「出力オーディオコーデック」はコピーして「出力ファイル」output.mp4 にエンコードする。
ffmpeg -ss 10 -i input.mp4 -t 10 -vf scale=320:240 -vcodec libx264 -acodec copy output.mp4

ラジオ配信などで映像を無効にし音声コピーと同時に、映像を無効にし 1.5倍速にして aac にエンコードする例。
ffmpeg -i input -vn -c copy output.m4a -af atempo=1.5 -vn -acodec aac output-1.5x.m4a

【ffmpeg】倍速再生できる動画にエンコードする

ffmpeg でなにができるのか

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

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

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

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

音声フィルタにはハイパス・ローパスなど特定周波数の音量を変えるフィルタ、音量やサンプリング周波数を変えるフィルタ、無音検出フィルタなどがある。

フィルタなど ffmpeg の使い方はこのブログのタグから検索
カテゴリ検索 FFmpeg | ニコラボ

フィルタの記述方法

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

数値の指定は何も指定しないと既定値が指定される。指定にはオプション名を指定する場合と指定しない場合があるが、指定しない場合は ffmpeg -h filter=フィルタ名 で表示される順番に指定する必要がある。この順番と公式サイトの順番が一致しないことがたまにあるが、ffmpeg -h filter=フィルタ名 の順番が正しい。既定値以外を指定する場合は別途オプション名を指定して値を指定する。

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

一未満の値の場合

[float] などで 一未満の値を指定するときに 0.5 を .5 と指定することが出来る。

識別子の省略

入力するデータが特定できるときや、複数出力するフィルタで1出力を続けてフィルタでつなぐときに識別子を省略できる。

1、2入力に映像が1つだけある場合は以下のように識別子を省略できる
ffmpeg -i input1 -i input2 -filter_complex [0][1]overlay output
ffmpeg -i input1 -i input2 -filter_complex overlay output

複数出力するフィルタの1出力にフィルタでつなげる
このときは ,(カンマ)でつなげ、複数入力できるフィルタの最後に割り当てられる
ffmpeg -i input -filter_complex split[0][1];[0][1]vstack output
ffmpeg -i input -filter_complex split[0],[0]vstack output
ffmpeg -i input -filter_complex split,vstack output

flag オプションを複数つける

-flag +hoge1+hoge2 のように + でつなげる

フィルタの効果を調べる

映像フィルタを当てる前後のデータを見える化する

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

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

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

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

YUV の plane の詳しい順番は以下を参照。
YUVフォーマット及び YUVとRGBの変換

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

指定したオプション番号(option)とフィルタなどで選択されるチャンネルの順番一覧。
例えばオプションで 6 を指定すると、右を見て 2 と 3 が選択される。これは YUV ならば 2番目と3番目のチャンネルがフィルタ適応の対象になる。適応されなかった1番目と4番目は何もせずに出力することになる。

ちなみにこれの覚え方があって二進法で各チャンネルのオンオフを決めている。1111(2) ならば4チャンネルすべてが有効化される。つまり 1 x 2^3 + 1 x 2^2 + 1 x 2^1 + 1 x 2^0 = 15 で表される。他の例では1番目と3番目のチャンネルを有効にするには 0101(2), 0 x 2^3 + 1 x 2^2+0 x 2^1 + 1 x 2^0 = 5 で 5 をオプションで指定する。

option\Plane 1st (Y,Y,R,G) 2nd (U,V,G,B) 3rd (V,U,B,R) 4th (a)
空白 0 = 0 x 2^0(off) 空白 0 = 0 x 2^1(off) 空白 0 = 0 x 2^2(off) 空白 0 = 0 x 2^3(off)
1 = 1 x 2^0(on) 2 = 1 x 2^1(on) 4 = 1 x 2^2(on) 8 = 1 x 2^3(on)
0
1 1
2 2
3 1 2
4 4
5 1 4
6 2 4
7 1 2 4
8 8
9 1 8
10 2 8
11 1 2 8
12 4 8
13 1 4 8
14 2 4 8
15 1 2 4 8

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

特定の区間だけフィルタを当てるタイムライン編集について
2入力する映像のフィルタを詳しく設定する
時間でフィルタに強弱をつける

特定のデータだけ選んで出力する

いわゆるチャンネルマッピングのこと。出力オプションの map で指定できる。字幕を扱う場合もこちらを参照。そのほかに出力方法の指定に、映像コーデック、音声コーデック、字幕コーデック、データがある。

ffmpeg -codecs で対応コーデックを調べられる

  • 映像コーデック指定
    -vcodec hogehoge, -c:v hogehoge, -vn(映像出力しない)
  • 音声コーデック
    -acodec hogehoge, -c:a hogehoge, -an(音声出力しない)
  • 字幕コーデック
    -scodec hogehoge, -c:s hogehoge, -sn(字幕出力しない)
  • データ出力
    -dn(データ出力しない)

マルチトラックの動画の作り方
ffmpeg で複数出力

動画から画像、画像から動画を出力する

動画から特定フレームを画像で出力する方法

映像の特定の場所にマスクする

特定の色を YUV なら chromakey フィルタ、RGB なら colorkey フィルタを使って色を指定して透過することでその部分だけマスクできる。その部分に使い分けたいフィルタを当てて overlay フィルタで透過した部分を上に、元の映像を下に重ねることでマスクした部分にフィルタを当てないことができる。

ffmpeg でクロマキー合成
ffmpeg でクロマキー合成 その2
明るいところ、暗いところにフィルタを当てる
マスクして2入力を合わせる maskedmerge
ffmpeg でエッジマスク
前後フレームの差分で動いた部分だけマスクする モーションマスク
閾値の指定で2つのフィルタを使い分けやすくする threshold

指定時間に分割、または切り取る

ffmpeg で後ろから読み込みが可能に
ffmpeg で指定秒ごとに分割する方法
ffmpeg で先頭と後ろを一度にカットする
ffmpeg で時間単位やフレーム単位でカットする方法

映像のテストソースを作る

ffmpeg で使える映像のテストソース

パス指定とエスケープ

詳しくは:FFmpeg Filters Documentation : Notes on filtergraph escaping

一つ上のディレクトリを指定する例

ffplay -f lavfi -i movie=../420p.mp4
以下の動画は現在のディレクトリ(Lドライブのトップディレクトリ)に Cache フォルダがあり、その中に 420p.mp4 がある。

movie, amovie 入力の設定内容

相対パスの具体例

読み込み可能
ffplay -f lavfi -i movie=Cache/420p.mp4
ffplay -f lavfi -i movie=Cache\/420p.mp4
ffplay -f lavfi -i movie='Cache\/420p.mp4'
ffplay -f lavfi -i "movie=Cache\/420p.mp4"
ffplay -f lavfi -i "movie='Cache\/420p.mp4'"

読み込み不可能
ffplay -f lavfi -i movie=Cache\420p.mp4
ffplay -f lavfi -i 'movie=Cache\/420p.mp4'

絶対パスの具体例

読み込み可能
ffplay -f lavfi -i movie='L\:/Cache/420p.mp4'
ffplay -f lavfi -i movie='L\:\/Cache\/420p.mp4'

読み込み不可能
ffplay -f lavfi -i movie=L:/Cache/420p.mp4
ffplay -f lavfi -i movie=L\:/Cache/420p.mp4
ffplay -f lavfi -i movie=L\:\/Cache\/420p.mp4
ffplay -f lavfi -i movie='L:/Cache/420p.mp4'
ffplay -f lavfi -i movie="L:\Cache\420p.mp4"
ffplay -f lavfi -i movie="L\:/Cache/420p.mp4"
ffplay -f lavfi -i movie="L\:\/Cache\/420p.mp4"

http ソースを入力する例

画像入力なので -loop 1setpts フィルタを追加している
ffplay -f lavfi -loop 1 -i "movie='http\://dic.nicovideo.jp/img/logo_nicopedia.gif',setpts=PTS-STARTPTS"

バッチファイルから実行する

日本語ファイル名やパスの場合は文字コードを Shift-JIS に変えてバッチファイルを保存する。

-i で読み込む
ffplay -i "F:video\input.mp4"
pause

movie で読み込む
ffplay -f lavfi -i movie='F\:video/input.mp4'
pause

フレームレートについて

ffmpeg でのフレームレート設定の違い

フィルタが使えない

この記事で紹介しているフィルタを使おうとして使えない場合、多くの場合でフィルタの記述を間違えているか、そのフィルタのコミットが含まれていないか、外部ライブラリを使っていてそれが含まれていない場合のどれかである。というのも 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 がある。最新版は Windows XP が非対応になったが、お気に入りの動画を携帯で見ようで配布している ffmpeg は Windows XP に対応している。

Zeranoe は 3.3 以降で以前まで入っていたライブラリが入らなくなったので必要ならば古いのを使うか、お気に入りの動画を携帯で見ようのバイナリを使う。具体的な例では以下のライブラリが抜けた。
--enable-frei0r --enable-libbs2b --enable-libcaca --enable-libgsm --enable-libilbc --enable-libmodplug --enable-librtmp

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

ffplay について

出力ファイル指定が不要なので入力ファイル指定に使う -i は付けなくても入力ファイルとして扱う。また1ファイルしか入力できないが、movie, amovie を使えば複数ファイルが入力できる。ただしシークはできなくなる。

movie, amovie 入力の設定内容

Zeranoe の Windows バイナリは ffplay で音が出ないので、音声が必要ならば「お気に入りの動画を携帯で見よう」のバイナリを使う。または以下のコマンドを使うとそのセッションだけ音が出るようになる。

set SDL_AUDIODRIVER=directsound

#6891 (FFplay: WASAPI can’t initialize audio client (zeranoe’s FFmpeg 3.4 MS Windows binaries)) – FFmpeg
ffplay: WASAPI can’t initialize audio client error – VideoHelp Forum

ffprobe について

ffplay と同様に出力ファイル指定が不要なので入力ファイル指定に使う -i は付けなくても入力ファイルとして扱う。
ffprobe の使い方