我试图“只需快速集成”通过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