2

COM経由でWindows Media Playerを「すぐに統合」して、ローカルファイルシステムまたはhttpソースから単一のファイルを再生しようとしていましたが、ある種のOleコンテナに埋め込まれていない場合は、ドキュメントがまばらであり、オンラインリソースが使用されていないためです。 、おそらく些細なユースケースを機能させることができませんでした。

初期化などは問題なく動作しますが、実際には一部のファイルの再生は常に失敗します。

初期化から始まるコード例 (エラー処理が削除され、基本的に MSDN の C# の例から変換され、メイン スレッドで実行されます):

CComPtr<IWMPPlayer> player;
player.CoCreateInstance(__uuidof(WindowsMediaPlayer), 0, CLSCTX_INPROC_SERVER);
CComQIPtr<IWMPCore3> core(player);
CComPtr<IWMPControls> controls;
core->get_controls(&controls);
CComPtr<IWMPPlaylist> playlist;
core->get_currentPlaylist(&playlist);
CComBSTR path("c:\\bar.mp3"); // alternatively http://foo/bar.mp3

何かを再生する最初のアプローチでは、「コマンドが利用できません」となります:

core->put_url(path);
// ... waiting after that for WMP to load doesn't make a difference
controls->play(); // returns 0x000D1105 - NS_S_WMPCORE_COMMAND_NOT_AVAILABLE

2 番目のアプローチではS_OKs のみが生成されますが、実際には何も再生されません。

CComPtr<IWMPMedia> media;
core->newMedia(path, &media);
playlist->appendItem(media);
controls->playItem(media); // returns S_OK, but doesn't play

私が指摘したもう1つのことは、どれだけ待っても、core->get_playState()常に が返されることです。wmposMediaOpening

マルチスレッドが WMP で正しく動作しない可能性があることを示唆する 1 つのスレッドに出くわしました。このコードはマルチスレッド アパートメントで実行されます。それが問題ではないでしょうか?
そうでない場合、WMP がファイルを再生するのを妨げているものは何ですか?

注目すべき背景:
WMP インスタンスは、ブラウザをホスト プロセスとする DLL で作成されます。

更新:
WMPがそれ自体を使用する必要があるプレーンなDirectShowを試すと、より具体的な問題が発生します-その質問を参照してください.

4

2 に答える 2

3

WMP は、埋め込み ActiveX または COM サーバーの 2 つの自動化方法をサポートしています。埋め込みで使用するには、オブジェクト タグ (BHO/Band から IHTMLWindow2 を介していくつかのスクリプトを実行) または非表示のフォームを介して ActiveX を追加し、そこから自動化します。サンプル コードについては、「Web ページで Windows Media Player コントロールを使用する」および「Windows アプリケーションで Windows Media Player コントロールをホストする」を参照してください。

COM サーバーを使用するには、プレーヤーを COM サーバーとして作成し、そこから自動化します。UI のない再生エンジンにするか、リモートで完全な UI にすることができます。

Windows Media Player は非同期で再生します。たとえば、IMediaControl::Run を呼び出して、put_URL を呼び出したときにすぐに戻ることができます (再生中の別の呼び出しは失敗します)。自動再生が必要ない場合は、IWMPSettings::put_autoStart が必要だと思います。

WMP は、それ自体がメイン スレッドにあると想定します。ワーカー スレッドまたは MTA スレッドを使用している場合は、別のプロセスにまたがって自動化するか、プロセス外サーバーとしてリモート化することをお勧めします。

于 2009-12-22T21:10:22.337 に答える
0

さらに調査した結果、これは実際にAtlSetPerUserRegistration()は、常にアクティブなVS2008 に対する VS2005 の回避策が原因であることが判明しました。

回避策は で上書きHKEY_LOCAL_MACHINEHKEY_CURRENT_USERれます。これにより、インプロセスで作成された場合、かなりの数のコンポーネントが失敗することは明らかです。

于 2009-12-27T13:19:30.823 に答える