我一直在努力实现Media Player Automation。我几乎尝试了所有可能的方式,但没有任何成功。下面列出的尝试很少。
无论我尝试什么,都不能创建LOCAL_SERVER。
对于CLSCTX_LOCAL_SERVER
,我总是得到class not registered error
。
从控制台应用程序开始,将其转换为此处建议Message Pump的Window应用程序,但仍然无法播放WMP。
无论如何,我继续使用IWMPPlayer4
,openPlayer()方法确实有效,打开WMP并开始播放剪辑。但是任何其他消息都没有达到WMP。例如,
IWMPSettings *pMediaPlayerSettings = NULL;
hr = pMediaPlayer4->get_settings(&pMediaPlayerSettings);
if(FAILED(hr))
{
std::cout << "ERR - Could not get WMPSettings Interface Pointer" << std::endl;
ReleaseInterfaces((IUnknown**)&pMediaPlayer4);
return 0;
}
std::cout << "Got settings.. lets change volume" << std::endl;
int cnt = 10;
while(cnt > 1)
{
long vol = -1.0;
Sleep(2000);
hr = pMediaPlayerSettings->get_volume(&vol);
if(FAILED(hr))
{
std::cout << "ERR - Could not change the volume" << std::endl;
}
std::cout << "Currently volume is: " << vol << std::endl;
hr = pMediaPlayerSettings->put_volume(cnt*cnt);
cnt--;
}
ReleaseInterfaces((IUnknown**) &pMediaPlayerSettings);
此代码更改音量,但不知何故该效果在正在播放的剪辑中不存在。
然后我想可能Invoke
会将消息发送到运行当前剪辑的WMP。尝试了这段代码,但无济于事。
所以我要求的是 - 我在尝试什么,它是否可能?
用于控制媒体播放器的Raw-COM代码?任何指针,示例,代码片段都非常受欢迎。我有一种错误的感觉,我在这个问题上浏览了整个网络世界。请证明我错了。
PS:我不想做ActiveX或MFC编码。
答案 0 :(得分:2)
此问题与您的应用程序是控制台应用程序无关。消息泵不在此处。您可以尝试使用Windows应用程序,它的行为也一样。
这是因为在这种情况下,播放器不作为控件托管(作为OLE控件,在窗口中),因此它不受支持。如果您在Windows应用程序或Internet Explorer中托管它,您将看到它正常工作。
在此配置中,如果要控制音量,则应使用volume audio APIs(特别是ISimpleAudioVolume)