FFmpeg
FFmpeg(エフエフエムペグ)は動画と音声を記録・変換・再生するためのフリーソフトウェアである。Unix系オペレーティングシステム (OS) 生まれであるが現在ではクロスプラットフォームであり、libavcodec(動画/音声のコーデックライブラリ)、libavformat(動画/音声のコンテナライブラリ)、libswscale(色空間・サイズ変換ライブラリ)、libavfilter(動画のフィルタリングライブラリ)などを含む。ライセンスはコンパイル時のオプションによりLGPLかGPLに決定される。コマンドラインから使用することができる。対応コーデックが多く、多彩なオプションを使用可能なため、幅広く利用されている。
FFmpegは、単体ではGUIを持たないツールでUNIXコマンドのように振る舞う。その為、対話式アプリケーションとして使用される場合、フロントエンドを用いる事も多い。コマンドラインから実行するCUIとして配布されているのは、ユーザが必要とすればフロントエンドを利用でき、スクリプトなどのバッチ処理を行う際に呼び出す事もできるという利点からである。また、FFserverと組み合わせる事により、やデバイスファイルとストリーミングサーバ間のフィルタとしても動作する。
2011年3月13日にFFmpegの開発は、開発体制の対立からffmpeg.orgとlibav.orgに分裂した。どちらもffmpegというソフトウェアをリリースしているが、Libav側はavconvに名称を切り替える作業を進めている。この分裂に伴い、Debian、Ubuntu 11.04、Gentoo LinuxはLibav側を採用した。
2015年7月にDebianはセキュリティ問題への対応姿勢からLibavを排除し、FFmpeg採用に戻った。UbuntuもFFmpeg採用に戻っている。
2022年1月17日に大きなAPIの変更と非推奨APIの削除が行われたFFmpeg 5.0がリリースされた。
8088flex TMV
Adobe Filmstrip
Audio IFF (AIFF CD-ROM XA ADPCMを含む)
American Laser Games MM
3GPP AMR
Apple HTTP Live Streaming
Beam Software SIFF
Bethesda Softworks VID
Bitmap Brothers JV
Brute Force & Ignorance
Interplay C93
Delphine Software International CIN
CD+G
Core Audio Format
CRC testing format
Creative Voice
CRYO APC
D-Cinema audio
Deluxe Paint Animation
DV video
Electronic Arts cdata
Electronic Arts Multimedia
FFM (FFserver live feed)
Flash (SWF)
Flash 9 (AVM2)
FLI/FLC/FLX animation
Flash Video (FLV)
framecrc testing format
FunCom ISS
GIF アニメーション
id Quake II CIN video
id RoQ
IEC61937 encapsulation
Interplay MVE
IVF (On2)
Matroska audio
FFmpeg metadata
MAXIS XA
MD Studio
Mobotix .mxg
Motion Pixels MVI
MOV/QuickTime/MP4
MPEG-1 System
MPEG-PS (program stream)
MPEG-TS (transport stream)
MSN TCP webcam
Musepack SV8
Material eXchange Format (MXF)
Material eXchange Format (MXF), D-10 Mapping
NC camera feed
NTT TwinVQ (VQF)
Nullsoft Streaming Video
Playstation Portable PMP
TechnoTrend PVA
raw ADTS (AAC)
raw AC-3
raw Chinese AVS video
raw CRI ADX
raw Dirac
raw DNxHD
raw DTS
raw E-AC-3
raw FLAC
raw GSM
raw H.261
raw H.263
raw H.264
raw Ingenient MJPEG
raw MJPEG
raw MLP
raw MPEG
raw MPEG-1
raw MPEG-2
raw MPEG-4
raw NULL
raw video
raw id RoQ
raw Shorten
raw TrueHD
raw VC-1
raw PCM A-law
raw PCM mu-law
raw PCM
整数: 符号付きまたは符号なし、ビット数は8、16、24、32ビット、エンディアンはリトルエンディアンとビックエンディアン
浮動小数点: 32ビットまたは64ビットエンディアンはリトルエンディアンとビックエンディアン
REDCODE R3D
Renderware TeXture Dictionary
RPL/ARMovie
Lego Mindstorms RSO
Sega FILM/CPK
Sierra SOL
Sierra VMD
Sony OpenMG (OMA)
Sony PlayStation STR
Sony Wave64 (W64)
SoX native format
Tiertex Limited SEQ
True Audio
VC-1 test bitstream
Windows Televison (WTV)
Wing Commander III movie
Westwood Studios audio
Westwood Studios VQA
YUV4MPEG pipe
Psygnosis YOP
GIF parser
.Y.U.V
JPEG 2000
JPEG-LS
Sun Rasterfile
Truevision Targa(TGA)
libavcodecを参照。
RealMedia RTSP/RDT
RTMPT, RTMPE, RTMPTE, RTMPS (librtmp経由)
X11 grabbing
libdc1394 (IEEE 1394)
FFmpegでは数多くのオプションを利用することができる。それらはffmpegのバージョンによって差異があるため、利用前にオプションやコーデックの表記を確認することが望ましい。オプションは ffmpeg -h で表示できる。また、コーデック名等は ffmpeg -formats や ffmpeg -codecs で表示できる。( コーデック名は下記注意事項参照 )
一般的なオプション等の例を以下に挙げる。
-i 入力ファイル名を設定する。
-f 出力フォーマットの指定。
-y 出力するファイル名と同じ名前のファイルが出力先にある場合に上書する。
-fs 指定したファイルサイズになったら変換を終了する。
-ss 指定した時間から変換を開始する。
-title タイトルを設定する。
-timestamp タイムスタンプを設定する。
-vsync フレームをカットしたり加えたりして音声に動画を同期させる。
-b 動画部分のビットレートを設定、初期設定は200kbps。( 単位は下記注意事項参照 )
-r フレームレートの設定 初期設定は25
-s 動画のサイズを横×縦で設定
-aspect アスペクト比の設定
-vn ビデオを無効にする。音声部分のみのエンコードなどに使用する。
-vcodec ビデオコーデックを設定 設定しない場合は入力ファイルと同じコーデックを使用する。
-pix_fmt ピクセルフォーマット設定。例えば "-vcodec libx264" 等においてQuickTime、QTKit、AVFoundation (AVKit) 互換にするには "-pix_fmt yuv420p" も合わせて指定。
-ab オーディオの全チャンネル合計(2017年1月)のビットレートを設定する。( 単位は下記注意事項参照 )
-ar サンプリング周波数を設定する。
-ac 音声のチャンネル数を設定する。
-acodec 音声コーデックを設定する。設定しない場合は動画同様入力されたファイルと同じコーデックを使用する。
-an 音声を無効にする。ビデオ部分のみのエンコードなどに使用する。
-vol 通常の音量を256として音量を設定する。(2倍の音量にしたい時は512を指定する。)
-bや-abオプションでビットレートを指定する場合、ffmpegのバージョンによってkbpsの場合と、bpsの場合があるので注意が必要である。(ffmpeg -hでヘルプメッセージを表示させて単位を確認するとよい)
たとえば、単位がbpsの場合で64kbpsのビットレートを指定する場合は『 -ab 64k 』と指定し、単位がkbpsの場合は『 -ab 64 』と指定する。ビットレートの計算では一般的にk=1000であり1024ではない。
-acodecや-vcodecで指定するコーデック名は、ffmpegのバージョンによって違うことがある。たとえば、AACコーデックの場合、aacと指定する場合と、libfaacと指定する場合がある。また、デコードのみやエンコードのみできるコーデックもあるため、必ず ffmpeg -formats や ffmpeg -codecs で指定するコーデックが機能するか確認すべきである。
FFmpeg と Libav の分裂に伴い、Libav 側は、コマンドラインツールとして、ffmpeg に代わる物として、引数などを(互換性なく)整理した avconv を2011年現在、開発中。各種 ff という接頭辞で始まるツールも av という名称に切り替えた。
引数が異なる場合、FFmpeg.orgのffmpegとLibavのavconv両方併記する。なお、Libavのffmpegは従来通りの引数が使える。
ffmpeg -h
# ファイル形式 (コンテナ/フォーマット/スプリッター)
ffmpeg -formats
# コーデック形式 (映像や音声の形式/圧縮アルゴリズム)
ffmpeg -codecs
# プロトコル形式 (スキーマも含む)
ffmpeg -protocols
動画をMPEG-4/AVC形式に変換する例 (ビットレート固定)
avconv -i inputfile -c:v libx264 -c:a libfaac -b:v 256k -b:a 64k outputfile.mp4
ffmpeg -i inputfile -f mp4 -vcodec libx264 -acodec libfaac -vb 256k -ab 64k outputfile.mp4
# -f の後に変換後のファイル形式、-acodec の後に変換後の音声コーデック、-vcodec の後に変換後の動画コーデックを指定する。
# -vb は変換後の映像のビットレート(ビット/秒)、-ab は変換後の音声のビットレート(ビット/秒)を指定する。
動画をMPEG-4/AVC形式に変換する例 (品質固定)
avconv -i inputfile -c:v libx264 -c:a libfaac -cqp 23 -aq 100 outputfile.mp4
ffmpeg -i inputfile -f mp4 -vcodec libx264 -acodec libfaac -cqp 23 -aq 100 outputfile.mp4
# ビットレートを指定する代わりに品質を指定することができる。映像は cqp 、音楽は aq となる。
# 品質指定は cqp の場合、値が小さいほど品質が高いことを意味する。aq の場合、値が大きいほど品質が高いことを意味する。
# 値の意味は変換後のコーデックによるので注意。
avconv -i inputfile -vn -c:a libfaac -b:a 128k outputfile.aac
ffmpeg -i inputfile -f aac -vn -acodec libfaac -ab 128k outputfile.aac
# -vcodec の代わりに -vn を使うことで変換後に映像を入れないという意味になる。同様に、-acodec の代わりに -an を使うことで音声を消すことも可能である。
avconv -i inputfile.mp4 -c copy outputfile.flv
ffmpeg -i inputfile.mp4 -vcodec copy -acodec copy outputfile.flv
ffmpeg -i inputfile.mp4 -codec copy outputfile.flv
# 変換後のフォーマットによっては、そのフォーマットの仕様の制限やFFmpegが未対応であることなどにより変換前のコーデックが入れられないことがある。
# また、-vcodec copy を -vn にすることによって、再エンコード無しで音楽だけにすることが出来る。
avconv -i rtsp://example.com/inputfile.mp4 -c copy outputfile.mp4
ffmpeg -i rtsp://example.com/inputfile.mp4 -vcodec copy -acodec copy -scodec copy outputfile.mp4
# 入力ファイルに直接URLを入れることができる。
avconv -re -i inputfile -f rtsp -c:v libx264 -c:a libfaac -b:v 256k -b:a 64k rtsp://example.com/outputfile.mp4
ffmpeg -re -i inputfile -f rtsp -vcodec libx264 -acodec libfaac -vb 256k -ab 64k rtsp://example.com/outputfile.mp4
# 出力ファイルにも直接URLを入れることができる。-re を付けると出力速度がリアルタイムになるように調整する。
# ffserver.conf を適切に編集してから以下を実行。
ffserver &
ffmpeg -i inputfile http://127.0.0.1:8090/feed.ffm
DVDのVOBファイルを、VideoCD形式のMPEG-1ファイルに変換する例
avconv -i inputfile.vob -f mpeg -c:v mpeg1video -c:a mp2 -b:v 1152k -b:a 128k -s 352x240 outputfile.mpg
ffmpeg -i inputfile.vob -f mpeg -vcodec mpeg1video -acodec mp2 -vb 1152k -ab 128k -s 352x240 outputfile.mpg
動画を東芝のハードディスクレコーダー、レグザが認識できるMPEG2形式に変換する例
ffmpeg -i inputfile -target ntsc-svcd -ab 128k -aspect 4:3 -s 720x480 outputfile.mpg
複数のAVIの動画ファイルを結合する例(この例では、中間処理として、一度AVIファイルをMPEG-1ファイルに変換する必要がある(MPEG-1, MPEG-2 PS, DVも連結可能))
ffmpeg -i input1.avi -sameq inputfile_01.mpg
ffmpeg -i input2.avi -sameq inputfile_02.mpg
cat inputfile_01.mpg inputfile_02.mpg > inputfile_all.mpg
ffmpeg -i inputfile_all.mpg -sameq outputfile.avi
なお、concatスキーマ(concat:input.avi.part1|input.avi.part2)はストリームの物理的な結合のみ行うため、この場合は使えない。
公式サイトでは、コンパイル済みのバイナリは配布されていないため、自分の環境に合わせてソースコードをコンパイルすることもできるが、
次のような手法でバイナリを入手することもできる。
RPMForge、Livna等のリポジトリを用いて、yumコマンド等でインストールできる
yum --enablerepo=rpmforge install ffmpeg
Debian, Ubuntuなど、APTがインストールされた環境
apt installコマンドを用いて、ディストリビュージョンのリポジトリに含まれているパッケージからインストールする(root権限必要)
sudo apt install ffmpeg
portsツリーに含まれており、該当ディレクトリに移動してmake installするかpkg_addコマンドでバイナリパッケージを導入する。
http://www.ffmpegx.com/ にてmacOS用のffmpegXが配布されている。
ffmpeg.org - https://ffmpeg.org/download.html にてソースコードや各種OS用のパッケージ及びビルドの入手先が紹介されている。
GStreamer FFmpeg plug-in
Bellagio OpenMAX IL -  STマイクロエレクトロニクスとノキアによって開発されているオープンソースのOpenMax IL実装
FFmpegInterop - Microsoftによって開発されているMediaStreamSource実装
swfdec - オープンソースのフラッシュプレーヤー
Moonlight - マイクロソフトが支援してノベルが開発するオープンソースのSilverlight代替実装
B's 動画レコーダー
Audacity(1.3.6以降)
ラジ録12 Windows版
構内交換機 (PBX)
OpenCV - インテルによって開発されたコンピュータビジョン向けライブラリ。
ImageMagick - MPEG-2へ出力する際に使用する。
Google Chrome - HTML5のvideoタグに使用している。また、Chromeをベースにしたメディアプレイヤーを作るという計画がある。
Ingex - BBC(英国放送協会)リサーチ・アンド・デベロップメントが開発しBBCが使用している、オープンソースのテレビジョンプロダクション向け総合ソフトウェア
- OpenCV の Java ラッパーだが、FFmpeg のラッパーも含む
FFmpegに含まれるライブラリ群は多数のマルチメディアアプリケーションにより利用されている。また、Palmのスマートフォン(Palm WebOS)やソニーのブルーレイプレーヤ(BDP-S1、BDP-S1E/BDP-S300/BDP-S280、BDP-S500/BDP-S2000ES)などのデバイスにも利用されている。
音ズレの原因は大きく分けて以下がある。
復号タイムスタンプ (DTS)/表示タイムスタンプ (PTS)
A/V Sync
FFmpegにおいては、フレームレートは内部的に分数を用いて処理をしているためフレームレートによる音ズレが起こることは少ない。ただし小数でフレームレートを保存するコンテナも存在するため、限界もある。FFmpegのライブラリを使用する場合に、分数を小数に直してから処理すると音ズレを起こす場合がある。
コンテナの実装においてDTSをPTSに又はDTSにPTSを代入した場合や、FFmpegのライブラリを利用したアプリケーションにおいてPTSとDTSを正しく扱わなかった場合などに音ズレを伴う問題が起きる場合がある。また、負のPTSや負のDTSを使用している場合において問題が起きる場合がある。
ディレイの問題は、遅延フレーム、エンコードに必要な無音区間の挿入、デコードに必要的に出力される無音サンプルなどによって起こる。一部のコンテナやその実装においては、ディレイはタグなどのメタデータによって打ち消す。コンテナがディレイを打ち消す方法を提供しない場合は、映像/音声データの方を調節するしかない。一部独自拡張のタグにディレイ情報を埋め込むエンコーダ(LAMEのLAMEタグやiTunesのiTunSMPBなど)も存在し、様々なソフトウェア・ハードウェアが相性問題を抱えている。FFmpegはこれらの幾つかにまだ対応していない。
また、変換前の動画を出力したソフトウェア・ハードウェアや変換後の動画を処理するソフトウェア・ハードウェアのバグや仕様によって問題が起こることも多い。変換前の動画にバグがある場合、-bugオプションを使って回避できる場合がある。