ffmpeg

動画や音声を変換できます。

概要

ffmpeg [global_options]
  {[input_file_options] -i input_url} ...
  {[output_file_options] output_url} ...
Synopsis - ffmpeg Documentation

入力ファイルに対してのオプションは、-iオプションより先に記述します。

たとえば次のように記述することで、ファイル形式を変換できます。

ffmpeg -i sample.avi sample.mp4
options
   
-i 入力ファイルのURL
-y 確認なく上書きする
-n すでにファイルが存在するならば、上書きせずに即座に終了する
   
5 Options - ffmpeg Documentation

すべてのオプションは、ffmpeg -hで確認できます。

フォーマット (formats)

フォーマットは通常は入力ファイルから自動で検出され、出力ファイルのファイル拡張子から推定されますが、-fオプションではこれを明示できます。

ffmpeg -i sample.123 -f mp4 sample.abc

指定可能なフォーマットの形式は、ffmpeg -formatsで一覧できます。

フィルタ (filter)

-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

ストリーム指定子 (stream specifiers)

たとえば-codec:a:1の「a」はオーディオ (audio) 、「1」はゼロベースの2番目を意味し、これは2番目のオーディオ ストリームを表します。5.1 Stream specifiers - ffmpeg Documentation

   
stream_type[:additional_stream_specifier] ストリームの型
  • 'v' (小文字) … ビデオ (video) すべてのビデオ
  • 'V' (大文字) … ビデオ (video) 写真、サムネイルやカバーアートがないビデオ
  • 'a' … オーディオ (audio)
  • 's' … 字幕 (subtitle)
  • 'd' … データ (data)
  • 't' … 添付 (attachments)
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

コーデック (codec)

-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

のように出力されるならば、必要なドライバがインストールされていないか、必要なハードウェアがありません。

パイプ (pipe)

ファイルを介せず入出力を行うならば、次のように記述します。3.16 pipe - FFmpeg Protocols Documentation

ffmpeg -i test.wav -f avi pipe:1 | cat > test.avi
pipe:[number]

number

  • stdin … 0
  • stdout … 1
  • stderr … 2

のように指定します。これを省略した場合は、書き込みでは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

Vulkan - HWAccelIntro – FFmpeg

   
複数のダウンロードサイトから、まとめて検索