FFmpeg

導入

ダウンロード

Download FFmpeg

ソースコードはFFmpeg: Main Pageにあります。

対応フォーマット

2 Supported File Formats, Codecs or Features - General Documentation

ツール

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で確認できます。

ログレベル

-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

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

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

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

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

   
stream_index ストリームの番号。この番号はlibavformatによって検出された順に割り当られるが、program IDも指定された場合は除く
stream_type[:additional_stream_specifier] ストリームの型
  • 'v' … ビデオ (video) すべてのビデオ
  • 'V' … ビデオ (video) 写真、サムネイルやカバーアートがないビデオ
  • 'a' … オーディオ (audio)
  • 's' … 字幕 (subtitle)
  • 'd' … データ (data)
  • 't' … 添付 (attachments)
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

マルチメディア ストリームの情報を確認できます。

ffprobe [options] input_url
Synopsis - 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) を指定することで、指定の書式に整形された結果を得られます。

  • default
  • compact または csv (compactとは、オプションの既定値が異なる)
  • flat
  • ini
  • json
  • xml

フォーマットごとに異なるオプションが用意されており、

-print_format writer_name[=writer_options]

の書式で、たとえばdefaultにnoprint_wrappersとnokeyのオプションを指定するならば-print_format default=noprint_wrappers=1:nokey=1のように指定します。4 Writers - ffprobe Documentation

default
[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]
compact
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
flat
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"
ini
[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
json
"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"
    }
}
xml
<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>

FRAME

  • PTS (packet Presentation TimeStamp)
  • DTS (packet Decoding TimeStamp)
フレームの画像の型 (pict_type)
  • I … Iフレーム (Intra coded frame)
  • P … Pフレーム (Predicted frame)
  • B … Bフレーム (Bidirectional predicted picture)
  • S (switch frame)
  • SI (switching I frame)
  • SP (switching P frame)
  • BI (special intra frame)
Video compression picture types - Wikipedia

-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

ffplay

簡素なプレーヤーで、FFmpeg APIのテストに利用できます。

ffplay [options] input_url
Synopsis - ffplay Documentation

たとえば次のように記述することで、sample.mp4を再生できます。

ffplay sample.mp4

参考

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