VLC的ACtiveX插件使用方法
在Roger看来对VLC的二次开发 包括把VLC嵌入自己的应用 ,以及修改VLC本身的功能和特性。本文主要讲前者。总的来说把VLC内嵌入自己的应用有4种途径:
直接调用VLC进程(喂喂喂…这也算?)
VLC的plugin for Mozilla
VLC的ActiveX插件
调用libvlc
当然,理论上也可以把VLC的源码 直接扣出一部分来放到自己的程序 中,不过这种方法难度太大没多大意义,可以yy一下,嘿嘿。
先说第一种办法,别怀疑,这是非常有用的一种解决方案 ,特别是对于转码、流转发等应用,通常直接调用VLC就可以了。VLC有HTTP和Telnet的Interface模块(就是和用户交互的界面 ),也很方便和远程交互。Roger做过一个用VLC进行多路直播控制的Web 系统 ,就是用了VLC的HTTP界面,非常方便。而且跨平台 应 用也非常方便,只需要安装不同平台的VLC就行了。直接调用VLC的话最重要的就是参数,可以从 vlc.exe -H 中获取比较详细的命令行参数介绍。对于转码、转发的,命令行参数会比较复杂,可以用GUI先试一下,然后把界面上的Generated stream output string拷下来。
VLC的Mozilla plugin除了用于Firefox的web页之外,还可以用于任何XUL-base的应用,这种应用通常使用xulrunner来启动。XUL是一种用 XML来写界面的语言,有点像HTML而且也兼容大部分HTML标记,Firefox就是用XUL来写的。VLC的Mozilla插件通常用 Javascript来控制,详细的接口 文档可以参考这里:http://www.videolan.org/doc/play-howto/en/ch04.html#id310965 这 个接口有比较老的第一版和比较新的第二版,建议用新的,功能多一些。用VLC的Mozilla插件的应用并不少,例如比较出名的Miro、 Songbird。因为这个好处是显而易见的:跨平台、可控性强、使用简单;限制也很明显:专为Mozilla设计,应用的范围很窄。
VLC的ActiveX插件只能用于Windows 平台,当然这是因为ActiveX只是微软 的东西。但是不得不说这个还是很好用的。无论是C++、C#、VB还是网页,都可以轻松地将这个ActiveX利用起来。关于这个的VLC官方文档在这里http://wiki.videolan.org/ActiveX_Controls 开发、使用之前别忘了先要注册ActiveX控件,方法是运行 regsvr32 axvlc.dll。Roger 之前写的 SimpleTV 就是调用了VLC的ActiveX控件,所以这也可以作为一个示例 的代码 ,可以主要看看怎么调用这个控件来做串流的代码:
//Create Option for the plugin bool bIPv6 = false;
if (strstr (szMRL, "::")) { bIPv6 = true; }
tagVARIANT opt,var,ip6;
CString sout, ipv6 = "ipv6=1";
SAFEARRAY *psa;
long index;
SAFEARRAYBOUND bound[1] = {0};
bound[0].cElements = bIPv6 ? 2 : 1;
if (m_cfg.bDisplayWhenRecording)
{
sout.Format(”sout=#duplicate{dst=display,dst=std{access=file,mux=ts,dst=/”%s/”}}”, strName);
}
else
{
sout.Format(”sout=#duplicate{dst=std{access=file,mux=ts,dst=/”%s/”}}”, strName);
}
var.vt = VT_BSTR;
var.bstrVal = sout.AllocSysString();
psa = SafeArrayCreate (VT_VARIANT, 1, bound);
index = 0;
SafeArrayPutElement (psa, &index, &var);
if (bIPv6)
{
ip6.vt = VT_BSTR;
ip6.bstrVal = ipv6.AllocSysString();
index = 1;
SafeArrayPutElement (psa, &index, &ip6);
}
opt.vt = VT_ARRAY | VT_BSTR; opt.parray = psa;
tagVARIANT nul;
nul.vt = VT_NULL;
m_vlc.GetPlaylist ().add (szMRL, nul, opt);
m_vlc.GetPlaylist ().next ();
m_vlc.GetPlaylist ().play ();
很多人调用VLC的ActiveX控件都会遇到一个问提就是,播放没有反应。大部分的原因都是因为plugins的问题。VLC作为exe运行时会递归搜 索当前目录下的modules和plugins目录来寻找plugin,但是当以ActiveX控件运行时,默认只会检查注册表的 HKLM_Software_VideoLan_VLC_InstallDir,并添上plugins作为模块 搜 索路径,如果这个路径没有设置或者设置不对,VLC将找不到大部分的模块,导致大部分功能缺失而无法运行。如果需要修改这一特性可以修改 /activex/plugin.cpp (0.8.6i)中的 VLCPlugin::getVLC函数。在SimpleTV中,Roger修改的一个片段是
char p_pluginpath[MAX_PATH+1];int iTmp = 0;
/* 得到SimpleTV.exe的全路径 */DWORD dwLen = GetModuleFileNameA (NULL, p_pluginpath, MAX_PATH);for (iTmp = strlen(p_pluginpath) - 1; iTmp >= 0; -- iTmp){ if (p_pluginpath[iTmp] == ‘//’) { p_pluginpath[iTmp] = 0; break; }}
/* 将模块路径设为SimpleTV下的 player/modules */strcat (p_pluginpath, "//player//modules");ppsz_argv[ppsz_argc++] = “–plugin-path”;ppsz_argv[ppsz_argc++] = p_pluginpath;
还有一点是配置文件vlcrc的路径,如果需要修改的话,可以修改 src/misc/configuration.c 中的 GetDir 函数 , 在Windows下这个目录默认返回 %APPDATA% ,以上两步做好的话其实就可以做出一个Portable的绿色版VLC了。
和其他ActiveX的播放器,例如WMP、QuickTime、RealPlayer相比,VLC的优点也很明显:自带所需解码器、开源 、功能强大。
当然ActiveX方式和Mozilla 插件 的方式也是有局限性的,这样的方式功能还不够强大,例如没有截屏的接口…如果需要更多完整的功能,可以考虑直接调用libvlc的接口,VLC官方提供了一些文档和例子http://wiki.videolan.org/Libvlc
这种方法Roger没有做过,就不多说了。这里还有一个用C#调用libvlc的例子http://jeremiah.blog.51cto.com/539865/116981
在Windows下libvlc可能默认是不编译的(0.8.6i),可以在configure中开启这一选项 –enable-shared-libvlc
完整的VLC体积还是不小的,如果只需要VLC一部分功能的话,可以最后做一下精简。这个可以参考Roger的上一篇关于VLC的文章 《VLC(六) 精简》