2009-12-20 77 views
2

我試圖「只需快速集成」通過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

回答

0

further investigation後,事實證明,這實際上是由一個VS2005解決方法VS2008s AtlSetPerUserRegistration()這是始終處於激活狀態造成 - 但只能一直在爲包含COM服務器註冊/註銷。

解決方法覆蓋HKEY_LOCAL_MACHINEHKEY_CURRENT_USER,如果它們是在進程中創建的,則顯然會導致相當多的組件出現故障。

3

WMP支持兩種自動化方法,即嵌入式ActiveX或COM服務器。 對於嵌入式應用,您可以通過對象標籤(通過BHO/Band中的IHTMLWindow2執行一些腳本)或隱藏窗體來添加ActiveX,並從那裏自動執行。有關示例代碼,請參閱Using the Windows Media Player Control in a Web PageHosting the Windows Media Player Control in a Windows Application

對於COM服務器的使用,只需創建播放器作爲COM服務器,並從它自動化。 您可以選擇make it a UI-less playback engineremote it so you have a full UI

Windows Media Player異步播放,例如,它可以調用IMediaControl :: Run並在您調用put_URL時立即返回(另一個立即調用播放將因爲播放而失敗)。如果你不需要自動播放,我想你需要IWMPSettings :: put_autoStart。

WMP認爲自己處於主線程中。如果你在工作線程或MTA線程中,我建議你跨越另一個進程來自動化它,或者把它作爲一個out-proc服務器來遠程執行。

+0

最後一些反饋,謝謝。我試圖將它作爲一個無用的進程內COM服務器運行。 WMP在主線程上創建,put_URL()也在那裏發生。然而,即使等了很長時間,查詢打開狀態總是會產生'wmposMediaOpening',並且它永遠不會開始播放(無論我是否稱'play()'或不)。有關於此的任何想法? – 2009-12-22 21:23:48

+0

我建議你使用遠程WMP並以同樣的方式自動執行它,以查看是否有任何消息框。 – 2009-12-22 21:46:25

+0

好點,我會嘗試。 – 2009-12-23 02:40:02