
38 秒のビデオ トラック (1 秒あたり 25 フレーム) 内の個々のフレームとなることを意図した PNG ファイルが 950 個あります。ファイル名は、このようなケースでは慣例となっているように、シーケンス番号を除いて同一です。
私は、この一連の PNG 画像から、広くサポートされている形式 (すべての条件を満たす場合は WebM が理想的ですが、再生用に最新のブラウザーでサポートされているコーデックを使用した MPEG-4 など) のコンテナーを作成したいと考えています。問題は、色がシフトし、デコードされたビデオの背景色が、PNG 画像の背景色からサンプリングされた同じ RGB トリプレットと一致しなくなることです。その結果、ビデオが埋め込まれている HTML ページで、ビデオが意図した背景から突き出てしまいます。
私は単純な方法を試しました:
ffmpeg -f image2 -i image%03d.png output.webm
実際に、WebM コンテナーにパックされた 25 fps の VP9 ビデオ トラックが得られました。
PNG画像はアニメーションスタイルで、背景は単色、前景はシンプルな図形がアニメーション化されています。色付きで表示されます。タグなし(Adobe Bridge がそう言っていますが、これは埋め込まれたカラー プロファイルまたは参照がないことを意味していると思います)。上記の試みの問題点は、コンテナーが Chrome で再生されても、RGB トリプレットを使用して PNG 画像からサンプリングされた背景色が、#ED4D56
再生中のビデオに表示される背景色と知覚的に一致しないことです。
これは、RGB から YUV (エンコード) から RGB (再生) へのカラー変換の避けられない副作用でしょうか。これを軽減する方法はありますか。ビデオ トラックのフレームを RGB を使用してエンコードすることを主張しているわけではありません。これらのフレームを再生する最新のブラウザーが、フレームをデコードして表示するときに同じ (無視できる誤差の範囲内で) RGB トリプレットを生成する限り、YUV で問題ないと思います。
私の質問は、どのコマンドラインを使用してffmpeg
これを緩和できるかということです。ビデオ コーデック、ピクセル形式を切り替えたり、ffmpeg でカラー管理を有効にする (存在する場合) などを行うことは可能です。
答え1
最近、非常によく似たタスクがありましたが、まだ完璧な解決策はないと思います (2018 年 10 月現在)。これは、低精度の RGB から YUV への色変換、そして RGB への色変換の副作用です。コーデックの「ロスレス」バリアント (例libvpx-vp9 -lossless
) でも、YUV 色空間が原因で色が歪んでしまいます。
正確でない色が許容される場合は、libvpxコーデックはかなり良い仕事をすることができます:
ffmpeg -r 25 -i image%03d.png -c:v libvpx -crf 4 -b:v 0 output.webm
これらの設定により、フレーム セットによっては、無視できる程度の色の変化、または正確な色が生成されました。VPx コーデックは幅広くサポートされており (IE と Safari を除くすべての主要ブラウザー)、適切なファイル サイズを生成します。
正確な色が厳密に必要な場合は、色空間の変換を避ける必要があります。私が思いついた唯一のクロスブラウザの解決策は、アニメーションPNGimages. は
ffmpeg
apng に対して非常に基本的なサポートしか提供していないため、他のツールを使用する方が適切ですapngasm
。例:apngasm output.png image001.png 1 25
IE と Edge を除くすべての環境で動作します (IE と Edge では、静的な最初のフレームにフォールバックします)。ファイル サイズは巨大ですが、これは真のロスレス エンコーディングの代償です。
- のlibx264rgbコーデックについても言及する必要があります - それを使用する意思 ブラウザがサポートしている場合、正確な RGB カラーをエンコードする正しい方法になります。