問題タブ [dxva]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - GPU デインターレース
OpenGL を使用して色変換、スケーリング、変換などのビデオ処理を行うアプリケーションがあります。私は主に BGRA (1xGL_BGRA) または YUVA (4xGL_R) ビデオ、つまりアルファを含むものを扱っています。
次に、高品質のインターレース解除も行いたいと思います。Nvidia は、"PureVideo" 機能を通じて高品質のハードウェア アクセラレーションによるインターレース解除をサポートしていることに気付きました。基本的に私がやりたいことは、x 数のカラー チャネルを持つインターレースされた OpenGL テクスチャを送信し、2 つのプログレッシブ テクスチャを取得することです。
私の質問は、この機能に最も簡単かつ最も効率的にアクセスする方法です (おそらく OpenGL との相互運用で)。
私はDXVAとOpenMaxを見てきましたが、どちらも再生に重点を置いているようです(デインターレース処理ではありません。つまり、フレームレートなどの関連性のないオプションを設定する必要があります...)およびアルファなしフォーマット...
windows - DXVA2 アクセラレーションを使用して ffmpeg を介してアプリケーションで H.264 ビデオを再生する
Windows アプリケーションで H.264 ビデオを出力しようとしています。私はFFMPEGにある程度精通しており、SDLウィンドウで問題なくH.264を再生することに成功しています。それでも、ハードウェア アクセラレーション (おそらく DXVA2 を使用) を使用すると、本当にメリットがあります。
生のH264ビデオ、コンテナなし、オーディオなし...生のビデオのみ(Bフレームなし、IとPのみ)を読んでいます。また、このアプリケーションを使用するすべてのシステムには、少なくとも VP3 をサポートする Nvidia GPU が搭載されていることもわかっています。その一連の仮定を考慮して、いくつかのコーナーを切り取り、一般的なものではなく単純なものにして、特定のシナリオで機能するようにしたいと考えていました。
これまでのところ、ff_find_hwaccel を呼び出して hwaccel メンバーを埋めることにより、コーデック コンテキストでハードウェア アクセラレーションを設定する必要があることがわかっています。私の計画は、H.264 のデコード時に FFMPEG を使用して DXVA2 をサポートするのに非常に優れた Media Player Classic Home Cinema を調べることです。ただし、コードは非常に大きく、どこを見ればよいかわかりません。h264.c で ff_find_hwaccel が呼び出されている場所を見つけることができますが、他にどこを見ればよいか考えていました。
より具体的には、FFMPEG を介して DXVA2 を動作させるためにコーディングする必要がある最小限の手順を教えてください。
編集:トリックを実行する「重要な」コードを見つけることができる場所を誰かが知っていれば、VLCまたはその他のものを見ることができます。MPC-HC について言及したのは、Windows でコンパイルするのが最も簡単だと思うからです。
ffmpeg - 生の H264 NALU のストリームを MP4 のようなコンテナーにラップする
x264 x264_encoder_encode を使用してオンザフライでエンコーディングから生成された生の h264 NALU を送信するアプリケーションがあります。プレーン TCP を介して取得しているため、フレームが欠落していません。Windows のハードウェア アクセラレーション (DXVA2) を使用して、クライアントでこのようなストリームをデコードできる必要があります。FFMPEGを使用してこれを機能させる方法を見つけるのに苦労しています。Media Foundation や DirectShow を試す方が簡単かもしれませんが、生の H264 は使用できません。次のいずれかが必要です。
サーバー アプリケーションのコードを変更して、mp4 ストリームを返します。私はx264の経験がありません。x264_encoder_encode を呼び出すことで生の H264 を取得できました。次の質問への回答に従ってください: x264 C API を使用して一連の画像を H264 にエンコードする方法は? リアルタイムでストリーミングしながら、これから MP4 でラップされたものに移行するにはどうすればよいですか?
レシーバーでmp4ヘッダーでラップし、DXVAを使用して再生できるものにフィードできます。私はこれを行う方法を知りません
FFMPEG を使用した DXVA など、生の形式で取得する別の方法を使用して、高速化する別の方法を見つけることができました。
重要な制限は、デコードされた各フレームを表示する前に前処理できるようにする必要があることです。単一のステップでデコードと表示を行うソリューションは、私にとってはうまくいきません
どちらのソリューションでも問題ありません
performance - 7 つのバック バッファーを備えた DirectX 11 スワップ チェーン
デスクトップ モードの Windows 8 で動作する独自のメディア プレーヤーがあります。ランタイム DirectX のバージョンは 11 ですが、ネイティブ グラフィックス ドライバーのサポートは DirectX 9 用です。
まったく同じセットアップの一部のコンピューターでは、実際のスワップ チェーンのバック バッファー カウントが 2 であり、パフォーマンスが優れていることがわかります。バッファ カウントは 7 で、ドロップされたフレームがあります。
私はそのプレーヤーのソース コードを持っていないので、実行時に異なるバック バッファー カウント数を決定する理由は何でしょうか。
そのようなバックバッファ数がパフォーマンスの変化につながる理由を誰かが説明できますか? または、バックバッファ数の意味を説明する関連ドキュメントを教えてください。
(詳細なデバッグ情報: GPUView を使用すると、バックバッファー カウントが 2 の場合、ハードウェアが同期モードで動作することがわかります。つまり、1 秒の VSync (クリップ フレーム レートは 30fps) ごとに HW キューに 1 つのパケットがあり、7 つのバックバッファーの場合、作業は5 ~ 7 フレームまとめて実行し、次にいくつかの空の VSync、次に 5 ~ 7 フレーム、というように)。
前もって感謝します!
c++ - Direct3D デバイス マネージャーの使用方法を教えてください。
Direct3D アプリケーションの複数のスレッドとオブジェクト間で 1 つの Direct3D デバイスを共有したいと考えています。ビデオ処理やビデオ アクセラレーションは行っていませんが、Direct3D デバイス マネージャーを見つけました 。 v=vs.85).aspx
私のコードでは、次のことを行っています。
私の質問は、Direct3D デバイス マネージャーを作成した後、デバイス マネージャーへのポインターを渡すことなく、direct3d デバイス マネージャーを他のオブジェクトと共有するにはどうすればよいかということです。マイクロソフトは具体的に次のことを行うように言っていますが、次のことが実際に何を意味するのかわかりません。
デバイスの所有者は、他のオブジェクトが IDirect3DDeviceManager9 インターフェイスへのポインターを取得する方法を提供する必要があります。標準のメカニズムは、IMFGetService インターフェイスを実装することです。サービス GUID は MR_VIDEO_ACCELERATION_SERVICE です。
IMFGetService インターフェイスを使用してデバイス マネージャーを共有する方法を誰か教えてもらえますか?
windows - dxvaを使用してh264ビデオをデコードする
dxva2.0 を使用して h264 ビデオをデコードする必要があるプロジェクトに取り組んでいます。ドキュメントhttp://msdn.microsoft.com/en-us/library/windows/desktop/aa965245%28v=vs.85%29.aspxに従ってコードを記述します. つまり、IDirectXVideoDecoder のインターフェイスを作成し、dxva API を「BeginFrame」、「Execute」、「EndFrame」と呼び出します。すると問題が出てきます。Intel Core i5 CPU (GPU は CPU 内の Intel HD グラフィックス) でプログラムを実行すると、すべて問題ありません。しかし、Intel ATOM プロセッサ (Intel GMA3000 シリーズ グラフィックス ハードウェアを搭載) で実行すると、正しい結果が得られません。一部のビデオ フレームは正しくデコードされますが、他のフレームは完全に混乱しています。私が使用するデータは別のコンピューターから送信され、データは dxva のバッファーに直接入力できます。h264 では、バッファーは DXVA2_PictureParameter、DXVA2_Bitstream、DXVA2_InverseQuantization、および DXVA2_SliceControl です。したがって、ffmpeg や ffdshow を使用する必要はありません (ffdshow は gpl であるため、使用できません)。「
windows-phone-8 - Windows Phone 8 で DirectX ビデオ アクセラレーションを使用することは可能ですか?
MSDN の DXVA の指示に従って Windows Phone 8 を試してみましたが、WP8 SDK フォルダーに Dxva2.lib がないため、コードをビルドできません。lib がないと DXVA は何もできないので、WP8 が DXVA 開発をサポートするのか、それとも D3D のデスクトップ バージョンでのみサポートされるのかを知りたいですか?
c++ - DirectX Video Acceleration (DXVA) を使用した Media Foundation Transform (MFT) の実装
目的は、ビデオ処理と外部アプリケーションへの同期のためのカスタム MFT を実装することです。の詳細は重要ではありません。最初のステップとして達成したいことは、DXVA ビデオ処理または DXVA-HD を使用して MFT を稼働させることです。私はそうすることができませんでした。
ソース入力ノード (Web カメラ)、MFT (MFT_Grayscale の例)、および EVR を使用してトポロジの構築を開始しました。これを小さなアプリケーションに含めました。トポロジーは機能し、カメラからモノクロ ストリームを確認できました。ここで、MF_Grayscale の例のコードを変更して、DXVA ビデオ処理をサポートし、VideoProcessBlt メソッドによって提供されるハードウェア アクセラレーションを使用できるようにします。Microsoft のドキュメントには細かな情報が記載されていますが、MFT を実行することはできませんでした。
私がこれまでにやったこと:
- メソッド
GetAttributes
で、この MFT が であることを示しますMF_SA_D3D_AWARE
。 - メソッド
ProcessMessage
では、メッセージMFT_MESSAGE_SET_D3D_MANAGER
を処理してデバイス ハンドル aIDirect3DDeviceManager9
およびを取得しますIDirectXVideoProcessorService
。 - この方法では、https://msdn.microsoft.com/en-us/library/windows/desktop/ms694235(v=vs.85).aspx
SetInputType
で説明されている方法を使用し て DXVA2_VideoDesc 構造を取得し、次のコード https : //msdn.microsoft.com/en-us/library/windows/desktop/cc307964(v=vs.85).aspx を使用してビデオ処理デバイスを作成します。さらに、次を使用してサーフェスを作成しますIDirectXVideoProcessorService->CreateSurface
- メソッド
GetOutputStreamInfo
では、dwFlags
変数は次のようになります。
pStreamInfo->dwFlags =
MFT_OUTPUT_STREAM_PROVIDES_SAMPLES |
MFT_OUTPUT_STREAM_WHOLE_SAMPLES |
MFT_OUTPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER |
MFT_OUTPUT_STREAM_FIXED_SAMPLE_SIZE;
ここまでは大丈夫そうです。今、私の質問(これ以上具体的に言えなくて申し訳ありません):
GetOutputAvailableType/SetOutputType
メソッドを適応させる必要がありますか?この
ProcessInput
メソッドでは、 を取得してIMFSample
を抽出しIMFMediaBuffer
ます。IDirect3DSurface9
関数呼び出しによると、バッファが a を管理していません。バッファーのデータを Direct3D サーフェスに memcpy する必要がありますか?開始点を作成する
ProcessOutput
方法では、受信フレームを出力に転送したいと考えています。VideoProcessBlt
入力から出力まで 1:1 のブリットを作成する必要があります。ドキュメントには次のように記載されています。現在使用されていない使用可能なサーフェスを取得します。
サーフェスが使用中かどうかを判断するにはどうすればよいですか?
サーフェスを出力するにはどうすればよいですか? またはを使用する必要があります
MFCreateVideoSampleFromSurface
かMFCreateDXSurfaceBuffer
?残念ながら、私は本当に迷っており、ドキュメントを使用して進歩することができません.
現在の状況では、ビデオ出力が表示されず (ウィンドウにはデフォルトのウィンドウの背景色があります)、Web カメラは最初のフレームの後にフレームのキャプチャを停止します (LED がオフになります)。その上、何も起こりません - アプリケーションは何も表示せずに実行を続けます)。
誰かが私を助けてくれることを願っています。また、誰かが DXVA ビデオ処理または DXVA-HD を使用した MFT のサンプル コードを教えてくれれば幸いです。私は何も見つけることができませんでした...
ありがとう