2

現在、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 などのハードウェア ソリューションを使用してください。

4

2 に答える 2