ソースコードはFFmpeg: Main Pageにあります。
動画や音声を変換できます。
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...Synopsis - ffmpeg Documentation
入力ファイルに対してのオプションは、-iオプションより先に記述します。
たとえば次のように記述することで、ファイル形式を変換できます。
ffmpeg -i sample.avi sample.mp4
-i | 入力ファイルのURL |
-y | 確認なく上書きする |
-n | すでにファイルが存在するならば、上書きせずに即座に終了する |
すべてのオプションは、ffmpeg -h
で確認できます。
-loglevel [flags+]loglevel | -v [flags+]loglevel
作用 | |
---|---|
repeat | くり返される出力を"Last message repeated n times"のように省略しない |
level | 各メッセージの前に、"[Error]"のようなそのレベルを表す文字を付加する |
文字表現 | 数値表現 | |
---|---|---|
quiet | -8 | Show nothing at all; be silent. |
panic | 0 | Only show fatal errors which could lead the process to crash, such as an assertion failure. This is not currently used for anything. |
fatal | 8 | Only show fatal errors. These are errors after which the process absolutely cannot continue. |
error | 16 | Show all errors, including ones which can be recovered from. |
warning | 24 | Show all warnings and errors. Any message related to possibly incorrect or unexpected events will be shown. |
info | 32 | Show informative messages during processing. This is in addition to warnings and errors. This is the default value. |
verbose | 40 | Same as info, except more verbose. |
debug | 48 | Show everything, including debugging information. |
trace | 56 |
フォーマットは通常は入力ファイルから自動で検出され、出力ファイルのファイル拡張子から推定されますが、-fオプションではこれを明示できます。
ffmpeg -i sample.123 -f mp4 sample.abc
指定可能なフォーマットの形式は、ffmpeg -formats
で一覧できます。
1:00の位置から10秒間の範囲だけを切り出すには、次のようにします。
ffmpeg -ss 1:00 -t 10 -i sample1.mp4 sample2.mp4
時間は、
[-][HH:]MM:SS[.m...]
または
[-]S+[.m...]
の形式で指定できます。2.3 Time duration - FFmpeg Utilities Documentation
指定位置から正確に切り出されるわけではなく、その位置にもっとも近いシークポイント (seek point) からとなります。5.4 Main options - ffmpeg Documentation
-codec (または-c) オプションにcopyパラメータを指定することで、デコードとエンコードを伴わずに変換できます。3.2 Stream copy - ffmpeg Documentation
ffmpeg -i sample1.mp4 -map 0 -codec copy sample2.mp4
ファイルを介せず入出力を行うならば、次のように記述します。3.16 pipe - FFmpeg Protocols Documentation
ffmpeg -i test.wav -f avi pipe:1 | cat > test.avi
pipe:[number]
numberは
のように指定します。これを省略した場合は、書き込みではstdoutが、読み込みではstdinが用いられます。
出力ファイルに画像フォーマットの拡張子を指定することで、映像の各フレームを画像として書き出せます。そのとき大量の画像が作成されるのを防ぐため、-vframesで出力するフレーム数を制限するようにします。6.3 Video and Audio file format conversion - ffmpeg Documentation
ffmpeg -i sample.mp4 -vframes 5 img%d.jpeg
通常は不要ですが、画像のフォーマットを明示するならば-f image2
などを指定します。
出力するフレームを一定時間ごとにするには、フィルタ グラフで出力フレーム レートを指定します。たとえば60秒ごとにするならば、次のようにします。Create a thumbnail image every X seconds of the video – FFmpeg
ffmpeg -i sample.mp4 -vf fps=1/60 img%d.jpeg
すべてのフレームを1つの画像にまとめて出力するには、フィルタにtileを指定します。10.194 tile - FFmpeg Filters Documentation
ffmpeg -i sample.mp4 -vf fps=1/60,tile img.jpeg
処理速度が問題となるならば、-ssで切り出し位置を明示した方が高速です。その場合、-ssは-iより前に記述します。 create thumbnails from big movies with FFmpeg takes too long - Stack Overflow Fastest way to extract a specific frame from a video (PHP/ffmpeg/anything) - Stack Overflow
画像の大きさを指定するならば、-vfのscaleで指定します。そのとき縦横比を保つには、他方の大きさを-2とします。これを-1とすると、コーデックによっては対応しません。Scaling – FFmpeg
次のようにすることで、sample.mp4のメタデータのタグをmetadata.txtへ出力できます。5 Metadata - FFmpeg Formats Documentation
ffmpeg -i sample.mp4 -f ffmetadata metadata.txt
そのとき特定のストリームの情報を取得するには、-map_metadataでそれを指定します。
ffmpeg -i sample.mp4 -f ffmetadata -map_metadata 0:s:1 metadata.txt
逆にメタデータへ書き込むにはffmetadataファイルも入力に加え、-map_metadata 1としてゼロベースで2番目のそのファイルを指定します。このようにffmetadataのファイルで書き込むときには、そこに含まれる"=", ";", "#", "\", 改行の文字は"\"でエスケープする必要があります。5 Metadata - FFmpeg Formats Documentation
ffmpeg -i sample1.mp4 -i metadata.txt -map_metadata 1 -codec copy sample2.mp4
個別に指定するには-metadataで指定します。これは-map_metadataと同時に指定されたとき、それを上書きします。次の例ではタイトルを"ABC"としたsample2.mp4が作成されます。5.4 Main options - ffmpeg Documentation
ffmpeg -i sample1.mp4 -metadata title=ABC -codec copy sample2.mp4
複数のタグに書き込むには、それぞれ指定します。
ffmpeg -i sample1.mp4 -metadata title=ABC -metadata comment=DEF -codec copy sample2.mp4
個別のストリームに書き込むには、-metadataでそのストリームを指定します。
ffmpeg -i sample1.mp4 -metadata:s:a:0 title=ABC -codec copy sample2.mp4
同名のファイルへ出力しようとすると「FFmpeg cannot edit existing files in-place.」として失敗するため、新しいファイルに書き出した上で元のファイルを削除します。python - How to change metadata with ffmpeg/avconv without creating a new file? - Stack Overflow
ffmpegで書き込むと、エンコードしていなくてもencoderタグにlibavformatのバージョン[Lavf**.**]が設定されます。#6602 (Can't set or remove encoder metadata) – FFmpeg
これは既存のencoderタグを上書きしてしまうため、それが望まぬ動作ならばMP4では-metadata encoding_tool=CurrentEncoderName
として既存のタグの値を明示して書き込めます。このときencoderは、-metadataのkeyとしてはencoding_toolと指定します。Problems with modifying encoder metadata with FFMPEG - Stack Overflow
creation_timeは明示的に指定しないと、出力したファイルにコピーされません。またffmpegがサポートしないタグも、コピーされない可能性があります。
特定のメタデータを削除するには、空の値を指定します。
ffmpeg -i sample1.mp4 -metadata title= -codec copy sample2.mp4
すべてのメタデータを削除するには、-map_metadata -1のように存在しないファイルを指定して書き込みます。Strip metadata from all formats with FFmpeg - Super User
ffmpeg -i sample1.mp4 -map_metadata -1 -codec copy sample2.mp4
たとえば-codec:a:1
の「a」はオーディオ (audio) 、「1」はゼロベースの2番目を意味し、これは2番目のオーディオ ストリームを表します。5.1 Stream specifiers - ffmpeg Documentation
stream_index | ストリームの番号。この番号はlibavformatによって検出された順に割り当られるが、program IDも指定された場合は除く |
stream_type[:additional_stream_specifier] | ストリームの型
|
p:program_id[:additional_stream_specifier] | |
︙ |
-filter[:stream_specifier] filtergraph (output,per-stream)-filter - ffmpeg Documentation
filtergraphに指定可能な値は、ffmpeg -filters
で確認できます。
-filter:v
は、-vf
とも記述できます。
-vf filtergraph (output)5.5 Video Options - ffmpeg Documentation
-hwaccel[:stream_specifier] hwaccel (input,per-stream)5.6 Advanced Video options - ffmpeg Documentation
hwaccelの既定値はnoneで、どのハードウェア アクセラレーションも利用されません。
ffmpegの現在のビルドで指定可能なhwaccelは、
ffmpeg -hwaccels
とすることで確認できます。
マルチメディア ストリームの情報を確認できます。
ffprobe [options] input_urlSynopsis - ffprobe Documentation
たとえば次のようにすることで、sample.mp4の情報を取得できます。
ffprobe sample.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\sample.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 creation_time : 2010-01-01T00:00:00.000000Z encoder : Lavf58.2.103 Duration: 00:10:00.00, start: 0.000000, bitrate: 638 kb/s Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 720x480 [SAR 32:27 DAR 16:9], 502 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default) Metadata: creation_time : 2010-01-01T00:00:00.000000Z handler_name : VideoHandler Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default) Metadata: creation_time : 2010-01-01T00:00:00.000000Z handler_name : SoundHandler
使用可能なオプションは、ffprobe -h
とすることで確認できます。
オプション | セクション名 | 出力内容 |
---|---|---|
-show_log loglevel | LOG | デコーダのログ情報 (-show_framesと共に用いる) |
-show_error | ERROR | 入力を調査中に見つかったエラー |
-show_format | FORMAT | 入力マルチメディア ストリーム内のコンテナ フォーマットの情報 |
-show_streams | STREAM | 入力マルチメディア ストリーム内のメディア ストリームごとの情報 |
-show_frames | FRAME または SUBTITLE | 入力マルチメディア ストリーム内のフレームと字幕ごとの情報 |
-show_packets | PACKET | 入力マルチメディア ストリーム内のパケットごとの情報 |
-show_programs | PROGRAM_STREAM | 入力マルチメディア ストリーム内のプログラムとストリームの情報 |
-show_chapters | CHAPTER | フォーマット内のチャプターの情報 |
指定の内容が存在しないならば、何も出力されません。
特定の記載だけを出力したいならば、
-show_entries format=duration
-show_entries packet=pts_time,duration_time,stream_index : stream=index,codec_type
のように指定します。
ffprobe -print_format compact -show_format sample.mp4
-print_format (または-of) を指定することで、指定の書式に整形された結果を得られます。
フォーマットごとに異なるオプションが用意されており、
-print_format writer_name[=writer_options]
の書式で、たとえばdefaultにnoprint_wrappersとnokeyのオプションを指定するならば-print_format default=noprint_wrappers=1:nokey=1
のように指定します。4 Writers - ffprobe Documentation
[FORMAT] filename=C:\sintel_trailer-480p.mp4 nb_streams=2 nb_programs=0 format_name=mov,mp4,m4a,3gp,3g2,mj2 format_long_name=QuickTime / MOV start_time=0.000000 duration=52.209000 size=4372373 bit_rate=669979 probe_score=100 TAG:major_brand=isom TAG:minor_version=512 TAG:compatible_brands=isomiso2avc1mp41 TAG:creation_time=1970-01-01T00:00:00.000000Z TAG:title=Sintel Trailer TAG:artist=Durian Open Movie Team TAG:encoder=Lavf52.62.0 TAG:copyright=(c) copyright Blender Foundation | durian.blender.org TAG:description=Trailer for the Sintel open movie project [/FORMAT]
format|filename=C:\\sintel_trailer-480p.mp4|nb_streams=2|nb_programs=0|format_name=mov,mp4,m4a,3gp,3g2,mj2|format_long_name=QuickTime / MOV|start_time=0.000000|duration=52.209000|size=4372373|bit_rate=669979|probe_score=100|tag:major_brand=isom|tag:minor_version=512|tag:compatible_brands=isomiso2avc1mp41|tag:creation_time=1970-01-01T00:00:00.000000Z|tag:title=Sintel Trailer|tag:artist=Durian Open Movie Team|tag:encoder=Lavf52.62.0|tag:copyright=(c) copyright Blender Foundation \| durian.blender.org|tag:description=Trailer for the Sintel open movie project
format.filename="C:\\sintel_trailer-480p.mp4" format.nb_streams=2 format.nb_programs=0 format.format_name="mov,mp4,m4a,3gp,3g2,mj2" format.format_long_name="QuickTime / MOV" format.start_time="0.000000" format.duration="52.209000" format.size="4372373" format.bit_rate="669979" format.probe_score=100 format.tags.major_brand="isom" format.tags.minor_version="512" format.tags.compatible_brands="isomiso2avc1mp41" format.tags.creation_time="1970-01-01T00:00:00.000000Z" format.tags.title="Sintel Trailer" format.tags.artist="Durian Open Movie Team" format.tags.encoder="Lavf52.62.0" format.tags.copyright="(c) copyright Blender Foundation | durian.blender.org" format.tags.description="Trailer for the Sintel open movie project"
[format] filename=D\:\\sintel_trailer-480p.mp4 nb_streams=2 nb_programs=0 format_name=mov,mp4,m4a,3gp,3g2,mj2 format_long_name=QuickTime / MOV start_time=0.000000 duration=52.209000 size=4372373 bit_rate=669979 probe_score=100 [format.tags] major_brand=isom minor_version=512 compatible_brands=isomiso2avc1mp41 creation_time=1970-01-01T00\:00\:00.000000Z title=Sintel Trailer artist=Durian Open Movie Team encoder=Lavf52.62.0 copyright=(c) copyright Blender Foundation | durian.blender.org description=Trailer for the Sintel open movie project
"format": { "filename": "C:\\sintel_trailer-480p.mp4", "nb_streams": 2, "nb_programs": 0, "format_name": "mov,mp4,m4a,3gp,3g2,mj2", "format_long_name": "QuickTime / MOV", "start_time": "0.000000", "duration": "52.209000", "size": "4372373", "bit_rate": "669979", "probe_score": 100, "tags": { "major_brand": "isom", "minor_version": "512", "compatible_brands": "isomiso2avc1mp41", "creation_time": "1970-01-01T00:00:00.000000Z", "title": "Sintel Trailer", "artist": "Durian Open Movie Team", "encoder": "Lavf52.62.0", "copyright": "(c) copyright Blender Foundation | durian.blender.org", "description": "Trailer for the Sintel open movie project" } }
<format filename="C:\sintel_trailer-480p.mp4" nb_streams="2" nb_programs="0" format_name="mov,mp4,m4a,3gp,3g2,mj2" format_long_name="QuickTime / MOV" start_time="0.000000" duration="52.209000" size="4372373" bit_rate="669979" probe_score="100"> <tag key="major_brand" value="isom"/> <tag key="minor_version" value="512"/> <tag key="compatible_brands" value="isomiso2avc1mp41"/> <tag key="creation_time" value="1970-01-01T00:00:00.000000Z"/> <tag key="title" value="Sintel Trailer"/> <tag key="artist" value="Durian Open Movie Team"/> <tag key="encoder" value="Lavf52.62.0"/> <tag key="copyright" value="(c) copyright Blender Foundation | durian.blender.org"/> <tag key="description" value="Trailer for the Sintel open movie project"/> </format>
-skip_frameで、フレームの型によって処理対象から除外できます。
値 | 放棄するフレーム |
---|---|
none | なし |
default | サイズが0のような、使用されていないフレーム |
noref | すべての参照されていないフレーム |
bidir | すべてのBフレーム |
nokey | すべての、キーフレーム以外のフレーム |
nointra | すべての、Iフレーム以外のフレーム |
all | すべてのフレーム |
たとえばすべてのIフレームの位置とその型の情報だけを取得するには、次のようにします。
ffprobe -select_streams v -skip_frame nointra -show_frames -show_entries frame=pkt_pts_time,pict_type sample.mp4
-show_framesで、フレームの情報として画像のExifなどを取得できます。
ffprobe -show_frames sample.jpg
簡素なプレーヤーで、FFmpeg APIのテストに利用できます。
ffplay [options] input_urlSynopsis - ffplay Documentation
たとえば次のように記述することで、sample.mp4を再生できます。
ffplay sample.mp4