代码之家  ›  专栏  ›  技术社区  ›  Georg Fritzsche

使用以编程方式创建的Windows Media Player进行基本播放

  •  2
  • Georg Fritzsche  · 技术社区  · 16 年前

    我在试着 “快速整合” 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_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中创建的。

    更新:
    尝试普通的directshow(wmp应该使用它自己)会显示出一个更具体的问题-请参见 question for that .

    2 回复  |  直到 16 年前
        1
  •  3
  •   Sheng Jiang 蒋晟    16 年前

    wmp支持两种自动化方法,嵌入式activex或com服务器。 对于嵌入式应用,您可以通过对象标记(从bho/band通过ihtmlwindow2执行一些脚本)或隐藏表单添加activex,并从中自动执行。见 Using the Windows Media Player Control in a Web Page Hosting 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线程中,我建议您跨另一个进程将其自动化,或者将其作为进程外服务器进行远程。

        2
  •  0
  •   Community Mohan Dere    9 年前

    further investigation ,这实际上是由vs2008s的vs2005解决方案引起的。 AtlSetPerUserRegistration() 它始终处于活动状态-但应该仅用于所包含的COM服务器注册/注销。

    解决方案覆盖 HKEY_LOCAL_MACHINE 具有 HKEY_CURRENT_USER ,这显然会导致相当多的组件在创建过程中失败。

    推荐文章