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
ファイルを差し、次に :
の後に続く 0
と 1
でそれぞれ映像と日本語音声を指定しています。
Twitter に投稿できる動画形式に変換する
Twitter に投稿できる動画形式は、こちらで公開されています。
- 最小解像度: 32 x 32
- 最大解像度: 1920 x 1200(および1200 x 1900)
- 縦横比: 1:2.39~2.39:1の範囲(両方の値を含む)
- 最大フレームレート: 40fps
- 最大ビットレート: 25Mbps
ここに掲載されていない情報として、
- 投稿時に動画中の一部(最大30秒)を選択しなければならない。つまり、30秒以上の動画は投稿できない。
- ピクセルフォーマットを、
yuv420p
にしなければならない。1 - 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 ツールキットです。
[bash] [/bash]
とりあえず、これが何を意味するのか分からないのですが、初心者が見るにはどのページから見ればいいのでしょか…><
匿名さん
すみません。ブログ記事の記法を変更した際に、本文とは関係がない文字([bash][/bash])が入っていたようです。
修正しておきました!