ffmpeg-media-finishing について
FFmpeg media finishing は、生成・編集済みメディアを納品用に整えるスキルです。入力を調査し、仕様に沿った処理を選び、出力を検証して、コマンドやチェックサム、リスクを記録する手順を示します。
主な機能
- 01ffprobe による入力・出力の監査
- 02一般的なメディア属性の期待値チェック
- 03ストリームコピー・トランスコード・フィルターの選択
- 04コマンド、バージョン、チェックサム、リスクの記録
活用シーン
- 01素材が納品仕様を満たすか確認
- 02異なる解像度やアスペクト比の納品版を作成
- 03トランスコード後のコーデック、フレームレート、音声を検証
- 04監査記録付きのメディア引き継ぎを準備
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ calesthio/ generative-media-skills --skill ffmpeg-media-finishingインストール後、Claude Code で/ffmpeg-media-finishingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
EVAL.mdscripts/media_probe.pytests/test_media_probe.py詳細
FFmpeg によるメディアの仕上げ
このスキルは仕上げ段階で使用します。クリエイティブ生成や編集によってソースメディアができあがった後、成果物をユーザーに渡す前に使用してください。壊れやすく一貫性のないメディア出力を、再現可能で仕様を考慮したファイルに変換し、監査証跡を残すことが目的です。
このスキルはプロバイダーに依存しません。ローカルで ffmpeg と ffprobe が利用できることを前提としていますが、すべてのコーデック、フィルター、ハードウェアエンコーダー、字幕レンダラーがインストール済みのビルドに組み込まれているとは限りません。FFmpeg のビルド機能、エンコーダー名、プラットフォームのアップロード規則、ソーシャルメディアの仕様は変わりやすいため、以下のコマンドと最新の納品仕様を使用して、制作時に再確認してください。
運用ルール
メディアの状態を推測しないでください。まずプローブし、判断し、決定論的なコマンドを実行してから、出力をプローブします。
仕上げの引き継ぎには、必ず以下を含めてください。
ffprobeによる入力監査の概要。- 選択した納品仕様と、未解決の前提条件。
- 実行した正確なコマンド(FFmpeg のバージョンとビルドを含む)。
- 出力監査の概要。
- チェックサムと、必要に応じてフレームハッシュ。
- 字幕の再エンコード、色メタデータの曖昧さ、クリッピング、非可逆トランスコード、プラットフォーム固有の不確実性など、既知のリスク。
同梱の決定論的な補助ツール
このスキルには、標準ライブラリのみを使用する決定論的な Python 3.11 以降のヘルパー scripts/media_probe.py が含まれています。再現可能な技術監査や、仕上げの前後に納品仕様を手早く確認する必要がある場合に使用してください。これはあくまで補助ツールであり、知覚品質のレビュー、カラーマネージメントされた承認、音声の試聴、字幕やアクセシビリティのレビュー、権利の確認、プラットフォームやクライアントの承認に代わるものではありません。
2026-07-11 に確認した事実:ffprobe はマルチメディアストリーム情報を収集するためのもので、-show_format、-show_streams、-print_format json を指定して JSON を出力できます。入力を開けない場合、または認識できない場合は、正の終了コードを返します。このヘルパーは、シェルを介さずに subprocess の argv リストを使用して ffprobe を呼び出し、ffmpeg の実行やメディアの変更は行いません。
呼び出し方法:
python skills/production/runtime-assembly/ffmpeg-media-finishing/scripts/media_probe.py input.mp4 --pretty
python skills/production/runtime-assembly/ffmpeg-media-finishing/scripts/media_probe.py input.mp4 --expect expected.json --pretty
オプション:
media:検査対象の必須メディアパス。ファイルを開くのは ffprobe のみです。--expect expected.json:任意の期待値仕様。終了コード0は監査が実行され、すべての期待値を満たしたことを示します。終了コード1は監査が実行されたものの、1 つ以上の期待値を満たさなかったことを示します。--ffprobe PATH_OR_NAME:ffprobe 実行ファイルを上書きします。既定値はPATH上のffprobeです。--timeout SECONDS:ffprobe のタイムアウト。既定値は30です。--pretty:コンパクトな JSON ではなく、2 つのスペースでインデントした JSON を出力します。
終了コード:
0 audit completed and expectations passed, or no expectations were provided
1 audit completed but at least one expectation failed
2 usage or input-file error
3 ffprobe executable unavailable
4 ffprobe returned a non-zero exit code
5 ffprobe timed out
6 ffprobe output was not valid or usable JSON
7 expectation JSON could not be read, parsed, or validated
正規化された監査スキーマ、バージョン 1.0:
{
"schema_version": "1.0",
"status": "pass",
"tool": "media_probe.py",
"ffprobe": {
"executable": "ffprobe",
"argv": ["ffprobe", "-v", "error", "-show_format", "-show_streams", "-print_format", "json", "input.mp4"]
},
"media": {
"path": "input.mp4",
"format_name": "mov,mp4,m4a,3gp,3g2,mj2",
"format_long_name": "QuickTime / MOV",
"duration_seconds": 1.0,
"size_bytes": 12345,
"bit_rate": 98765
},
"streams": {
"counts": {"video": 1, "audio": 1, "subtitle": 0, "other": 0},
"video": {
"index": 0,
"codec_name": "h264",
"profile": "High",
"width": 1920,
"height": 1080,
"pix_fmt": "yuv420p",
"r_frame_rate": {"raw": "30/1", "value": 30.0},
"avg_frame_rate": {"raw": "30/1", "value": 30.0},
"duration_seconds": 1.0
},
"audio": {
"index": 1,
"codec_name": "aac",
"sample_rate": 48000,
"channels": 2,
"channel_layout": "stereo",
"sample_fmt": "fltp",
"duration_seconds": 1.0
}
},
"expectations": null
}
ビデオストリームまたはオーディオストリームが存在しない場合、その正規化値は null となり、対応するカウントは 0 になります。不明な数値は推測せず、null として出力されます。
期待値スキーマ:
{
"checks": [
{"field": "media.duration_seconds", "op": "tolerance", "value": {"value": 10.0, "tolerance": 0.05}},
{"field": "streams.video.codec_name", "op": "equals", "value": "h264"},
{"field": "streams.video.width", "op": "equals", "value": 1920},
{"field": "streams.video.height", "op": "equals", "value": 1080},
{"field": "streams.video.avg_frame_rate.value", "op": "tolerance", "value": {"value": 30.0, "tolerance": 0.01}},
{"field": "streams.video.pix_fmt", "op": "equals", "value": "yuv420p"},
{"field": "streams.audio.codec_name", "op": "equals", "value": "aac"},
{"field": "streams.audio.sample_rate", "op": "equals", "value": 48000},
{"field": "streams.audio.channels", "op": "equals", "value": 2}
]
}
サポートされる op の値:
equals:JSON の値が完全に一致すること。in:実際の値が期待値の配列に含まれること。range:数値の実際の値が{"min": number, "max": number}の範囲内にあること。いずれかの境界を省略できます。tolerance:数値の実際の値がvalue +/- toleranceの範囲内にあること。
不正な期待値の数値、有限でない数値、負の許容誤差は、期待値ファイルの使用エラーです。ヘルパーはこれらをメディアチェックの失敗として扱わず、構造化エラー JSON とともに終了コード 7 を返します。
フィールドは、正規化されたレポート内のドット区切りパスです。サポートする期待値の対象は、仕上げ時によく使われる確認項目を意図的に網羅しています。具体的には、再生時間の許容誤差、ビデオコーデック、幅、高さ、フレームレート、ピクセル形式、オーディオコーデック、サンプルレート、チャンネル数です。スキーマでは上記に示す安定したフィールドも指定できますが、このヘルパーを知覚品質、色の正確さ、ラウドネス規格への準拠、権利状況の証明として扱わないでください。
1. ツールチェーンと入力を事前確認する
動作はインストールされているバイナリ、コンパイルフラグ、外部ライブラリに依存するため、FFmpeg のビルドとエンコーダー/フィルターの利用可否を記録します。
ffmpeg -hide_banner -version
ffmpeg -hide_banner -encoders
ffmpeg -hide_banner -muxers
ffmpeg -hide_banner -filters
ffmpeg -hide_banner -h encoder=libx264
ffmpeg -hide_banner -h filter=loudnorm
複数の入力がある場合、クライアント仕様がある場合、または不一致のリスクがある場合は、すべてのソースに対して ffprobe を実行し、機械可読な JSON を保存します。
ffprobe -v error \
-show_format -show_streams -show_chapters \
-print_format json input.mp4 > input.ffprobe.json
簡潔な人間向けの監査には、次を実行します。
ffprobe -v error \
-select_streams v:0 \
-show_entries stream=codec_name,profile,width,height,pix_fmt,r_frame_rate,avg_frame_rate,time_base,field_order,color_range,color_space,color_transfer,color_primaries,sample_aspect_ratio,display_aspect_ratio,duration,nb_frames \
-of default=noprint_wrappers=1 input.mp4
ffprobe -v error \
-select_streams a:0 \
-show_entries stream=codec_name,sample_rate,channels,channel_layout,sample_fmt,bits_per_sample,duration,bit_rate \
-of default=noprint_wrappers=1 input.mp4
少なくとも次の項目を監査します。
- コンテナ、再生時間、ファイルサイズ、タイムコード/チャプターの要件。
- 映像コーデック、解像度、表示アスペクト比、サンプルアスペクト比、ピクセル形式、ビット深度、アルファ、インターレース、公称および平均フレームレート、タイムベース、開始時刻。
- カラーメタデータ:レンジ、プライマリ、伝達特性、マトリックス/色空間。
- 音声コーデック、サンプルレート、チャンネル数/レイアウト、再生時間、ビット深度/サンプル形式、必要な場合はラウドネス目標。
- 字幕ストリームと外部字幕。
- MKV/ASS のワークフローにおけるフォントなどの添付ファイル。
- 結合またはストリームコピーの前に、入力のパラメーターが同一かどうか。
ffprobe でメタデータの欠落や不整合が報告された場合、警告として扱い、値を作り上げてよいという意味に解釈しないでください。ユーザーに確認するか、必要な場合に限り制作パイプラインから慎重に推測し、推測した内容を記録します。
2. ストリームコピー、トランスコード、フィルターのいずれかを選ぶ
エンコード済みのストリームがすでに要件を満たしており、コンテナレベルの操作だけが必要な場合は、ストリームコピーを使用します。
ffmpeg -y -i input.mov -map 0 -c copy -movflags +faststart output.mp4
ストリームコピーは、リマックス、キーフレーム境界でのトリミング、互換性のあるメタデータの追加、トラックの抽出に適しています。解像度、コーデック、ピクセル形式、リサンプリングによるフレームレート、ラウドネス、字幕の焼き込み、オーバーレイ、色変換、またはフィルターグラフの出力を変更する場合には適していません。FFmpeg のドキュメントでは、-codec copy は再エンコードせずにストリームをコピーすると説明されています。フィルターにはデコード済みのフレームが必要となるため、再エンコードが必要です。
納品物で異なるコーデック/コンテナ、解像度、フレームレート、ピクセル形式、音声レイアウト、ラウドネス、字幕の焼き込み、オーバーレイ、または互換性プロファイルが求められる場合は、トランスコードします。
品質が重要な場合、プラットフォームまたはクライアント仕様でビットレート上限が指定されていない限り、任意のビットレートよりも一定品質の設定を優先します。libx264 を使用する H.264 でよく使われる、中間素材から納品用への変換パターンは次のとおりです。
ffmpeg -y -i input.mov \
-map 0:v:0 -map 0:a? \
-c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p \
-c:a aac -b:a 192k -ar 48000 \
-movflags +faststart output.mp4
制作上の経験則として、CRF を低くすると品質が高くファイルサイズが大きくなり、CRF を高くするとファイルサイズが小さくなります。目視で確認してください。CRF 値は納品品質を保証するものではありません。クライアントが目標ビットレート、最大ビットレート、GOP 長、プロファイル、クロマ、またはレベルを指定している場合は、この経験則ではなく仕様に従います。
3. コンテナ、コーデック、互換性
コンテナとコーデックを区別します。
- MP4/MOV/MKV/WebM はコンテナです。
- H.264/H.265/AV1/ProRes/DNxHR/AAC/Opus/PCM はコーデックです。
- あるコンテナと互換性のあるストリームでも、別のコンテナとは互換性がない場合があります。
よくある納品形式は次のとおりです。
- 幅広いウェブ/ソーシャルメディアとの互換性:H.264 映像と AAC 音声を使用した MP4。通常は
yuv420p。 - 透明度またはアルファを保持する中間素材:MOV の ProRes 4444、PNG シーケンス、またはターゲットが対応し、インストール済みのビルドでエンコードできる場合に限り、アルファ付き WebM VP9/AV1。
- アーカイブまたはレビュー用の中間素材:ProRes/DNxHR/PCM、またはクライアント指定のその他の中間コーデック。承認を得ずに H.264 に置き換えないでください。
- WebM:ターゲットとの互換性に応じて、通常は VP9/AV1/Opus または VP8/Vorbis。
- 音声のみ:受け渡しには WAV/PCM、プラットフォーム仕様に応じたコンパクトな納品には AAC/MP3/Opus。
コーデックを使用する前に、ローカルビルドを確認します。
ffmpeg -hide_banner -encoders | findstr /i "264 265 av1 prores aac opus"
Windows 以外のシェルでは、findstr の代わりに grep -Ei を使用します。
h264_nvenc、hevc_videotoolbox、h264_qsv、h264_amf などのハードウェアエンコーダーは、マシンとドライバーに依存します。高速な場合がありますが、レート制御の動作や品質が異なる可能性があります。利用可能だと決めつけず、短いサンプルでテストしてください。
4. スケーリング、クロップ、パディング、アスペクト比
ジオメトリの動作は意図的に選択してください。
- フレーム全体を保持することが重要な場合は、キャンバス内に収まるようスケーリングし、パディングします。
- 端のコンテンツが失われてもよい場合は、キャンバスいっぱいにクロップします。
- 歪みが許容される場合、またはソースがすでにターゲットのアスペクト比と一致している場合に限り、正確なサイズにスケーリングします。
- ほとんどのウェブ/ソーシャル向け納品物では、サンプルアスペクト比を正方形ピクセルに正規化します。
全体が収まるように1920x1080にスケーリングし、黒いパディングを追加します。
ffmpeg -y -i input.mp4 \
-vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1" \
-c:v libx264 -crf 18 -preset slow -pix_fmt yuv420p \
-c:a copy output_1080p_letterbox.mp4
クロップして1080x1920の縦長にします。
ffmpeg -y -i input.mp4 \
-vf "scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,setsar=1" \
-c:v libx264 -crf 18 -preset slow -pix_fmt yuv420p \
-c:a aac -b:a 192k output_9x16.mp4
生成する静止画では、クロマサブサンプリングを必要とするコーデック向けに偶数の寸法を使用します。
ffmpeg -y -loop 1 -framerate 30 -t 5 -i still.png \
-vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1,format=yuv420p" \
-c:v libx264 -crf 18 -preset slow -an still_card.mp4
5. フレームレート、タイムスタンプ、タイムベース、同期
フレームレートの変更は、ジャダー、ずれ、重複フレーム、字幕の不具合が発生する一般的な原因です。r_frame_rate と avg_frame_rate の両方を確認してください。可変フレームレートのソースでは、名目上のフレームレートがわかりにくいことがよくあります。
ルール:
- 納品仕様で変換が必要な場合を除き、ソースのフレームレートを維持します。
- 23.976/24/25/30/50/60 fpsの変換を安易に行わないでください。変換によってケイデンスのアーティファクトが生じることがあります。
- ソーシャル向けのバリエーションでは、プラットフォーム/クライアントの仕様、編集タイムライン、または連結要件で必要な場合に限り、単一の固定フレームレートを選択します。
- ストリームコピーでカットする場合、再エンコードしない限り、キーフレームに合わせたトリミングになることを想定してください。
fps、trim、setpts、atrim、asetptsなどのフィルターを使用する場合は、フィルターを適用したストリームを再エンコードします。
プラットフォーム固有のバージョンを固定30 fpsにします。
ffmpeg -y -i input.mp4 \
-vf "fps=30,scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,setsar=1" \
-c:v libx264 -crf 18 -preset slow -pix_fmt yuv420p \
-c:a aac -b:a 192k -ar 48000 output_30fps_vertical.mp4
再エンコードして正確にトリミングします。
ffmpeg -y -ss 12.345 -to 27.890 -i input.mp4 \
-map 0:v:0 -map 0:a? \
-c:v libx264 -crf 18 -preset slow \
-c:a aac -b:a 192k clip_exact.mp4
ストリームコピーでキーフレームに合わせて高速にトリミングします。
ffmpeg -y -ss 12 -to 28 -i input.mp4 -map 0 -c copy clip_fast.mp4
仕上げ後に音声と映像の長さが異なる場合は、開始時刻、PTS/DTSの警告、フィルターグラフによってフレームが削除または複製されていないかを確認します。仕様で求められていない限り、任意の音声パディングで同期の不具合を隠さないでください。
6. カラーレンジと色空間に関する注意
FFmpegでは色のメタデータを設定または変換できますが、メタデータは正しい色変換と同じではありません。生成されたアセットには、信頼できる色タグがないことがよくあります。フルレンジ/リミテッドレンジ、Rec.709/Rec.2020の原色、伝達関数、HDR/SDRの前提が一致していないと、出力が白っぽくなったり、黒つぶれしたりすることがあります。
最低限の手順:
- ソースの色タグを調べます。
- ソースが既知の作業色空間で生成または合成された場合は、その情報を仕上げ時の注記に引き継ぎます。
- 通常のSDRウェブ配信では、クライアントの仕様で別途指定されていない限り、Rec.709のメタデータとyuv420pをターゲットにするのが一般的です。
- HDR、広色域、ログ、またはクライアントが重視するブランドカラーを変換する場合は、カラーマネジメントされたワークフロー、または人による色の承認に引き継ぎます。
- タグを設定した後、出力を再度調べ、動作が確認されているプレーヤーで目視確認します。
色変換を行ったと主張せずにSDR H.264の納品物にタグを付ける例:
ffmpeg -y -i input.mp4 \
-c:v libx264 -crf 18 -preset slow -pix_fmt yuv420p \
-color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv \
-c:a aac -b:a 192k output_sdr_tagged.mp4
マトリクス/レンジ間の変換が必要な場合は、インストール済みのフィルターオプションを確認し、テストフレームで検証したうえで、zscale や colorspace などの色フィルターを使用してください。メタデータフラグだけで変換しないでください。
7. 音声のラウドネス、サンプルレート、チャンネルレイアウト
納品仕様に合わせて音声を仕上げます。仕様がない場合は、次を目安にしてください。
- Web/ソーシャル動画では、48 kHz AAC ステレオが幅広く互換性があります。
- 放送、クライアント向け、広告向けの納品では、指定されたラウドネス基準と許容範囲に正確に従います。
- アーカイブ/交換用には、PCM/WAV を維持するか、求められた場合は個別のステムを納品します。
規格に関する用語は正確に使ってください。
- ITU-R BS.1770 は、ラウドネスとトゥルーピークの測定アルゴリズムを定めています。
- EBU R 128 は、ラウドネスノーマライゼーションとトゥルーピーク制限に基づく放送向けの推奨規格です。
- プラットフォームのラウドネス目標値は異なり、頻繁に変わります。記憶に頼らず、プラットフォームのドキュメントを再確認してください。
まず測定します。
ffmpeg -hide_banner -i input.mp4 \
-af loudnorm=I=-16:TP=-1.5:LRA=11:print_format=json \
-f null -
ラウドネスを再現性のある方法でノーマライズするには、loudnorm を 2 パスで使います。最初のパスで測定し、測定値を 2 回目のパスに渡します。以下の目標値は、一般的なオンライン動画の目安であり、規格ではありません。
ffmpeg -hide_banner -i input.mp4 \
-af loudnorm=I=-16:TP=-1.5:LRA=11:print_format=json \
-f null -
ffmpeg -y -i input.mp4 \
-af "loudnorm=I=-16:TP=-1.5:LRA=11:measured_I=-18.7:measured_TP=-3.2:measured_LRA=8.4:measured_thresh=-29.1:offset=0.2:linear=true:print_format=summary,aformat=sample_rates=48000:channel_layouts=stereo" \
-c:v copy -c:a aac -b:a 192k output_loudnorm.mp4
シアター用ミックス、音楽のダイナミクス、ステム、空間オーディオ、またはクライアント承認済みのマスターを維持する場合は、むやみにノーマライズしないでください。5.1/7.1/Atmos/空間オーディオをステレオにダウンミックスする前に、必ず確認してください。
ダウンミックスの例です。まずプローブでチャンネルレイアウトを確認し、チャンネル名に合わせて調整してください。5.1 ソースによっては、バックチャンネル BL/BR ではなく、サイドチャンネルが SL/SR として示されます。
ffmpeg -y -i input.mov \
-map 0:v:0 -map 0:a:0 \
-c:v copy \
-af "pan=stereo|FL=0.707*FC+FL+0.707*BL+0.5*LFE|FR=0.707*FC+FR+0.707*BR+0.5*LFE,aformat=sample_rates=48000:channel_layouts=stereo" \
-c:a aac -b:a 192k output_stereo.mp4
ダウンミックスは耳で確認してください。定型的なダウンミックス係数は出発点であり、実際に聴いて確認することの代わりにはなりません。
8. キャプションと字幕:映像への焼き込みとサイドカー
キャプションの扱いは後回しにせず、納品時の判断事項として決めてください。
アクセシビリティ、検索性、ユーザーによる制御、ローカライズ、またはプラットフォーム標準のキャプションが重要な場合は、サイドカーキャプションを使用します。一般的なサイドカーフォーマットには SRT や WebVTT があります。対応フォーマットは対象プラットフォームによって異なります。
プラットフォームが字幕トラックに対応していない場合、ユーザーがオープンキャプションを求めている場合、または短尺ソーシャル動画での読みやすさを優先する場合は、キャプションを映像に焼き込みます。焼き込まれたキャプションはピクセルです。オフにしたり、検索したり、支援技術でスタイルを変更したり、再レンダリングせずに修正したりすることはできません。
WCAG のガイダンスでは、キャプションを、音声と必要な非音声の音声情報に同期したテキストとして扱います。アクセシビリティやクライアントのコンプライアンスが重要な場合は、レビューせずに自動生成キャプションを最終版として扱わないでください。
コンテナ/プレーヤーが対応している場合は、互換性のある SRT サイドカーを字幕ストリームとして追加します。
ffmpeg -y -i input.mp4 -i captions.srt \
-map 0:v -map 0:a? -map 1:0 \
-c:v copy -c:a copy -c:s mov_text \
-metadata:s:s:0 language=eng output_with_captions.mp4
libass を利用したレンダリングで SRT キャプションを映像に焼き込みます。
ffmpeg -y -i input.mp4 \
-vf "subtitles=captions.srt:force_style='Fontname=Arial,Fontsize=42,Outline=2,Shadow=1,MarginV=80'" \
-c:v libx264 -crf 18 -preset slow -pix_fmt yuv420p \
-c:a copy output_burned_captions.mp4
subtitles を使う前に、FFmpeg のビルドがフィルターと libass に対応していることを確認してください。
ffmpeg -hide_banner -filters | findstr /i subtitles
キャプションの品質確認:
- すべてのトリミングと速度変更を反映した最終音声に対して、タイミングを確認します。
- 必要に応じて、意味のある話者 ID と非音声の音声情報を含めます。
- 対象のアスペクト比で読みやすい行にします。
- プラットフォーム UI のオーバーレイに対するセーフエリアをテストします。
- エンコード/焼き込み後に、特殊文字や非ラテン文字のスクリプトを確認します。
- アクセシビリティとソーシャル動画での読みやすさの両方が必要な場合は、サイドカー版と焼き込み版の両方を納品します。
9. 画像シーケンス、静止画、生成フレーム
生成された画像シーケンスは、AI パイプラインでよく使われます。エンコード前に、連番、フレームレート、ピクセルフォーマット、アルファの扱いを統一してください。
連番 PNG シーケンスをエンコードします。
ffmpeg -y -framerate 24 -start_number 1 -i "frames/frame_%05d.png" \
-c:v libx264 -crf 18 -preset slow -pix_fmt yuv420p output_from_sequence.mp4
コンポジット確認用にアルファを維持します。
ffmpeg -y -framerate 24 -i "frames/frame_%05d.png" \
-c:v prores_ks -profile:v 4444 -pix_fmt yuva444p10le output_alpha.mov
品質確認用にフレームを抽出します。
ffmpeg -y -i output.mp4 -vf "fps=1,scale=320:-1" "qa/thumb_%04d.jpg"
シーケンスにフレームの欠落、重複した番号、サイズの不一致、カラープロファイルの混在、または一貫しないアルファがある場合は、エンコードを中断し、シーケンスを修正してください。
10. GIF とソーシャル向けプレビューの書き出し
GIF はプレビューに役立つことが多い一方、写真のような映像や長尺コンテンツには非効率です。GIF が明示的に求められていない限り、実際の納品には MP4/WebM を優先してください。
GIF の品質向上にはパレットを使用します。
ffmpeg -y -ss 0 -t 4 -i input.mp4 \
-vf "fps=12,scale=640:-1:flags=lanczos,palettegen" palette.png
ffmpeg -y -ss 0 -t 4 -i input.mp4 -i palette.png \
-lavfi "fps=12,scale=640:-1:flags=lanczos[x];[x][1:v]paletteuse=dither=bayer:bayer_scale=5" \
preview.gif
マスターからソーシャル向けの簡易版を作成します。ただし、最終納品前に最新のプラットフォーム規則を再確認してください。
# 16:9 landscape
ffmpeg -y -i master.mov \
-vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1" \
-c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p \
-c:a aac -b:a 192k -movflags +faststart deliverable_16x9.mp4
# 9:16 vertical
ffmpeg -y -i master.mov \
-vf "scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,setsar=1" \
-c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p \
-c:a aac -b:a 192k -movflags +faststart deliverable_9x16.mp4
# 1:1 square
ffmpeg -y -i master.mov \
-vf "scale=1080:1080:force_original_aspect_ratio=increase,crop=1080:1080,setsar=1" \
-c:v libx264 -crf 20 -preset medium -pix_fmt yuv420p \
-c:a aac -b:a 192k -movflags +faststart deliverable_1x1.mp4
ソーシャルメディアや広告の仕様は変わります。最新のプラットフォームドキュメント、クライアントのメディアプラン、広告マネージャーの要件を拘束力のあるものとして扱い、ここでの例は出発点として扱ってください。
11. 結合、トリミング、スレート、オーバーレイ、ウォーターマーク
入力のコーデック、タイムベース、解像度、ピクセル形式、フレームレート、サンプルレート、チャンネルレイアウトに互換性がある場合に限り、ストリームコピーで結合します。それ以外の場合は、各クリップを先に正規化するか、concat フィルターを使用して再エンコードします。
互換性のあるクリップで concat デマルチプレクサーを使用する場合:
file 'clip01.mp4'
file 'clip02.mp4'
file 'clip03.mp4'
ffmpeg -y -f concat -safe 0 -i concat_list.txt -c copy joined.mp4
先に正規化してから結合する場合:
ffmpeg -y -i clip01.mov -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,fps=30,setsar=1,format=yuv420p" -af "aformat=sample_rates=48000:channel_layouts=stereo" -c:v libx264 -crf 18 -preset slow -c:a aac -b:a 192k norm01.mp4
ウォーターマークをオーバーレイする場合:
ffmpeg -y -i input.mp4 -i logo.png \
-filter_complex "[1:v]scale=180:-1[logo];[0:v][logo]overlay=W-w-40:H-h-40:format=auto" \
-c:v libx264 -crf 18 -preset slow -pix_fmt yuv420p \
-c:a copy output_watermarked.mp4
番組の音声との同期を保ちながら画像からスレートを追加するには、番組の音声の前にスレート用の無音部分を明示的に連結します:
ffmpeg -y -loop 1 -t 3 -i slate.png -i program.mp4 -f lavfi -t 3 -i anullsrc=r=48000:cl=stereo \
-filter_complex "[0:v]scale=1920:1080,setsar=1,fps=30,format=yuv420p[v0];[1:v]scale=1920:1080,setsar=1,fps=30,format=yuv420p[v1];[2:a]aformat=sample_rates=48000:channel_layouts=stereo[a0];[1:a]aformat=sample_rates=48000:channel_layouts=stereo[a1];[v0][a0][v1][a1]concat=n=2:v=1:a=1[v][a]" \
-map "[v]" -map "[a]" \
-c:v libx264 -crf 18 -preset slow -c:a aac -b:a 192k output_with_slate.mp4
番組に音声がない場合は、映像のみの結合(concat=n=2:v=1:a=0)を使用し、音声のマップを省略します。意図的にオフセットさせるのでない限り、スレートを先頭に追加した状態で番組の音声を直接マップしないでください。
12. バッチ処理のバリエーションと再現性
バッチ作業では、マニフェスト駆動のパターンを使用します。入力パス、出力パス、要求仕様、正確なコマンド、FFmpeg のバージョン、ソースハッシュ、出力ハッシュ、QA ステータスを記録します。何十ものバリエーションに対して、手書きの単発コマンドを使うことは避けてください。
マニフェストのフィールド例:
{
"job_id": "campaign-final-2026-07-11",
"ffmpeg_version": "record from ffmpeg -version",
"source": "master.mov",
"source_sha256": "computed before processing",
"deliverables": [
{
"name": "youtube_16x9",
"output": "deliverable_16x9.mp4",
"spec": "MP4 H.264 AAC 1920x1080 SDR",
"command": "exact command string",
"output_sha256": "computed after processing",
"qa": "pass with noted warnings"
}
]
}
ファイル整合性マニフェストには SHA-256 を使用します:
certutil -hashfile output.mp4 SHA256
macOS/Linux の場合:
shasum -a 256 output.mp4
デコードされたフレームの同等性を検証したり、メディアの意図しない変更を検出したりする場合は、FFmpeg のフレームハッシュを使用します:
ffmpeg -v error -i output.mp4 -f framehash output.framehash
ffmpeg -v error -i output.mp4 -f framemd5 output.framemd5
メタデータが変更されると、ファイルのチェックサムも変わります。フレームハッシュは、一部のコンテナメタデータの変更後も変わらないことがありますが、非可逆再エンコード、スケーリング、音声の正規化、ピクセル形式やサンプル形式の変換後には変わります。
13. 最終 QA チェックリスト
自動チェックを実行します:
ffmpeg -v error -i output.mp4 -f null -
ffprobe -v error -show_format -show_streams -print_format json output.mp4 > output.ffprobe.json
次の項目を確認します:
- 出力ファイルが、少なくとも 1 つの対象プレーヤーで開いて再生できる;
- 再生時間が許容範囲内で想定と一致している;
- 冒頭、中間、末尾で音声と映像の同期が保たれている;
- 予期しないフレームのドロップ/重複に関する警告がない;
- 解像度、アスペクト比、フレームレート、ピクセル形式、コーデック、プロファイル、レベル、ビットレート/ファイルサイズが仕様を満たしている;
- 音声のサンプルレート、チャンネルレイアウト、ラウドネス、トゥルーピークが仕様を満たしている;
- 字幕が同期しており、読みやすく、正確で、要求どおりにエンコードまたは焼き付けられている;
- オーバーレイとウォーターマークが正しく配置され、プラットフォームの UI に隠れない位置にある;
- カラータグが意図した納品仕様と一致し、目視確認でも問題がない;
- メタデータに、意図しないプライベートなパス、モデルのプロンプト、クライアント情報が漏れていない;
- チェックサム/マニフェストが作成されている;
- ファイル名が決定的で、プラットフォームで使用できる形式になっている。
重要な納品物では、コマンドの成功だけを信頼せず、フレームを抜き出して確認します:
ffmpeg -y -i output.mp4 -vf "select='eq(n,0)+eq(n,300)+eq(n,600)',scale=480:-1" -vsync vfr "qa_sample_%03d.jpg"
エスカレーションの判断基準
次の場合は作業を中断し、承認を求めるか、専門家による確認を依頼してください:
- クライアントの仕様が、ソースメディアまたはプラットフォームの制限と矛盾している;
- 法務、権利、ウォーターマーク、ロゴ、音楽ライセンス、字幕コンプライアンス、アクセシビリティコンプライアンス、広告ポリシーに関する問題が生じている;
- HDR、広色域、放送、劇場、サラウンド/空間オーディオ、または色の厳密な管理が必要な納品が求められている;
- プラットフォームの仕様を入手できない、アクセス制限がある、または概要説明の作成後に変更されている;
- 生成コンテンツに個人データ、未公開の製品情報、不明な第三者のマークが含まれている;
- FFmpeg に必要なエンコーダー/フィルターがなく、代替手段を使うと品質、コスト、互換性が変わる;
- クライアントが承認したマスターに対して、非可逆トランスコードが避けられない;
- コンプライアンスに関わる公開に向けて、字幕の正確性が人手で確認されていない。
法的な助言は避けてください。制作上のリスクを説明し、適切にクライアント、法律顧問、プラットフォーム、またはアクセシビリティの専門家による確認を推奨してください。
完全な例
例:字幕付きの生成済み9:16ソーシャル動画を仕上げる
目的:AI動画のマスターとレビュー済み字幕から、縦型の短尺動画を作成します。
入力:
master.mov:音声付きの生成済み16:9または混合アスペクト比の動画captions.srt:レビュー済みの字幕ファイル- 目標:1080x1920のMP4、H.264/AAC、ソーシャルフィード向けの焼き込み字幕
ワークフロー:
ffmpeg -hide_banner -version > ffmpeg_version.txt
ffprobe -v error -show_format -show_streams -print_format json master.mov > master.ffprobe.json
ffmpeg -y -i master.mov \
-vf "scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,setsar=1,subtitles=captions.srt:force_style='Fontname=Arial,Fontsize=44,Outline=2,Shadow=1,MarginV=110',format=yuv420p" \
-af "loudnorm=I=-16:TP=-1.5:LRA=11,aformat=sample_rates=48000:channel_layouts=stereo" \
-c:v libx264 -crf 20 -preset slow \
-c:a aac -b:a 192k -movflags +faststart \
final_9x16_burned.mp4
ffmpeg -v error -i final_9x16_burned.mp4 -f null -
ffprobe -v error -show_format -show_streams -print_format json final_9x16_burned.mp4 > final_9x16_burned.ffprobe.json
certutil -hashfile final_9x16_burned.mp4 SHA256
この構成にする理由:
- 縦型での配信に合わせて、スケーリング/クロップを明示しています。
- 多くのソーシャル視聴環境では音声オフでの短時間視聴が標準となっているため、字幕を焼き込んでいます。
- 音声は放送規格ではなく、オンライン動画向けの目安に合わせて正規化しています。
- 出力を再度プローブし、ハッシュを計算します。
考えられる失敗例:
- クロップによって重要な映像コンテンツが切れてしまう
- libassがないため、
subtitlesフィルターを利用できない - 音量の目標値がクライアント/プラットフォームの仕様に適していない
- ソースの色メタデータが曖昧なまま残る
例:エンコード済みストリームを変更せずに承認済みマスターをリマックスする
目的:再エンコードせずに、承認済みのMOVマスターをレビュー用アップロード向けのMP4コンテナに変換します。
ワークフロー:
ffprobe -v error -show_format -show_streams -print_format json approved_master.mov > approved_master.ffprobe.json
ffmpeg -y -i approved_master.mov \
-map 0 -c copy -movflags +faststart review_upload.mp4
ffprobe -v error -show_format -show_streams -print_format json review_upload.mp4 > review_upload.ffprobe.json
certutil -hashfile approved_master.mov SHA256
certutil -hashfile review_upload.mp4 SHA256
判断に関する補足:
- エンコード済みストリームを保持します。画質を変更するレンダリングではありません。
- 入力ストリームがMP4で使用でき、配信先で受け入れられる場合にのみ機能します。
- コンテナが変わるため、ファイルのチェックサムは異なります。必要に応じて、デコード済みフレームのハッシュを使ってメディアの本質的な内容を検証できます。
例:横型、正方形、縦型のバリエーションを一括で納品する
目的:マニフェストの履歴を保持しながら、1つのマスターから決定的な3種類のバリエーションを作成します。
ワークフロー:
ffprobe -v error -show_format -show_streams -print_format json master.mov > master.ffprobe.json
ffmpeg -y -i master.mov \
-vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1,format=yuv420p" \
-c:v libx264 -crf 20 -preset medium -c:a aac -b:a 192k -movflags +faststart deliverable_16x9.mp4
ffmpeg -y -i master.mov \
-vf "scale=1080:1080:force_original_aspect_ratio=increase,crop=1080:1080,setsar=1,format=yuv420p" \
-c:v libx264 -crf 20 -preset medium -c:a aac -b:a 192k -movflags +faststart deliverable_1x1.mp4
ffmpeg -y -i master.mov \
-vf "scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,setsar=1,format=yuv420p" \
-c:v libx264 -crf 20 -preset medium -c:a aac -b:a 192k -movflags +faststart deliverable_9x16.mp4
バリエーション:
- 大きなマスターでは、複数出力のフィルターグラフを1つ使うほうが高速な場合がありますが、コマンドを3つに分けるほうが監査やデバッグが容易です。巧妙なワンライナーよりも、明快で信頼性の高い出力を優先してください。
参照元と検証に関する注記
このスキルの重要な事実は、以下の参照元に基づいており、2026-07-11に確認しています。
- FFmpegコマンドおよびストリームコピーのドキュメント:https://ffmpeg.org/ffmpeg.html
- ffprobeのドキュメントおよびJSON/ストリーム表示オプション:https://ffmpeg.org/ffprobe.html
- scale/crop/pad/fps/loudnorm/subtitles/overlayを含むFFmpegフィルターのドキュメント:https://ffmpeg.org/ffmpeg-filters.html
- concat、image2、GIF、hash/framehash/framemd5を含むFFmpegのフォーマット/マルチプレクサーのドキュメント:https://ffmpeg.org/ffmpeg-formats.html
- ラウドネスおよびトゥルーピークのアルゴリズムに関するITU-R BS.1770勧告のページ:https://www.itu.int/rec/R-REC-BS.1770
- EBU R 128ラウドネス勧告:https://tech.ebu.ch/publications/r128/
- W3C/WAIの字幕ガイダンスおよびWCAGの字幕適合基準:https://www.w3.org/WAI/media/av/captions/ および https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html
- YouTubeの推奨アップロードエンコード設定。変動するプラットフォームのガイダンスの一例としてのみ使用:https://support.google.com/youtube/answer/1722171
- TikTok Ads Managerの仕様。変動するプラットフォーム/広告のガイダンスの一例としてのみ使用:https://ads.tiktok.com/help/article/tiktok-auction-in-feed-ads