Firewire天文学カメラからグレースケールビデオストリームが出ています。FFmpegを使用してビデオストリームを圧縮したいのですが、MPEG1VIDEOコーデックのシングルバイトピクセル形式を受け入れません。FFmpeg APIを使用して、グレースケールビデオフレームをFFmpegで受け入れられるフレーム形式に変換するにはどうすればよいですか?
4 に答える
MPEG-1はYUVのみを受け入れるため、フレームをYUV形式に変換する必要があります。SwsContext
を呼び出して作成した構造を使用してsws_getContext()
から、を使用しますsws_scale()
。
グレースケールとYUVの関係は非常に単純です-YUVの「Y」はグレースケールとまったく同じです。
グレースケールをYUVに変換する簡単な方法は次のとおりです。
スケール間の変換については、次のリファレンスを参照してください。
によると :
Y =(0.257 * R)+(0.504 * G)+(0.098 * B)+ 16 Cr = V =(0.439 * R)-(0.368 * G)-(0.071 * B)+ 128 Cb = U =-(0.148 * R)-(0.291 * G)+(0.439 * B)+ 128 今: グレースケール画像(W)の場合: R = W; G = W; B = W; これを維持する: Y [i] = 0.895 * W [i]+16。 U [i] = 128(固定値) V [i] = 128(固定値)
実際には、ほぼ同じY [i] =W[i]を使用できます。128の値は、0〜256の符号付きから符号なしへの変換のスケーリング/シフトされたベースの「0」を表します。
したがって、保持する必要があるのは、この他のメモリ領域YとUを固定値として作成し、このフレームをffmpegに提供することだけです。
よくわかりませんが、FFMPEGに適切に伝えることで、これは内部でのみ行われます。あなたが提供するRGB値も同様にカバーされています。これもMPEGにネイティブではありません。
それで、これを可能にするFFMPEGのAPIを探してください。
ボーナス
古き良き時代には白黒(グレースケール)のテレビがあったことを忘れないでください。新しいカラーテレビセットは、古いものに準拠する必要があるため、色情報はUとVの形式で追加されます(YCbCrとも呼ばれます-CbとCrはクロマと呼ばれ、それぞれUVの線形変化ですこのコンテキスト)。
単に「色相」フィルターを使用する場合に機能します。このような:
ffmpeg -i inputfile.ogv -vf hue=s=0 outputfile-unsat.ogv
ffmpegに問題がある場合は、最初に最新バージョンをダウンロードする必要があります。これにより、いくつかのバグが修正されます。
https://ffmpeg.org/download.html#build-windows