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_OK
s のみが生成されますが、実際には何も再生されません。
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を試すと、より具体的な問題が発生します-その質問を参照してください.