转自:http://jeremiah.blog.51cto.com/539865/115910
vlc的应用之一:在命令行下的使用
如果编译得到没有界面的vlc,双击运行后就没法手动选打文件或网络了。在这介绍几个vlc的命令行命令。
or
vlc --help --advanced
vlc-0.8.6i和vlc-0.9.4的ActiveX注册方法略有不同。
做ActiveX的网页测试之前需要把Internet选项-->安全-->本地Intranet的安全级别调到最低。Jeremiah的网页测试环境是IE7,其他浏览器未进行测试。
1. vlc-0.8.6i的ActiveX注册
在E:下新建文件夹vlc-0.8.6iActiveX,拷贝vlc-0.8.6i目录下的plugins,libvlc.dll,activex/axvlc.dll到 vlc-0.8.6iActiveX/dlls目录下,拷贝activex/test.html到 vlc-0.8.6iActiveX下。新建文本文件install.bat内容如下:
2. vlc-0.9.4的ActiveX注册
0.9.4不光要告诉计算机vlc的axvlc.dll的位置,还要告诉注册表installdir的位置,也就是libvlc.dll的位置
在E:下新建文件夹vlc-0.9.4ActiveX,拷贝vlc-0.9.4目录下的plugins,libvlc.dll,libvlccore.dll,activex/axvlc.dll到 vlc-0.9.4ActiveX/dlls目录下,拷贝activex/test.html到 vlc-0.9.4ActiveX下。新建文本文件install.reg内容如下:
[HKEY_LOCAL_MACHINE/SOFTWARE/VideoLAN/VLC]
"InstallDir"="E://vlc-0.9.4ActiveX//dlls"
regedit /s install.reg
3. 一点点小提示
如果注册成功,但是test.html播放文件的时候会报错说decoder modules会找不到之类信息,那请将0.8.6i和0.9.4交替注册,可能会解决这个问题。(Jeremiah因为这个问题搞了一天,NND)(2009-05-14补充:直接看8吧,以前这个地方写的不大对。)
4. 制作cab文件
如果要类似与test.html作个播放器服务器,但是我们却不能手动操纵 客户端去下载注册vlc的ActiveX,解决方法就是自己制作cab文件。
(1) 到 本日志的附件 (cabsdk.rar)或者 以下地址 去下载cabsdk.exe: [url]http://download.microsoft.com/download/platformsdk/cab/2.0/w98nt42kmexp/en-us/cabsdk.exe[/url]
(2) 安装cabsdk.exe
(3) 将axvlc.dll及vlc的安装文件拷贝到cabsdk安装路径/BIN/ 下。Jeremiah这里用的是vlc-0.8.6i-win32.exe。(关于如何制作vlc的安装文件,参考日志《windows平台下vlc编译之二:vlc-0.8.6i的编译》)
(4) 在/BIN下新建文本文件axvlc.inf,内容如下:
;
[version]
signature="$CHICAGO$"
AdvancedINF=2.0
[Add.Code]
vlc-0.8.6i-win32.exe
axvlc.dll=axvlc.dll
[axvlc.dll]
FileVersion=0,8,6,0
clsid={9BE31822-FDAD-461B-AD51-BE1D1C159921}
RegisterServer=no
hook=nsiinstaller
[vlc-0.8.6d-win32.exe]
FileVersion=0,8,6,0
file-win32-x86=thiscab
[nsiinstaller]
run=%EXTRACT_DIR%/vlc-0.8.6i-win32.exe
(5) 命令行到BIN目录下,执行以下命令生成cab文件:
5. cab文件的使用
html页面下使用cab文件可以通过以下方式:
codebase="your/path/of/cabfile/axvlc.cab"
width="640" height="480" id="vlc" events="True">
< param name ="Src" value="" />
< param name ="ShowDisplay" value ="True" />
< param name ="AutoLoop" value ="False" />
< param name ="AutoPlay" value ="False" />
</OBJECT>
6. 一点比较严重小问题
由于vlc的安装文件一般是比较大,所以制作出来的cab文件也是很大的,在网络带宽不是很好的时候,光下载这个cab可能就很长很长时间,基本上可以说这样的方式是行不通的。所以 我们 需要根据自己的业务需求去精简vlc。Jeremiah将在下一篇日志介绍。
7. C#下使用vlc的ActiveX
vs2005新建一个windows应用程序,在左侧工具箱右键-->选择项-->com组件-->VideoLAN VLC ActiveX plugin v2,工具箱里面就添加了vlc的ActiveX控件,可以在窗体里面随便画了。
调用函数如下:
























Jeremiah在附件里面提供了一个简单的调用程序(WindowsApplication1.rar), 不过需要注意的是,在用它测试0.9.4的ActiveX,当正常播放文件时点击X关闭窗口 产生异常,电脑会重新启动。在主窗体的
[-HKEY_LOCAL_MACHINE/SOFTWARE/VideoLAN]
regedit /s uninstall.reg






















































































































































































































































































PKG_CONFIG_LIBDIR=/usr/win32/lib/pkgconfig /
CPPFLAGS="-I/usr/win32/include -I/usr/win32/include/ebml" /
LDFLAGS=-L/usr/win32/lib /
CC="gcc -mno-cygwin" CXX="g++ -mno-cygwin" /
./configure /
--host=i686-pc-mingw32 /
--disable-gtk /
--enable-nls --enable-sdl --with-sdl-config-path=/usr/win32/bin /
--enable-avcodec --enable-avformat --enable-swscale /
--enable-faad --enable-flac --enable-theora /
--with-wx-config-path=/usr/win32/bin /
--with-freetype-config-path=/usr/win32/bin /
--with-fribidi-config-path=/usr/win32/bin /
--enable-live555 --with-live555-tree=/usr/win32/live.com /
--enable-caca --with-caca-config-path=/usr/win32/bin /
--with-xml2-config-path=/usr/win32/bin /
--with-dvdnav-config-path=/usr/win32/bin /
--disable-cddax --disable-vcdx --enable-goom /
--enable-twolame --enable-dvdread /
--enable-debug --enable-dca /
--enable-mozilla --with-mozilla-sdk-path=/usr/win32/gecko-sdk /
--disable-mkv --disable-taglib
[HKEY_LOCAL_MACHINE/SOFTWARE/MozillaPlugins/@videolan.org/vlc,version=0.9.4]
"De.ion"="VLC Multimedia Plugin"
"Path"="E://WorkBack//vlc-0.9.4//Mozilla Plugin//dlls//npvlc.dll"
"Product"="VLC media player"
"Vendor"="VideoLAN"
"Version"="0.9.4"
[HKEY_LOCAL_MACHINE/SOFTWARE/VideoLAN/VLC]
"InstallDir"="E://WorkBack//vlc-0.9.4//Mozilla Plugin//dlls"
"Version"="0.9.4"
"Language"="2052"






















































1. Jeremiah对vlc其实并不熟,我也不是vlc专家,视频服务器专家,呵呵,所以,有时候大家问我的问题,其实,我自己也很不明白,不能误导大家。但是我只要明白的,懂得的,都会毫不保留的跟大家交流。Jeremiah只是根据自己的业务需求来用vlc,当然,用vlc第一步就是要编译它。编译vlc花了我N多心血。其他的业务需求主要是借用vlc作一个自己的软解码器,播放网络H264流。所以,对vlc客户端的学习多一些,包括C#调用vlc接口,还有activex控件的相关内容。但是对vlc的服务器方面的应用掌握的不够多。Jeremiah略懂java,略懂C#,但是对C,C++,VC及控件等,非常不熟悉,所以,研习vlc代码,一直迟迟没有进行。
rtsp://172.16.128.8/<filename>
where <filename> is a file present in the current directory."
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head >
< meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" />
< script >
var itemId = 0;
function getVLC(name)
{
if (window.document[name])
{
return window.document[name];
}
if (navigator.appName.indexOf("Microsoft Internet")==-1)
{
if (document.embeds && document.embeds[name])
return document.embeds[name];
}
else
{
return document.getElementById(name);
}
}
function doGo(mrl)
{
var vlc = getVLC("vlc");
itemId=vlc.playlist.add(mrl);
vlc.playlist.playItem(itemId);
document.getElementById("btn_stop").disabled = false;
}
function updateVolume(deltaVol)
{
var vlc = getVLC("vlc");
vlc.audio.volume += deltaVol;
}
function doPlay()
{
vlc.playlist.playItem(itemId);
document.getElementById("btn_stop").disabled = false;
document.getElementById("btn_play").disabled = true;
}
function doStop()
{
getVLC("vlc").playlist.stop();
document.getElementById("btn_stop").disabled = true;
document.getElementById("btn_play").disabled = false;
}
</script>
</head>
< body >
< div style ="margin: 50px" >
< a title ="rtsp://172.16.128.8/01.ts" href ="#" onclick ="doGo(this.title);return false;" >01.ts </a>
< span style ="margin: 20px;" />
< a title ="rtsp://172.16.128.8/02.mp3" href ="#" onclick ="doGo(this.title);return false;" >02.mp3 </a>
< span style ="margin: 20px;" />
</div>
< div >
<object classid="clsid:9be31822-fdad-461b-ad51-be1d1c159921"
width="640"
height="480"
id="vlc"
events="true">
< param name ="mrl" value="" />
< param name ="showdisplay" value ="true" />
< param name ="autoloop" value ="false" />
< param name ="autoplay" value ="false" />
< param name ="volume" value ="50" />
< param name ="starttime" value ="0" />
<embed pluginspage="http://www.videolan.org"
type="application/x-vlc-plugin"
version="videolan.vlcplugin.2"
width="640"
height="480"
name="vlc">
</embed>
</object>
</div>
< div >
< input type=button id ="btn_play" value =" 播放 " onClick ='doPlay();' disabled ="true" >
< input type=button id ="btn_stop" value ="停止" onClick ='doStop();' disabled ="true" >
< input type=button value ="静音切换" onclick ='getVLC("vlc").audio.togglemute();' >
< input type=button value ="减小音量" onclick ='updateVolume(-10)' >
< input type=button value ="增加音量" onclick ='updateVolume(+10)' >
</div>
</body>
</html>

在这感谢vlc研究群“樱木”童鞋提供的帮助。
vlc-0.9.9或vlc-0.8.6i,主要测试的是比较新的0.9.9版本的。
putty:一款集telnet,ssh远端登陆的非常好的软件。下载地址:http://wrc.gro.clinux.org/putty/putty.exe
开启cmd,并cd到vlc的目录,执行
vlc-0.9.9在界面上选择工具->界面->telnet控制台
后台dos窗口会有反应,显示
[00000403] main interface debug: creating VLM
[00000405] main vlm daemon debug: thread 5112 (vlm thread) created at priority 0
(../../src/input/vlm.c:112)
[00000405] main vlm daemon debug: thread started
[00000403] telnet interface: using the VLM interface plugin...
[00000403] main interface debug: net: listening to 127.0.0.1 port 4212
[00000403] telnet interface: telnet interface started on interface 127.0.0.1 421
2
[00000403] main interface debug: using interface module "telnet"
[00000403] main interface debug: TIMER module_Need() : 19.000 ms - Total 19.000
ms / 1 intvls (Avg 19.000 ms)
[00000403] main interface debug: thread 5136 (interface) created at priority 0 (
../../src/interface/interface.c:168)
[00000403] main interface debug: thread started
主机名称(或ip)输入:127.0.0.1
端口:4212
连接类型:选Telnet
点打开。
如果没有出现"Password:"字样,点打开就关闭了,那就说明没有telnet上。(这个时候可以在cmd里面输入telnet 127.0.0.1 4212,看结果应该是正在连接到127.0.0.1...不能打开到主机的连接, 在端口 4212: 连接失败,或者是与主机失去连接。不用cmd的telnet连接的主要原因是过会输入命令的时候看不到。)这个时候,请关闭防火墙,杀毒软件及一切相关软件,不过中毒了别找我哎。(*^__^*) 嘻嘻……继续继续。
如果没有出现以上问题,在Password:后面输入"admin",没有明文回显。登录成功后会显示:Welcome, Master。
分别输入:
setup vod1 input d:/01.avi
new了一个名字叫vod1的vod,设置vod1的input为d:/01.avi。
继续输入:
setup ch1 input d:/02.avi [loop]
setup ch1 output #duplicate{dst=rtp{dst=226.0.0.6,mux=ts,port=1234}}
control ch1 play
new了一个名字叫ch1的broadcast。设置ch1的input为d:/02.avi,loop可选,表示循环播放。设置ch1的output为#duplicate{dst=rtp{dst=226.0.0.6,mux=ts,port=1234}},表示rtp协议的ts流发送到组播地址为226.0.0.6,端口1234。控制ch1播放。
扩充:
1) output后面可以跟sout参数。具体可以参考vlc->媒体->流->流输出界面的已生成的流输出字符串。
2) control ch1后面还可以加stop,pause,seek 百分比。表示停止,暂停和跳转到百分之几的位置。
第6步里面的output换成单播的地址就行了。其他的都一样的。注意不要new重名了。
继续输入
如果重新开启了vlc,则可以输入
1) VC6 SP5
2) vlc-0.9.9a
0. 引言
根据上一篇博客的研究,任何一个VC环境都可以调用MinGW/Gcc编译得到的libvlc.dll。VLC在编译打包之后(也就是执行完make package-win32-base),或者去官网下载zip包解压之后,或者是安装完VLC之后,在vlc-0.9.9a目录下有个sdk文件夹,里面又包含两个文件夹:include--头文件及lib--库。这些都是我们用MFC调用libvlc.dll所必须的。头文件没啥好说的,库里面的libvlc.dll.a及libvlccore.dll.a就是上一篇博客所说的静态库,我们分别手动改成libvlc.lib及libvlccore.lib就可以在VC环境中调用啦。下面简要说一下调用的过程,对各位VC++达人来说绝对是小菜一碟。
新建MFC AppWizard(exe)工程,名字为:MFCVLC。选择项目为Dialog based,点击完成。删除Dialog窗体上的所有的控件,包括“确定”、“取消”按钮及"TODO"静态文本。勾选窗口的clip_children属性,这样就会避免拖动、最大化最小化及全屏还原时找不到图像的缺陷。

画四个控件,两个静态文本框,一个输入框,一个按钮。其中,第一个静态文本框修改Caption为“路径:”,第二个文本框为视频的显示区域,所以讲ID改为IDC_DISPLAY,Caption去掉。输入框关联一个变量,CString类型,命名为m_path。按钮的Caption改为“播放”,并为BN_CLICKED增加一个Function。在CMFCVLCdlg的构造方法中加入一下语句方便调试。


在资源管理器的MFCVLC工程目录下新建文件夹vlc,lib,将vlc-0.9.9a/sdk/include/vlc.h拷贝到MFCVLC工程目录下,将vlc-0.9.9a/sdk/include除了vlc.h之外的所有文件拷贝到vlc目录下,将vlc-0.9.9a/sdk/lib下的libvlc.dll.a及libvlccore.dll.a拷贝到lib下,并分别修改为libvlc.lib及libvlccore.lib。将vlc-0.9.9a目录下的libvlc.dll, libvlccore.dll, plugins目录拷贝到Debug目录下。如果有Cygwin环境,需要将stdint.h(/usr/include/stdint.h)这个头文件也拷贝到MFCVLC工程目录下。在VC6环境中FileView中新建文件夹及导入上述文件,最后入下图所示。

1) 修改vlc.h,将所有的#include <***>改为 #include "***"
在MFCVLCDlg.cpp中加入头文件导入。























6. 关联静态库及编译运行
打开Project Setting,在link标签的Object/library modules:下输入 lib/libvlc.lib lib/libvlccore.lib。
build项目,应该没有错误。
Execute Program就可以执行了。
第6步执行的是Execute模式,如果是Debug模式,点击“播放”后,后台会显示加载的vlc的plugins的dll的信息,但是加载完最后一个dll的时候程序就Block住了。暂时不晓得为啥。经过更多的测试(win2003虚拟机里的vc6),发现Jeremiah的VC6可能真的有问题,debug的时候,打开Output窗口显示加载的dll的情况,就会block住。不打开Output窗口偶尔会set_drawable不成功,弹出新窗口。其他几位朋友测试则正常。





Jeremiah这次主要是用的vlc-1.0.0(英文版)进行讲解。首先需要准备摄像头,Jeremiah用的是一个普通摄像头(以前钓MM用的,嘻嘻),驱动安装好后,在“我的电脑”中显示如下。

video device name选择VIMICRO USB PC Camera (ZC0301PLH),如果没有,请先选择Refresh list刷新列表。
audio device name选择SoundMAX HD Audio,这个是Jeremiah的声卡。
之后可以勾选show more options,里面可是设置缓冲及看到MRL和Edit Options,这些信息都是很重要的。Advance Option按钮里面有一些详细设置,大家可以进去选择,其中video size是可以做调整的。下面会讲到。
之后点play,就可以播放了。
命令行的最大好处就是,vlc命令后面的参数,就是我们在编程的时候调用libvlc_new的argv,将这些参数搞明白,我们就可以在编程的时候调用了。
开启cmd,切换到vlc目录下。
根据1中的MRL和Edit Options信息,设置vlc播放参数如下。
根据以前stream到文件的参数,修改2的参数如下。
这个不会显示摄像头,但是通过刷新d:/01.ts就会发现这个文件是在增大的,也就是有视频流在写入。
根据3的参数做简单的修改就可以达到串流摄像头视频流到网络的目的了。修改3的参数如下。
再开启一个vlc,播放这个ts over rtp流。

从图片可以看出,播放的视频颜色是不对的,是摄像头的问题还是vlc本身的问题还是参数设置的问题,现在不得而知,当然摄像头本身是没问题的,因为qq视频都很正常。希望谁研究出来告诉我一声。谢谢。
VLC作为服务器,可以进行远程控制。再以前的博客中提到用telnet配置VLM(《vlc的应用之七:用vlc做单播,组播及点播服务器》),这也算是一种远程控制。这次介绍的远程控制主要包括以下两种,使用的是vlc-1.0.5。
1. http远程控制
2. vlc remote control (rc)
1. vlc的http远程控制
命令行执行以下命令。
- vlc -I http --http-host=localhost:8866
解释下:-I http就是启用http服务。--host-host=ip:port为启用的服务的ip地址及端口号。
浏览器下输入http://localhost:8866,会显示如下界面。
点击左上角的open按钮,打开input框。输入路径,点击play。出现视频画面。
http模块在安装目录下面的http目录下面,通过解析index.html等,可以编写自己的web页面,并实现远程控制vlc的目的。在页面下方还有VLM的http配置,有兴趣的可以去好好研究下。
注:如果要监听本机真实ip地址,让其他机器都能访问,则需要修改http目录下面的.host文件,配置相关private addresses。具体请根据自己ip地址进行配置。比如Jeremiah的ip地址为172.16.5.XXX,则只需要增加172.16.5.XXX/24,其他172.16.5段IP都可以访问了。
2. vlc remote control
命令行执行以下命令。
- vlc -I rc
出现vlc的rc后台。在里面输入help,打印出所有可以执行的命令。这些命令即为控制vlc的命令。如下图所示。
输入add d:/video/01.avi,则开始播放视频。如下图所示。
当然,我们也写程序远程控制vlc。主要思路就是建立一个socket,连接到vlc的rc服务,然后发送控制命令就可以了。
1) 命令行运行以下命令。
- vlc -I rc --rc-host=localhost:8888
解释下:-I rc就是启动rc服务,--rc-host=ip:host就是监听的ip及端口号,一般ip设置为localhost。
2) 编写程序client_vlc.c如下。
- /******************************************************************************
- * Filename: client_vlc.c
- * Created on: Apr 4, 2010
- * Author: jeremiah
- * Description: vlc的客户端程序,测试vlc远程控制
- *
- ******************************************************************************/
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #define MAXLINE 4096
- #define SERV_ADDR "127.0.0.1"
- #define SERV_PORT 8888
- int main(int argc, char *argv[]) {
- struct sockaddr_in servaddr;
- char buf[MAXLINE];
- int sockfd;
- int read_size;
- // 建立socket
- sockfd = socket(AF_INET, SOCK_STREAM, 0);
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- inet_pton(AF_INET, SERV_ADDR, &servaddr.sin_addr);
- servaddr.sin_port = htons(SERV_PORT);
- // 建立连接
- connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
- // 向vlc发请求 "add d:/video/01.avi"
- write(sockfd, "add d:/video/01.avi/r/n",
- strlen("add d:/video/01.avi/r/n") + 1);
- // 打印vlc返回结果
- read_size = read(sockfd, buf, MAXLINE);
- printf("Response from vlc:/n");
- printf("%s/n", buf);
- // 向vlc发请求 "is_playing"
- write(sockfd, "is_playing/r/n", strlen("is_playing/r/n"));
- // 打印vlc返回结果
- read_size = read(sockfd, buf, MAXLINE);
- printf("Response from vlc:/n");
- printf("%s/n", buf);
- // 关闭socket
- close(sockfd);
- return 0;
- }
3) 编译上面的程序,本文主要在Cygwin里面编译使用。
- gcc -o client_vlc client_vlc.c
4)执行程序,查看结果。
可以看到从服务器返回的字符串,显示添加成功,检查播放情况显示no error。关于其他的操作,还是参考上面的help的显示信息。
mkdir -p $(win32_destdir)/locale
cat $(top_srcdir)/po/LINGUAS | while read i; do /
mkdir -p "$(win32_destdir)/locale/$${i}/LC_MESSAGES" ; /
cp "$(srcdir)/po/$${i}.gmo" /
"$(win32_destdir)/locale/$${i}/LC_MESSAGES/vlc.mo" /
|| true ; /
done
