動画や音声を変換できます。
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
で確認できます。
フォーマットは通常は入力ファイルから自動で検出され、出力ファイルのファイル拡張子から推定されますが、-f
オプションではこれを明示できます。
ffmpeg -i sample.123 -f mp4 sample.abc
指定可能なフォーマットの形式は、ffmpeg -formats
で一覧できます。
-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
たとえば-codec:a:1
の「a」はオーディオ (audio) 、「1」はゼロベースの2番目を意味し、これは2番目のオーディオ ストリームを表します。5.1 Stream specifiers - ffmpeg Documentation
stream_type[:additional_stream_specifier] | ストリームの型
|
stream_index | ストリームの番号。この番号はlibavformatによって検出された順に割り当られるが、program IDも指定された場合は除く |
p:program_id[:additional_stream_specifier] | |
︙ |
オプションにはストリームの指定を含んだ別名 (alias) が用意されている場合があり、それを用いるときはストリーム指定子は不要です。
-codec:v
… -vcodec
-codec:a
… -acodec
-codec:s
… -scodec
-filter:v
… -vf
-tag:v
… -vtag
-c
(または-codec
) で、1つ以上のストリームのエンコーダやデコーダを選択できます。
-c[:stream_specifier] codec (input/output,per-stream)
たとえば、
ffmpeg -i sample1.mp4 -c:v h264 -c:a copy sample2.mp4
とするとビデオのエンコーダにはh264を用い、オーディオは再エンコードしないように指示できます。
codecに指定可能なエンコーダは
ffmpeg -encoders
で、デコーダは
ffmpeg -decoders
で一覧できます。エンコーダは出力ファイルの前で、デコーダは入力ファイルの前で指定します。
ただし指定可能とされていても、たとえば
ffmpeg -i sample1.mp4 -c:v h264_nvenc sample2.mp4
と指定したとき
[h264_nvenc @ ***] Cannot load nvEncodeAPI64.dll [h264_nvenc @ ***] The minimum required Nvidia driver for nvenc is ***.** or newer
のように出力されるならば、必要なドライバがインストールされていないか、必要なハードウェアがありません。
ファイルを介せず入出力を行うならば、次のように記述します。3.16 pipe - FFmpeg Protocols Documentation
ffmpeg -i test.wav -f avi pipe:1 | cat > test.avi
pipe:[number]
numberは
のように指定します。これを省略した場合は、書き込みではstdoutが、読み込みではstdinが用いられます。
-c
にcopyパラメータを指定することで、デコードとエンコードを伴わずに変換できます。3.2 Stream copy - ffmpeg Documentation
ffmpeg -i sample.avi -c copy sample.mp4
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
出力ファイルに画像フォーマットの拡張子を指定することで、映像の各フレームを画像として書き出せます。そのとき大量の画像が作成されるのを防ぐため、-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
FFmpegではメタデータを、ffmetadataファイルと呼称される次のような形式のテキストファイルを介して読み書きできます。
;FFMETADATA1 title=bike\\shed ;this is a comment artist=FFmpeg troll team [CHAPTER] TIMEBASE=1/1000 START=0 #chapter ends at 0:01:00 END=60000 title=chapter \#1 [STREAM] title=multi\ line
次のようにすることで、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
-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 |
-hwaccel[:stream_specifier] hwaccel (input,per-stream)5.6 Advanced Video options - ffmpeg Documentation
このオプションは選択したhwaccelが利用できなかったり、選択されたデコーダでサポートされないときには効果がありません。
たいていのアクセラレーション方法は再生を意図しており、最新のCPUでのソフトウェア デコードより高速ではありません。またffmpegはデコードされたフレームをGPUメモリからシステム メモリへコピーする必要が通常あるため、さらにパフォーマンスの損失があります。このオプションはそれゆえ、主に検査に有用です。5.6 Advanced Video options - ffmpeg Documentation
ffmpegの現在のビルドで指定可能なhwaccelは、
ffmpeg -hwaccels
とすることで確認できます。
値 | 使用する加速方法 |
---|---|
none | どのハードウェア アクセラレーションも使用しない。既定 |
auto | 自動で選択 |
dxva2 | DXVA2 (DirectX Video Acceleration)。Direct3D 9 |
d3d11va | D3D11VA (DirectX Video Acceleration)。Direct3D 11 |
qsv | Intel QuickSync Video acceleration (ビデオ トランスコード用)
他の値と異なり、このオプションはデコードを加速しない |
cuda | NVENC (NVIDIA Encoder) とNVDEC (NVCUVID)
ffmpegでは、これらと相互に連結することをCUDAと呼んでいる CUDA (NVENC/NVDEC) - HWAccelIntro – FFmpeg NVIDIA FFmpeg Transcoding Guide | NVIDIA Developer Blog |
opencl | OpenCL
OpenCLを他のGPU APIと一緒に使用することで、GPUとCPUメモリの間の余分なコピーを回避できる OpenCL - HWAccelIntro – FFmpeg |
vulkan | Vulkan |