現在、DeckLink 4K Extreme の HDMI 入力を介してビデオカメラから 59.94 FPS で HD1080p ビデオを取り込んでいます。
私の目標は、受信画像を WPF UI 要素に複製することです。これを実現するために、C# WPF アプリケーションで DeckLink SDK を使用しています。
このプログラムでは、VideoInputFrameArrived コールバックを実装しました。このコールバックでは、各フレームからイメージのソースとして設定した WriteableBitmap にバイトをコピーしています。
これはすべて正常に機能し、プログラムを実行すると、フレームが到着すると Image が実際にリアルタイムで更新されます。
私の問題は、ビデオ入力でサポートされているピクセル形式が 8BitYUV と 10BitYUV の 2 つだけであり、どちらもコンピューターのモニターにネイティブに表示できないことです。
WriteableBitmap は、さまざまな RGB、白黒、および CMYK 形式のみを受け入れることができます。
これが私がこれまでに試したことです。
IDeckLinkVideoConversion::ConvertFrame() を使用して各フレームを変換しようとしました
問題: ConvertFrame() は、IDeckLinkOutput::CreateVideoFrame() を使用して、DeckLink でレンダリングされる宛先フレームを必要とします。私が現在理解しているように、DeckLink は入力 (ビデオ フィードをキャプチャするため) と出力 (宛先フレームをレンダリングするため) の両方として機能することはできません。
入力ストリームを 8BitYUV に設定し、各フレームを BGR32 の形式で WriteableBitmap にコピーしました。
問題: 前述のとおり、画像は表示されますが、色が正しくなく、画像の幅が必要な半分しかありません。
この理由は、8BitYUV の着信ストリームが 16 ビット/ピクセルであるのに対し、ビットマップは 32 ビット/ピクセルを想定しているため、ビットマップは各着信 MacroPixel (4 バイト) を実際の 2 ピクセルではなく 1 ピクセルとして扱うためです。
現在、ピクセル シェーダーを使用して色を修正し、RenderTransform を使用して Image を水平方向に 2 倍に拡大し、アスペクト比を「修正」しています。問題は、元の解像度の半分になっていることです。
これはハードウェアの制限ではないと思います。別のモニターを DeckLink の HDMI 出力に接続すると、入力画像がフル 1080p で完全な色で表示されるからです。その送信ストリームをメモリのどこかにキャプチャすることは可能でしょうか?
TL;DR 4:2:2 YUV (UYVY) を RGB または CMYK ピクセル形式にリアルタイムで変換する最良の方法は何ですか? (1080p @ 59.94 FPS)
できれば、DeckLink や GPU などのハードウェア ソリューションを使用してください。