3

C++、Qt、および OpenGL を使用して、リアルタイムでビデオを操作するためのツールを開発する予定です。フレーム処理にはシェーダーを使用する必要があるため、ビデオ オーバーレイはオプションではありません。現時点では、次の一連の手順を想像しています。

  1. ビデオのデコード (CPU)
  2. 前処理 (オプション、CPU)
  3. ビデオメモリに転送 (DMA を使用する GPU)
  4. 頂点シェーダーとフラグメント シェーダー (GPU) を使用してさらに処理する
  5. レンダリング (GPU)

ここで使用できるエクステンションやテクニックを説明する一般的なアドバイスを探しています。代わりに Direct3D を使用する正当な理由はありますか?

4

5 に答える 5

2

Linux を使用している場合、180.xx シリーズの NVIDIA の最近のドライバーは、VDPAU API (Video Decoding and Presentation something) を介したビデオ デコーディングのサポートを追加しました。mplayer、vlc、ffmpeg、mythtv など、多くの主要なプロジェクトが API と統合されています。すべての詳細を知っているわけではありませんが、一般的なサブ操作やビットストリーム操作を含む多くのコーデックの API を提供しています。

CUDAに直接行く前にここを見ます(VDPAUが使用すると思います)

于 2009-01-26T17:13:25.590 に答える
2

まず、PC では DMA を明示的に使用する方法はありません。ドライバーはそれを使用するか、他のものを使用する可能性があります

いずれにせよ、ステップ 3 は「グラフィックス カードのテクスチャ データを変更する」ことになります。OpenGL では、PBO (Pixel Buffer Object) 拡張または古き良き glTexSubImage* 関数です。D3D9 では、これはテクスチャまたはその他の方法での LockRect です (たとえば、スクラッチ テクスチャで LockRect を実行し、GPU テクスチャにブリットします)。それらのいずれも DMA を使用する可能性がありますが、確実ではありません。

次に、データはテクスチャにあります。いくつかのシェーダーを使用して画面にレンダリングしたり (YCbCr 変換を行うなど)、他のテクスチャにレンダリングしてより複雑な処理効果 (ぼかし/グロー/...) を実行したりできます。

Direct3D を使用すると、明確に定義された「無駄な方法」があるという意味でより簡単になります。OpenGL には、何かを行うためのより多くのオプションがあり、どのオプションが高速であるかをどうにかして把握する必要があります (プラットフォームやハードウェアによって高速パスが異なる場合があります)。

于 2009-01-27T07:26:16.867 に答える
1

CPU から GPU にフレーム データを転送する場合は、PBOを参照することをお勧めします。これもチェック。

また、とにかくシェーダーを使用している場合は、フラグメント シェーダーで色空間変換 (YCbCr から RGB) を行うことで、CPU の負担を軽減できます。

「さらなる処理」と「レンダリング」のステップは通常、ほとんど同じことです。シェーダーでクールなことを行い、それをフレームバッファーにブレンドします。動画とさまざまなエフェクトを組み合わせて使用​​したい場合は、FBOも便利です。

于 2009-01-27T07:22:07.887 に答える
0

別の方法として、NVIDIA の CUDA や ATI の Stream SDK など、汎用 GPU プログラミング (GPGPU) を実行するためのさまざまな言語を調べることができます。ただし、どちらを選択するかによって、1 つのブランドの GPU に限定することができます。これらの言語を使用する理由は、シェーダーを使用する代わりに、通常の高レベル プログラミングに近い抽象化レベルで作業するためです。

私はあなたが何をしたいのか経験がないので、シェーダーが実際にその仕事により適しているかどうかはわかりませんが、それはあなたが検討できるものです. アルゴリズムの設計は通常のコードとはまだ多少異なり、コツをつかむには多少の努力が必要であると言わざるを得ません (私は CUDA でしか作業していませんが、それらはすべて同様の抽象化を使用しているようです)。

シェーダーの作業にかなりの経験がある場合は、新しいプラットフォームを習得するのに苦労する価値はないかもしれません。

于 2009-01-26T17:13:25.573 に答える
0

次の手順でそれを行う必要があります。

  1. ビデオを YUV にデコードする

    これは通常、デコーダ ライブラリが行うことです。

  2. テクスチャとして OpenGL に読み込む

  3. YUV を RGB に変換する

    オーバーレイを使用したくないので、手動で変換する必要があります。シェーダーを使用した例を次に示します

  4. 変換されたテクスチャをクワッドに置き、画面にレンダリングする

于 2009-02-02T02:06:44.850 に答える