ffmpeg に関する覚え書き

ffmpeg とは、オープンソースで開発が行なわれている高機能な動画/音声のエンコーダおよびデコーダです。様々なプラットフォームに対応し、多くのファイル形式、コーデックにも対応している強力なツールです。 Windows 向けのフリーの映像編集ツール・コンバーターソフトも、蓋を開けてみると中身はこの ffmpeg が入ってたりします。ちょっとした作業であれば、GUI フロントエンドを活用するのも手ですが、何度も変換を試したり、自動化させたり、フロントエンドが提供していない機能まで使いたい場合、…という具合にコマンドラインから使用するメリットもたくさんあります。

また、動画コンバータソフトと言えば、ファイルからファイルへの変換を最初に思い浮かべますが、ffmpeg はそれだけでなく、例えば、Web カメラを映像ソースにして配信サーバーを出力ソースにしてライブ配信なども可能です。

使い方の基本

この章だけを覚えておいても、とりあえず便利に使えるはずです。 UNIX 系 OS の方はお使いのターミナル上にて、Microsoft Windows をお使いの方はコマンドプロンプトにコマンドを入力します。

基本オプション

ffmpeg -i 入力ファイル名 出力ファイル名

-i オプションで入力ファイルを明示的に指定し、コマンドラインの最後に出力ファイルを指定します。例えば、「hoge.avi」を「fuga.mp4」に変換したい場合、

ffmpeg -i hoge.avi fuga.mp4

と入力します。

下記の詳細なオプションを省略すると、拡張子などで変換元・変換先のフォーマットを自動判別し、とりあえず再生可能でオリジナルファイルの設定を出来るだけ引き継いだファイルを吐いてくれます。

なお、複雑なオプションを組み合わせて変換する場合は、このオプションの順番が重要になってきます。(例えば、複数の映像・音声ソースを入力として扱う時などです)

最低限知っておけばいいオプション

最低限知っておけば、大体の場合でなんとかなりそうなオプションを列挙しておきます。

例)

ffmpeg -i from.flv -ab 96k -ac 2 -ar 44100 -r 29.97 -b 400k -s 320x240 to.flv
オプション説明
-acodec音声コーデックmp3
-ab音声ビットレート192k
-ac音声チャンネル数2
-ar音声周波数44100
-vcodec映像コーデックh264
-r映像フレームレート30000/1001
-b映像ビットレート500k, 1M
-s映像解像度320×240
-aspectアスペクト比4:3, 16:9

サポートしているファイル形式とコーデックをリスト表示する

-formats オプションを指定すると、サポートしているファイル形式とコーデックのリストを表示します。ffmpeg は、ビルドオプションやシステム環境によってサポートするものが変化するため、お使いの ffmpeg がサポートしているかを確認することができます。

ffmpeg -formats

出力の見方は次のとおり。

File formats:
    オプションで指定する識別子
     |              フォーマットの詳細説明
 DE avi             AVI format
 ||
 |`-- エンコード(出力)可能
 `--- デコード(入力)可能
Codecs:
    ,-- ストリーミングに対応
    |    ,-- オプションで指定する識別子
    |    |              フォーマットの詳細説明
 DEVSDT h263            H.263 / H.263-1996
 |||
 ||`- コーデックタイプ(V=映像、A=音声)
 |`-- エンコード(出力)可能
 `--- デコード(入力)可能 

目的のファイル形式・コーデックをサポートしていなかった場合、自分でコンパイルするか、サポートしたコンパイル済みのバイナリを入手する必要があります。

動画/音声の情報を得る

-i オプションにて入力ファイルのみを指定すれば、動画および音声の情報を表示する事が出来ます。

$ ffmpeg -i test.flv
ffmpeg version 1.0.10 Copyright (c) 2000-2014 the FFmpeg developers
  built on Jul 25 2014 07:41:31 with gcc 4.7 (Debian 4.7.2-5)
  configuration: --prefix=/usr --extra-cflags='-g -O2 -fstack-protector --param=ssp-
  libavcodec     54. 59.100 / 54. 59.100
  libavformat    54. 29.104 / 54. 29.104
  libavdevice    54.  2.101 / 54.  2.101
  libavfilter     3. 17.100 /  3. 17.100
  libswscale      2.  1.101 /  2.  1.101
  libswresample   0. 15.100 /  0. 15.100
  libpostproc    52.  0.100 / 52.  0.100
Input #0, flv, from 'test.flv':
  Metadata:
    starttime       : 0
    totalduration   : 644
    totaldatarate   : 289
    bytelength      : 23305386
    canseekontime   : true
    sourcedata      : BD155E482HH1409319619291739
    purl            :
    pmsg            :
  Duration: 00:10:44.21, start: 0.000000, bitrate: 289 kb/s
    Stream #0:0: Video: flv1, yuv420p, 320x240, 222 kb/s, 29.97 tbr, 1k tbn, 1k tbc
    Stream #0:1: Audio: mp3, 22050 Hz, stereo, s16, 65 kb/s

映像編集オプション

時間を指定して動画の一部分を切り出す

-ss オプションで開始点を指定し、-t オプションで切り出す長さを指定すれば、動画の一部分を(タイムラインベースで)切り出す事が出来ます。それぞれの値は、hh:mm:ss フォーマットの他、単に秒数( 例えば、-t 600 は先頭より 600 秒 )としても指定する事が出来ます。

# n.mpg の9分20秒の位置から5分58秒間の間の動画を m.mpg に切り出す
ffmpeg -i n.mpg -ss 00:09:20 -t 00:05:58 -acodec copy -vcodec copy m.mpg

動画の画面の一部分を切り出す

-croptop-cropbottom-cropleft-cropright オプションを指定すると、動画の画面の一部分を切り詰めて、切り出す事が出来ます。

# m.mpg を上から50ピクセル、左から140ピクセル、下から40ピクセル、
# 右から12ピクセル切り詰めた動画を a.mpg に切り出す
ffmpeg -i m.mpg -croptop 50 -cropleft 140 -cropbottom 40 -cropright 12 -sameq a.mpg

最近の ffmpeg では、-crop*オプションが廃止され、フィルタとして動作させるようになったようです。

フォーマットは -vf crop=W:H:X:Y のように指定します。

# m.mpg を上から10ピクセル、左から20ピクセル切り詰めた 320x240 サイズの動画を a.mpg に切り出す
ffmpeg -i m.mpg -vf crop=320:240:10:20 -sameq a.mpg

一部のバージョンでは、W:H:X:Y の順序ではなく X:Y:W:H の場合もあるようです。

フェードイン・フェードアウトさせる

映像をフェードイン、フェードアウトさせるには、フィルタオプションの fade を使用します。書式は次のとおり。

fade=in:開始フレーム:終了フレーム,fade=out:開始フレーム:終了フレーム

例えば、フレームレート30の3秒の映像の前後15フレームずつをフェードさせたい場合は次のようになります。

ffmpeg -i input.mp4 -vf fade=in:0:15,fade=out:75:15 out.mp4

他に映像や画像、平面を重ねていない限り、背景色は黒になるようです。

映像をぼかす

複数の映像を重ねて表示する

テレビ番組でよく見かけるワイプ画面や画面隅にある番組ロゴなどの画像(英語ではウォーターマークロゴというらしいです)を映像内に挿入します。

映像内にテキストを挿入する

映像内にテキスト(文字列)を挿入するには、フィルタオプションの drawtext を用います。

drawtext=fontfile=test.ttf:text=ほげほげ:x=10:y=20:fontsize=12:fontcolor=white@0.5

サブオプションは順に、フォントファイルパス、テキストの内容、挿入する X, Y 座標、フォントサイズ、フォント色を指定しています。フォント色の @0.5 は透明度を表しています。また、テキストの内容は UTF-8 環境では問題なく日本語が使えますが、文字コードが混在しているコマンドプロンプトでは上手く動作しない可能性もあります。その場合は、画像ファイルにテキストを書いたもので代用する方法があります。

複合フィルタオプションを用いる

複数のフィルタを段階的に適用する場合、その度にファイルに出力と入力をくりかえしていると、次第に映像・音声が劣化していきます。また、変換のコストもかかるため、できれば一度の変換で複数のフィルタを適用したいものです。そこで、最近のバージョンに追加された -filter_complex オプションを用います。

目的・サービス別

MP4 のメディアコンテナ内にカバー画像を設定する。

ffmpeg -i video.mp4 -i image.png -map 1 -map 0 -c copy -disposition:0 attached_pic out.mp4

DVD の MP4 化

DVD に含まれる VOB ファイルのダンプ

Linux では定番の動画プレイヤー mplayer も ffmpeg と組み合わせれば便利です。

mplayer dvd://1 -dumpstream -dumpfile /tmp/dump.vob

dvd://1 はタイトル番号を指定しています。-chapter N で対象チャプターを指定することも出来ます。また、-aid 129 のように-aid オプションを指定すると任意の音声トラックを指定してダンプすることができるという記事を見かけましたが、私の環境では指定しても全音声トラックがダンプされていました。なお、音声トラック番号は、

mplayer dvd://1

で再生を開始した際にコンソールに出力される

...
audio stream: 0 format: ac3 (5.1) language: en aid: 128.
audio stream: 1 format: ac3 (5.1/6.1) language: ja aid: 129.
audio stream: 2 format: ac3 (5.1/6.1) language: ko aid: 130.
....

の末尾の番号を参考にします。上の情報は、en, ja, ko と見えますので、英語、日本語、韓国語の音声トラックがあることが推測できます。

VLC プレイヤーで「ディスクを開く」で再生した際、メインメニューの「再生>タイトル」、「再生>チャプター」、「オーディオ>オーディオトラック」、「ビデオ>ビデオトラック」、「字幕>字幕トラック」を展開することによりコマンドライン引数に必要なディスク情報はある程度得ることができます。

VOB を MP4 ファイルに変換する

mplayer で一度 VOB ファイルにダンプしてしまえば、あとは通常のオプションで変換が可能です。

ffmpeg -i /tmp/dump.vob -vcodec libx264 -acodec libfaac \
  -map 0:0 -map 0:1 -ar 22050 -b 128k -r 30 -b 1m -s 640x480 /tmp/dump.mp4

特筆すべき点は、-map オプションでストリームの番号を指定しています。二つとも最初の 0 は、最初の入力ソースである /tmp/dump.vob ファイルを差し、次に : の後に続く 01 でそれぞれ映像と日本語音声を指定しています。

Twitter に投稿できる動画形式に変換する

Twitter に投稿できる動画形式は、こちらで公開されています。

  • 最小解像度: 32 x 32
  • 最大解像度: 1920 x 1200(および1200 x 1900)
  • 縦横比: 1:2.39~2.39:1の範囲(両方の値を含む)
  • 最大フレームレート: 40fps
  • 最大ビットレート: 25Mbps

ここに掲載されていない情報として、

  1. 投稿時に動画中の一部(最大30秒)を選択しなければならない。つまり、30秒以上の動画は投稿できない。
  2. ピクセルフォーマットを、yuv420p にしなければならない。1
  3. H264+AAC コーデックを使用した MP4 か MOV 形式。2

という条件があるようです。

ffmpeg -i input.flv -pix_fmt yuv420p -vcodec h264 -acodec libfaac output.mp4

解像度、縦横比などは変なソースを食わせない限り、サポート範囲外になることはないと思うので上のオプションで十分だと思います。

ツイキャスを生 TS ファイルとして録画する

こちらへどうぞ。

コラボレーション

コマンドラインから呼び出す ffmpeg はいろいろなソフトともコラボレーション可能です。最もよく呼び出されるのはシェルスクリプトベースです。

ImageMagick

動画のサムネイル(複数タイル)を作成する

どんな内容の動画であるか簡単に示すのに、よく複数タイル状に並んだ動画サムネイルを見かけますが、ffmpeg でやろうとすると動画のフレーム数計算が地味に厄介です。動画アップローダーサイトなどの自動化されたサービスを組みたいのであれば、根気よく計算すべきですが、単に手持ちのいくつかの動画サンプルをシャアしたい場合などでは、次のオプションが手軽です。

まず、FPS を指定して動画のフレームを複数の画像ファイルに切り出します。

ffmpeg -i input.mp4 -filter:v fps=fps=0.1:round=down thumb%04d.jpg

上の例では FPS は 0.1 ですので、10秒おきの指定になります。1分間の動画であれば、6枚の JPEG ファイルが生成されることになりますね。round=down は FPS で割り切れなかった場合の丸め方向を指示しています。また、出力ファイル名は printf フォーマットを指定します。

6枚の画像ファイルが得られたら、Linux や Mac OSX ではお馴染の ImageMagick で合成します。

montage -background black -tile 2x3 -geometry 320x240+0+0 -quality 80 -strip thumb*.jpg thumb.jpg

montage コマンドは、ImageMagick に入っている複数画像を合成するコマンドです。オプションを順に説明していくと、背景色を黒に設定し、画像ファイルを 2×3 (計6枚)でタイル状に並べ、それぞれの画像を 320×240 のサイズにして、JPEG 品質を 80 に設定し、余計な EXIF 情報を削除しています。

-tile オプションの挙動は、入力ファイルがタイル数よりも少なければ、足りない部分は背景色で埋められて、逆に多ければ複数の画像に出力してくれるというなかなかのお利口さんです。

Zenity

Zenity は GNOME や Cinamon といった GTK 系デスクトップ環境に標準搭載されているコマンドラインから呼び出される対話的 GUI ツールキットです。


  1. http://bibouroku.viratube.com/?p=1823 
  2. http://aviutl.info/twitter-movie/ 

「ffmpeg に関する覚え書き」への2件のフィードバック

  1. [bash] [/bash]
    とりあえず、これが何を意味するのか分からないのですが、初心者が見るにはどのページから見ればいいのでしょか…><

    • 匿名さん

      すみません。ブログ記事の記法を変更した際に、本文とは関係がない文字([bash][/bash])が入っていたようです。
      修正しておきました!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください