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

ffmpeg の使い方

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

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

コマンド例
ffmpeg 入力オプション -i 入力ファイル 出力オプション フィルタ 出力コーデック 出力ファイル
「入力オプション」で開始10秒(-ss 10)から読み込んだ input.mp4「入力ファイル」を「出力オプション」で動画時間が10秒(-t 10)の 320×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

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 がある。ビデオフィルタやオーディオフィルタはそれぞれ映像だけ、音声だけしか読み込めないのに対して、複合フィルタは映像と音声どちらも扱うことができる。複合フィルタで映像から別の映像や、同様に音声から別の音声に、そして映像から音声に切り替える場合は ;(セミコロン)でつなぐ。同じ映像や音声に別のフィルタを掛ける場合には ,(カンマ)でつなぐ。

数値の指定は何も指定しないと既定値が指定される。指定にはオプション名を指定する場合と指定しない場合があるが、指定しない場合は 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 の順番になる。

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

チャンネルを選択するときの番号(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 で後ろから読み込みが可能に
ffmpeg で先頭と後ろを一度にカットする
2入力する映像のフィルタを詳しく設定する
時間でフィルタに強弱をつける

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

いわゆるチャンネルマッピングのこと。出力オプションの map で指定できる。

【ffmpeg】 マルチトラックの動画の作り方

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

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

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

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

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

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

パス指定とエスケープ

詳しくは:FFmpeg Filters Documentation : Notes on filtergraph escaping
以下の動画は現在のディレクトリ(Lドライブのトップディレクトリ)に Cache フォルダがあり、その中に 420p.mp4 がある。

相対パスの具体例

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

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

絶対パスの具体例

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

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

フレームレートについて

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 がある。einguste は他にはない opengl 出力が可能である。お気に入りの動画を携帯で見ようで配布している ffmpeg にも opengl に対応している。

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