gpt4 book ai didi

c++ - 使用以编程方式创建的 Windows 媒体播放器进行基本播放

转载 作者:可可西里 更新时间:2023-11-01 10:10:07 26 4
gpt4 key购买 nike

我试图通过 COM“快速集成” Windows Media Player 以播放来自本地文件系统或 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_OK,但实际上没有播放任何内容:

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 .

最佳答案

WMP 支持两种自动化方法,嵌入式 ActiveX 或 COM 服务器。对于嵌入式使用,您可以通过对象标签添加 ActiveX(通过 BHO/Band 中的 IHTMLWindow2 执行一些脚本)或隐藏表单并从那里自动执行。参见 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 engine , 或 remote it so you have a full UI .

Windows Media Player 异步播放,例如,它可以调用 IMediaControl::Run 并在您调用 put_URL 时立即返回(另一个立即调用播放会失败,因为它已经在播放)。如果你不需要自动播放,我猜你需要IWMPSettings::put_autoStart。

WMP 假设自己在主线程中。如果您在工作线程或 MTA 线程中,我建议您跨越另一个进程以使其自动化,或将其作为进程外服务器进行远程处理。

关于c++ - 使用以编程方式创建的 Windows 媒体播放器进行基本播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1935964/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com