我試圖「只需快速集成」通過COM的Windows Media Player從本地文件系統或http源播放單個文件 - 但由於稀疏的文檔和在線資源在不嵌入某種Ole容器的情況下的使用,我無法得到這個所謂的微不足道的用例。以編程方式創建的Windows媒體播放器的基本播放
初始化等工作正常,但實際上播放一些文件總是失敗。
示例代碼,以初始化啓動(錯誤處理剝離,基本上是從C# example at MSDN翻譯,在主線程上執行):
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
第二種方法只生產S_OK
S,但沒有實際發揮:
CComPtr<IWMPMedia> media;
core->newMedia(path, &media);
playlist->appendItem(media);
controls->playItem(media); // returns S_OK, but doesn't play
我注意到的另一件事是,core->get_playState()
總是返回wmposMediaOpening
,不管我等待多久。
我偶然發現一個線程,表明多線程可能無法正常使用WMP並且此代碼在多線程的公寓中運行。這可能是問題嗎?
如果沒有,還有什麼可以阻止WMP播放文件?
值得注意的背景:
的WMP實例在DLL創建了一個帶有瀏覽器作爲主機過程。
更新:
試圖普通的DirectShow,這WMP應該使用自身,表現出更具體的問題 - 看question for that。
最後一些反饋,謝謝。我試圖將它作爲一個無用的進程內COM服務器運行。 WMP在主線程上創建,put_URL()也在那裏發生。然而,即使等了很長時間,查詢打開狀態總是會產生'wmposMediaOpening',並且它永遠不會開始播放(無論我是否稱'play()'或不)。有關於此的任何想法? – 2009-12-22 21:23:48
我建議你使用遠程WMP並以同樣的方式自動執行它,以查看是否有任何消息框。 – 2009-12-22 21:46:25
好點,我會嘗試。 – 2009-12-23 02:40:02