【发布时间】:2010-12-28 12:03:44
【问题描述】:
我试图“快速集成” Windows Media Player 通过 COM 来播放来自本地文件系统或 http 源的单个文件 - 但由于其使用的文档和在线资源稀少当不嵌入某种 Ole 容器时,我无法让那个所谓的微不足道的用例工作。
初始化等工作正常,但实际上播放某些文件总是失败。
示例代码,从初始化开始(剥离了错误处理,基本上从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_OKs,但实际上没有播放:
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 中创建,浏览器作为宿主进程。
更新:
尝试 WMP 本身应该使用的普通 DirectShow 会出现更具体的问题 - 请参阅 question for that。
【问题讨论】:
标签: c++ windows com atl windows-media-player