1

通常のメディア ファイルの再生に適したカスタム アロケーター/プレゼンターを作成しました。ただし、次のコードを使用して DVD を再生しようとすると、スタック オーバーフロー例外で失敗します。

    vmr9_ap = new vmr9ap();

HMONITOR monitor = MonitorFromWindow(hwnd, NULL);

IGraphBuilder *graph;
IBaseFilter *filter;

IDvdGraphBuilder *builder;

CoCreateInstance(CLSID_DvdGraphBuilder, NULL, CLSCTX_INPROC_SERVER, IID_IDvdGraphBuilder, reinterpret_cast<void**>(&builder));

CoCreateInstance(::CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast<void**>(&filter));


builder->GetDvdInterface(IID_IVMRFilterConfig9, (void**)&vmr9_config);

vmr9_ap->Initialize(g_pd3dDevice, monitor, vmr9_config);

HRESULT hr = builder->RenderDvdVideoVolume(L"G:\\VIDEO_TS", AM_DVD_SWDEC_PREFER | AM_DVD_VMR9_ONLY, &status);

builder->GetFiltergraph(&graph);

IDvdControl2 *dvdControl;

builder->GetDvdInterface(::IID_IDvdControl2, (void**)&dvdControl);

graph->QueryInterface(::IID_IMediaControl, (void**)&control);

HRESULT h = control->Run();

スタック オーバーフローは、control->Run() の呼び出しの直後に発生します。本当に単純なことを忘れているだけだと確信しているので、それは私を狂わせています。

ありがとう。

4

3 に答える 3

1

グラフは次のようになります。グラフにバグのあるフィルターがないことを確認してください。

カスタムアロケーターを使用しているため、問題を探してそこにいくつかのブレークポイントを設定します。カスタム アロケータを使用して VMR9 を構成したり、グラフに追加されたりしていないため、貼り付けたコードは不完全である可能性があります。VMR9+Allocator で RenderVolume を正しく取得するのに時間がかかりすぎたため、DVDGraphBuilder の使用は避けています。もう少し手動でグラフを作成します。

私のオープン ソース プロジェクトには、DVD プレーヤーと一緒にカスタム アロケーターがあります。参照用に確認できますが、WPF の互換性のためにいくつかのことをハックする必要があるため、そこには多くのコード ノイズがあります。 http://wpfmediakit.codeplex.com

表示されているのは DRM の問題ではありません。

代替テキスト http://img29.imageshack.us/img29/7798/capturelu.jpg

于 2009-09-25T11:07:16.190 に答える
0

それは DRM 保護の一種でしょうか? DVD グラフのデコーダーは通常、ここで行うように非圧縮データにアクセスするグラフの作成を阻止しようとします。通常、無許可のレンダラーへの接続を拒否するなどのよりクリーンな方法でこれを行いますが、そのようなことが原因である可能性があります。リバース エンジニアリングを防ぐために意図的なクラッシュを使用する mpeg-2 デコーダーは確かに存在します。

G

于 2009-09-21T08:41:54.353 に答える