2009-12-20 44 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