2023年11月27日发(作者:)

一、简介

VLC的全名是Video Lan Client,是一个开源的、跨平台的视频播放器。VLC支持大量的

/vlc/ 下面给出一个简要的不完整的列表:

操作系统:WindowsWinCELinuxMacOSXBEOSBSD

访问形式:文件、DVD/VCD/CDhttpftpmmsTCPUDPRTPIP组播、IPv6

rtsp

编码格式:MPEG*DIVXWMVMOV3GPFLVH.263H.264FLAC

视频字幕:DVDDVBTextVobsub

视频输出:DirectXX11XVideoSDLFrameBufferASCII

控制界面:WxWidgetsQT4WebTelnetCommand line

浏览器插件:ActiveXMozillafirefox

实际上为了更清晰一点,我们可以反过来说说VLC不支持哪些常见的。首先是RealVideo

RealAudio部分支持),因为Real Video加码器存在版权的问题。实际上VLC 0.9.0

已经加入了RealVideo的支持,但是需要额外的解码器(类似MPlayer。另外,VLC不支

3GP的音频格式AMR

VLC原先是几个法国的大学生做的项目,后来他们把VLC作为了一个开源的项目,吸引

了来自世界各国的很多优秀程序员来共同编写和维护VLC,才逐渐变成 了现在这个样子。

至于为什么叫VideoLan Client是因为以前还有一个VideoLan Server的项目(简称VLS

而目前VLS的功能已经合并到VLC中来,所以VLC不仅仅是一个视频播放器,它也可以

作为小型的视频服务器,更可以 一边播放一边转码,把视频流发送到网络上。VLC最为突

出的就是网络流的播放功能,例如MPEG2UDP TS流的播放和转发,几乎是无可替代的。

对普通用户来说,VLC还有一个好处是不影响Windows中的解码器。VLC通常不影响也

不依赖于系统中自带的解码器(除了realvideo quicktime的类型),很绿色很环保;更不

用担心流氓软件、广告插件之类的恶心的玩意儿。

从程序结构来看,VLC的可扩展性是相当优秀的。VLC绝大部分用高效的C代码来编写

(少量的C++和汇编),但是实现了完全动态的模块化,所有功能包括 程序框架本身都是

module,可以在运行时载入,这使得VLC可以轻易的扩展多种功能并且容易维护。它的架

构有一点类似于DirectShow的技术。

VLC也很注重版权方面的问题,你可以放心的自由的使用而不需要为版权的问题担心

——VLC只包括免费的、自由的库。VLC基于GPL,因此也可以用于商 业应用,只需要

保留GPL,以及公开源代码,如果你修改了VLC的话。

下面是VLC相关的一些链接

VLC官方网站:/

VLC下载页面:/vlc/

VLC下载目录(源码和安装包)/pub/videolan/vlc/

VLC Nightly Builds /

VLC 开发Wiki/Developers_Corner

VLC Win32第三方库预编译包下载目录:/pub/testing/win32/

VLC 官方论坛:/

VLC 邮件列表:/developers/

二、Windows平台编译

第一步,要创建编译VLC的环境。VLCWindows下可以用Msys+MingW 或者Cygwin

的方式来编译,二者大同小异,这里主要介绍Cygwin

Cygwin是一个在Windows下面模拟Linux环境的东西。它提供了很多库和应用程序,

你可以像在Linux上一样来使用Windows。你需 要在/ 下载一个

cygwin的安装程序。然后选择一个cygwin的源来下载所需要的库,国内的话到

ftp:///cygwin/ /pub 相对来说会快一点。第一次安装,

除了默认的库以外,我们还需要加入一些库来支持VLC的编译,包括

Archive (目录)

unzip

zip

Devel

autoconf

automake

binutils

cvs

expat

gcc

gcc-core

gcc-g++

gcc-mingw

gcc-mingw-core

gcc-mingw-g++

gdb (如果你需要调试的话)

gettext

gettext-devel

git (不一定需要)

libiconv

libtool

make

mingw-runtime

nasm

patchutils

pkg-config

subversion

Editor

vim (有了它方便点)

Libs

libgcrypt

Web //这两个可以不要,如果你不想编译第三方库

curl (optional: for building extras/contrib)

wget (optional: for building extras/contrib)

然后是下载所需要版本的VLC的源代码。对于Release版本,可以从这里下载:

/pub/videolan/vlc/ 如果你需要下载实时最新的库,就要从VLC

的源码库上取下来了。现在VLC改用git了,使用命令: git clone git:///

VLC还需要很多第三方的库,你可以取得源码来编译,这部分可以参考Linux上的VLC

编译的文章。在WindowsVLC做了一个编译好的 win32第三方库的包,可以从

/pub/testing/win32/ 下载。包需要解压到根目录 ‘/’,事实上这些

库都位于’/usr/win32-branch’里边。

cygwin中进入vlc的主目录,运行bootstrap’./bootstrap’。在等待它结束之前,我们

先来看一下如何配置VLC的编译。 ‘./configure -h >cfg_’就可以把配置的选项信

息都输出到 cfg_中,然后慢慢来研究。里面大多是启用、禁用某些特性和功能模块,

或者配置某些模块需要的库的路径等信息。为了方便可以写一个简单的 脚本来做这件事,

当然这个不是必需的。

PATH=/usr/win32-branch/bin:$PATH

PKG_CONFIG_PATH=/usr/win32-branch/lib/pkgconfig

CPPFLAGS=”-I/usr/win32-branch/include -I/usr/win32-branch/include/ebml”

LDFLAGS=-L/usr/win32-branch/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-branch/bin

enable-ffmpeg with-ffmpeg-mp3lame with-ffmpeg-faac

with-ffmpeg-zlib enable-faad enable-flac enable-theora

with-wx-config-path=/usr/win32-branch/bin

with-freetype-config-path=/usr/win32-branch/bin

with-fribidi-config-path=/usr/win32-branch/bin

enable-live555 with-live555-tree=/usr/win32-branch/

enable-caca with-caca-config-path=/usr/win32-branch/bin

with-xml2-config-path=/usr/win32-branch/bin

with-dvdnav-config-path=/usr/win32-branch/bin

disable-cddax disable-vcdx enable-goom

enable-twolame enable-dvdread

enable-release enable-dca

enable-mkv

enable-quicktime enable-mozilla

with-mozilla-sdk-path=/usr/win32-branch/gecko-sdk

enable-mostly-builtin

&& make

例如把这个文件保存为 ‘mybuild’,等bootstrp运行结束之后,我们只需要运行一下

mybuild就会开始配置和编译了。这通常需要挺长的时间,如果运气好,在漫长的等待之后

make运行成功,vlc就编译好了。直接双击主目录里边的 应该就可以运行了。

为了方便可以把它打包,最简单的是 ‘make package-win32-base’它将创建一个子目录来

存放所有运行所需的东西,这个目录就是一个绿色版的VLC啦。

当然如果你运气没那么棒,可能会碰到各种各样的错误,例如在boottrap或者configure

中出错,通常是因为没安装某个库或者库的版本不合适; 也可能碰到编译的错误,尝试去

google一下。

本文参考 /Win32CompileCygwinNew

三、Linux平台编译

先下载源代码,把源代码解压之后也是先运行一下bootstrap,看看缺什么工具没有,例

gccmakelibtoolautomake autoconfig等是否有合适的版本。如果不合适的话就用

你喜欢的方式去升级或者安装。

下面最麻烦的一步来了。VLCLinux上没有给出和Windows上类似的第三方库的预编

译包,你必须去自己获得并编译这些库。这些库的数量取决于你 的配置选项。VLC给出了

一个自动化的解决方案,关注一下主目录extrascontrib里边有一些工具来帮助你自动下载、

patch和编译所有 可能用到的第三方库。先运行一下那个目录下的bootstrap,如果缺少

***.mak的话可以到VLC的代码库中找一下,是一个系统相关的文件,然后 简单的一句

make就可以了。如果你对这些库比较熟悉的话最好先手动筛选一下,有一些可能不是你所

需要的,而下载他们可能需要很长的时间。

在漫长的等待之后,如果一切顺利(我几乎不相信会这样),这一步就算完成了。可能遇

extrascontribsrc里边;如果下载一半断掉,可以把那个不完整的文件删掉重新再运行make

这一步做完之后和windows上的编译就几乎一样了。写一个配置脚本然后运行它。例如

一个配置脚本:

./configure

enable-release

disable-skins2

disable-wxwidgets

enable-mozilla

with-mozilla-sdk-path=./gecko-sdk

disable-sout

disable-httpd

enable-live555

disable-dvdnav

disable-libcdio

disable-libcddb

disable-cdda

disable-vcd

disable-dvdread

disable-smb

disable-cmml

disable-alsa

disable-opengl

disable-png

disable-screen

disable-mkv

disable-mod

disable-mpc

disable-libtar

disable-speex

disable-visual

disable-daap

disable-bonjour

disable-gnutls

enable-faad

enable-mostly-builtin

配置完之后再运行make就可以了。

参考:/UnixCompile

四、使用

VLC的功能很强大,它不仅仅是一个视频播放器,也可作为小型的视频服务器,更可以一

边播放一边转码,把视频流发送到网络上。

使C:Program

FilesVideoLANVLC>

获取内置的帮助,会写到C:Program FilesVideoLANVLC> -h

获取更详细的帮助,有大量的选项介绍:C:Program FilesVideoLANVLC> -H

在线使用帮助

/doc/play-howto/en/

/doc/streaming-howto/en/

搜索并显示可用的模块列表:C:Program FilesVideoLANVLC> -l

Windows下,默认情况,VLC的配置文件在 %APPDATA%vlcvlcrc%APPDATA%XP

下通常是 C:Documents and Settings用户名Application Data

Linux下,在用户home目录的/.vlc/

vlc的选项完全可以通过修改vlcrc来设置,界面只是略微方便一点

重置所有选项到默认状态:C:Program FilesVideoLANVLC> reset-config

VLCvlcrc中指定的plugin-path,以及当前目录的modulesplugins目录来递归查找

pluginVLC的大部分功能都是 通过plugin来实现的。VLC默认有大量的动态插件,为了

加快启动速度,vlc会在%APPDATA%vlccache中缓存plugin的列 表,选项plugins-cache=0

可以禁止缓存plugin

打开一个UDP组播流,组播组 239.255.1.1,端口 4567,默认端口1234,对于rtp协议,

VLC会自动识别,写udp还是rtp都没问题

C:Program FilesVideoLANVLC> udp://@239.255.1.1:4567

在本地UDP端口 888 接收流, “@”表示绑定一个地址,而不是连接该地址

C:Program FilesVideoLANVLC> udp://@888

串流输出,就是在播放的时候,以某种方式向外传送视频,在打开界面的串流/保存 中设置

会比较方便。

例如,循环播放 rtp方式传送到224.1.1.1端口1234, 同时显示视频

loop :sout=#duplicate{dst=std{access=rtp,mux=ts,dst=224.1.1.1:1234},dst=display}

例如,接收UDP端口888,数据全部保存到C:

udp://@888 :demux=dump :demuxdump-file=”C:

关于Windows下视频输出模块

Direct3D :效果比DirectX差一点,但是方便截图,也可以在图像上实现alpha

DirectX:效果最好,利用DirectX的显示加速

OpenGL:在不同的硬件上表现不太一样

WinGDI:最慢的一种,不需要显卡加速

caca:用彩色的Assic字符来显示

临时启用某个视频输出,可以这样:C:Program FilesVideoLANVLC-0.8.6e>vlc

vout=caca

ActiveX控件

官方发布的VLC自带ActiveX控件 ,注册之后可以方便的在应用程序和网页中使

VLC,注册的办法是

C:Program FilesVideoLANVLC-0.8.6e>regsvr32

ActiveX VLC的使用方法可以参考源代码中ActiveX目录的

ActiveX控件的接口有第一版和第二版,第一版简 单,功能少,已经不再维护建议用第二

版本,功能多一点

Mozilla Plugin

你还可以在WindowsLinuxFirefox中使用VLCWindows下可以在安装VLC的时候

选上Mozilla plugin事实上它做的就是在HKLM_Software_MozillaPlugin键下添加一个VLC

的子键。Linux下可以把 (或者叫和插件目录放到Firefoxplugins

目录,来使之生效。

同样这适用于基于Xulrunner的应用程序,事实上像 MiroSongBirdxul应用都是用的这

个插件。与ActiveX类似的,VLCMozilla Plugin也有两套接口,建议用新的第二版。

注册表

WindowsVLC只使用很少量的注册表的信息,最重要的一条是HKLM_Software_VLC

键下的InstallDir项,VLC Mozilla PluginActiveX控件通过这一项来定位其插件的目

录。TelnetHttp控制对VLC来说,控制界面都是Interface类的模块,你 可以使用各种控

制模块。Windows下默认使用的是wxwidgets图形界面,还可以使用httptelnet等界面,

来远程控制VLC如果用 VLC在服务器上专门作视频流转发一类的事情,这种远程界面可

以帮上大忙。

视频过滤器

0.8系列中有多达13种视频过滤器,为视频添加各种效果和特殊处理。

Skin2界面

一个漂亮一点的,可以换肤的界面。

其他的

播放DVDVCD光盘,打开DirectShow设备,播放当前屏幕

一些问题

目前的VLC无法播放Real视频,如rmrmvb。其实从0.9版本的VLC开始可以依赖其他

解码器播放。但就目前测试的情况来看,顺序播放没问题, 但是拖动则效果很差。RTSP

的播放,拖动有问题,在获取播放位置时有缺陷。例如和达尔文服务器的配合。

五、视频播放的基本原理

几乎所有的视频播放器,如VLCMPlayerXine,包括DirectShow,在播放视频的原理

和架构上都是非常相似的,理解这个对理解VLC 的源码会有事半功倍的效果。

大致的来说,播放一个视频分为4个步骤:

1. acess 访问,或者理解为接收、获取、得到

2. demux 解复用,就是把通常合在一起的音频和视频分离(还有可能的字幕)

3. decode 解码,包括音频和视频的解码

4. output 输出,也分为音频和视频的输出(aoutvout

拿播放一个UDP组播的MPEG TS流来说吧,access部分负责从网络接收组播流,放到

VLC的内存缓冲区中,access模块关注IP协议,如是否IPv6、组播地址、组播协议、

口等信息;如果检测出来是RTP协议(RTP协议在UDP头部简单得加上了固定12个字节

的信息),还要分析RTP头部信息。这部分可以参看VLC源码 /modules/access/udp.c。在同

目录下还可以看到大量的access模块,如filehttpdvdftpsmbtcp dshowmms

v4l…等等

demux部分首先要解析TS流的信息。TS格式是MPEG2协议的一部分,概括地说,

TS通常是固定188字节的一个packet,一个TS流可以包 含多个program(节目),一个

program又可以包含多个视频、音频、和文字信息的ES流;每个ES流会有不同的PID

示。而又为了可以分析这 ES流,TS有一些固定的PID用来间隔发送programes流信

息的表格:PATPMT表。关于TS格式的详细信息可以去google一下。 VLC专门做了

一个独立的库libdvbpsi来解析和编码TS流,而调用它的代码可以参见VLC源码

/modules/demux/ts.c

其实之所以需要demux,是因为音视频在制作的时候实际上都是独立编码的,得到的是

分开的数据,为了传输方便必须要用某种方式合起来,这就有了各种封装 格式也就有了

demuxdemux分解出来的音频和视频流分别送往音频解码器和视频解码器。因为原始的音

视频都是占用大量空间,而且冗余度较高的数据, 通常在制作的时候就会进行某种压缩。

这就是我们熟知的音视频编码格式,包括MPEG1VCDMPEG2DVDMPEG4H.264

rmvb等等。音视频解码器的作用就是把这些压缩了的数据还原成原始的音视频数据。VLC

解码MPEG2使用了一个独立的库libmpeg2调用它的源 文件是 /modules/codec/libmpeg2.c

VLC关于编解码的模块都放在/modules/codec目录下,其中包括著名的庞大的 ffmpeg

解码器,例如视频解码器输出的是一张一张的类似位图格式的图像,但是要让人从屏幕

看得到,还需要一个视频输出的模块。当然可以像一个Win32窗口程序那 样直接把图像画

到窗口DC——VLC的一个输出模块WinGDI就是这么干的,但是通常这太慢了,而且

消耗大量的CPU。在Windows下比较好的办 法是用DirectX的接口,会自动调用显卡的加

速功能。

这样的功能分解使得模块化更容易一点,每个模块住需要专注于自己的事;从整体来说

功能强大而且灵活。

但是事情总是不会那么简单。就拿access来说,媒体的访问是分层的,如RTSP就涉及

IPv4TCPUDPRTCPRTSP等多个层次的协 议。有些视频格式包括了传输、封装

格式和编辑码格式如MPEG系列,有些封装格式是独立的容器,但是很多人会误解它是编

解码格式,如mkvavi这些。

音频和视频在demux之后就是独立的,但是需要有一套机制把它们同步起来。同时我们

需要有一套机制来控制速度、暂停、停止、跳进,获取各种媒体信息,这 些都是很复杂而

又很重要的事情。

另外也许需要在某个地方插入一些修改,来实现某种效果。如音频的EQ,视频的亮度调

整之类的,VLC专门设计了access_filter audio_filtervideo_filter类型的模块来做这一

类事情。

VLC比较独特的地方是集成了原来的VLS的功能,这依赖于VLCstream_output类型

的模块,它们可以把正在播放的视频以某种方式重新转码 和发送出去,如httpUDP、文

件等等。

MPlayer的结构与此是类似的,如/stream目录对应的是access的功能,/mpdemux对应的

demux功能,/libmpcodecs 是解码器,/libvo/libao2分别是视频和音频的输出。

DirectShow也是类似的,不过分类更多一些更复杂一点。DirectShow里面的模块叫做

“filter”filter之间通过”pin” 连接。access的模块对应于DirectShow中的SourceFIlter

一类Filter只有输出pin没有输入pindemux模块对 应于splitter filter,这种filter有一个

输入pin,多个输出pin。解码模块是一类transform filter,有一个输入pin、一个输出pin

输出模块对应于readering filter,有一个输入pin,没有输出pin。当然transform filter不一定

是解码器,也可能是某种其他的处理。

另外给出一个VLCAPI Document,参见:/doc/

六、精简

VLC默认包含了大量的功能,超过2百个插件;Windows下安装包大小接近10MB,安

装之后超过35MB。有时候如果我们只需要部分的功能,应该如 何精简它呢?

精简VLC的第一步是重新配置编译选项,将不需要的功能去掉。一个精简配置脚本如下:

PATH=/usr/win32-branch/bin:$PATH

PKG_CONFIG_PATH=/usr/win32-branch/lib/pkgconfig

CPPFLAGS=”-I/usr/win32-branch/include -I/usr/win32-branch/include/ebml”

LDFLAGS=-L/usr/win32-branch/lib

CC=”gcc -mno-cygwin” CXX=”g++ -mno-cygwin”

./configure

with-freetype-config-path=/usr/win32-branch/bin

with-fribidi-config-path=/usr/win32-branch/bin

disable-ffmpeg

disable-live555

disable-cddax

disable-vcdx

disable-skins2

disable-wxwidgets

disable-mozilla

disable-httpd

disable-dvdnav

disable-libcdio

disable-libcddb

disable-cdda

disable-sdl

disable-sdl-image

disable-vcd

disable-dvdread

disable-smb

disable-cmml

disable-alsa

disable-opengl

disable-png

disable-screen

disable-mkv

disable-mod

disable-mpc

disable-libtar

disable-speex

disable-visual

disable-daap

disable-bonjour

disable-gnutls

disable-vorbis

disable-real

disable-xml

disable-x264

enable-sout

enable-activex

enable-release

从这个脚本可见,主要是禁用了大量的功能。运行 ./configure -h 可以显示每一个配置项

的意义;如果还不清楚可以再去搜一下选项对应的库的位置。ffmpeg是一个庞大的编解码

库,但是MPEG2的解码可以利用另一个库 libmpeg2,所以在这里不需要它。

注意make完之后要用make package-win32-base来打一下包,打包时会用strip工具来压

缩每一个可执行文件。

但是这样还没有结束。配置项并不是很全面的,而且还会有一些小问题,例如xml禁用

了还会有。于是还需要手动的清理一下plugins目录里面的插 件,挑出没有用处的,这也

需要对VLC模块的熟悉。或者使用Roger的笨方法,一个一个试,对功能没有影响的就拿

掉。SImpleTV0.4所使用的 plugin如以下所示:

liba52sys_ liba52 用于AC3格式的音频解码,CCTV高清频道需要

liba52tofloat32_

liba52tospdif_

liba52_

libaccess_file_ 文件访问,播放文件需要

libaccess_http_ HTTP访问模块

libaccess_output_file_ sout的文件模块,用于录制

libaccess_udp_ UDP访问模块

libaout_directx_ DirectX的声音输出,默认的声音输出模块

libdeinterlace_ 解交错的vout-filter模块

libdirect3d_ Direct3D视频输出模块,在上面可以半透明。

libfixed32tofloat32_ 一些数据转换模块

libfixed32tos16_

libfloat32tos16_

libfloat32tos8_

libfloat32tou16_

libfloat32tou8_

libfloat32_mixer_

libglwin32_ OpenGL视频输出模块

libi420_ymga_

libi422_yuy2_

libipv4_ IPv4网络模块

libipv6_ IPv6网络模块

liblibmpeg2_ libmpeg2,解码全靠它

liblogger_ 日志模块,调试必备

libmemcpy_ 好像是利用各种CPU指令加速内存拷贝的

libmpeg_audio_ MPEG音频的解码模块

libmpgatofixed32_

libmpga_

libmux_dummy_

libpacketizer_mpegvideo_

libs16tofixed32_

libs16tofloat32swab_

libs16tofloat32_

libs8tofloat32_

libsimple_channel_mixer_

libstream_out_display_ sout的模块

libstream_out_duplicate_

libstream_out_standard_

libtrivial_channel_mixer_

libtrivial_mixer_

libtrivial_resampler_

libts_ TS流的解复用模块

libu8tofixed32_

libu8tofloat32_

libugly_resampler_

libvout_directx_ DirectX视频输出模块

libwingdi_ GDI视频输出模块

作为ActiveX控件的VLC只需要这些模块和就足够了。当然如果使用了

还要带上。

VLC 0.9.2 正式发布 && VLC播放Rm Rmvb的插件

新的VLC加入了RealVideodemuxcodec module,已经可以播放rmrmvb格式的

real视频,但是需要下载以下两个附件:

拷贝到 C:Program FilesVideoLANVLC

拷贝到 C:Program FilesVideoLANVLCplugins

这两个文件也可以从MPlayerwin32 codec中拷贝出来。从测试的情况来看,顺序播放

没有什么问题,但是跳转的时候比较慢,图像不太稳定

这里有对VLC新特性的介绍 /What_is_cool_in_0.9

Release Note/developers/vlc/NEWS

下载目录:/pub/vlc/0.9.2/win32/

下载链接(exe/pub/vlc/0.9.2/win32/

七、将VLC嵌入自己的应用

总的来说把VLC内嵌入自己的应用有4种途径:

直接调用VLC进程

•VLCplugin for Mozilla

•VLCActiveX插件

调用libvlc

当然,理论上也可以把VLC的源码直接扣出一部分来放到自己的程序中,不过这种方法

难度太大没多大意义。

先说第一种办法,别怀疑,这是非常有用的一种解决方案,特别是对于转码、流转发等

应用,通常直接调用VLC就可以了。VLCHTTPTelnet Interface模块(就是和用户

交互的界面),也很方便和远程交互。而且跨平台应用也非常方便,只需要安装不同平台的

VLC就行了。直接调用VLC 话最重要的就是参数,可以从 -H 中获取比较详细

的命令行参数介绍。对于转码、转发的,命令行参数会比较复杂,可以用GUI先试一下,

然后把界面上的Generated stream output string拷下来。

VLCMozilla plugin除了用于Firefoxweb页之外,还可以用于任何XUL-base的应

用,这种应用通常使用xulrunner来启动。XUL是一种用 XML来写界面的语言,有点像

HTML而且也兼容大部分HTML标记,Firefox就是用XUL来写的。VLCMozilla插件通

Javascript

/doc/play-howto/en/#id310965 这个接口有比较老的第一版

和比较新的第二版,建议用新的,功能多一些。用VLCMozilla插件的应用并不少,例

如比较出名的Miro Songbird。因为这个好处是显而易见的:跨平台、可控性强、使用简

单;限制也很明显:专为Mozilla设计,应用的范围很窄。

VLCActiveX插件只能用于Windows平台,当然这是因为ActiveX只是微软的东西。

但是不得不说这个还是很好用的。无论是C++ C#VB还是网页,都可以轻松地将这个

ActiveX利用起来。关于这个的VLC官方文档在这里/ActiveX_Controls

开发、使用之前别忘了先要注册ActiveX控件,方法是运行 regsvr32 Roger 之前

写的 SimpleTV 就是调用了VLCActiveX控件,所以这也可以作为一个示例的代码,可

以主要看看怎么调用这个控件来做串流的代码:

//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_ayWhenRecording)

{

(”sout=#duplicate{dst=display,dst=std{access=file,mux=ts,dst=”%s”}}”,

strName);

}

else

{

(”sout=#duplicate{dst=std{access=file,mux=ts,dst=”%s”}}”, strName);

}

= VT_BSTR;

l = ysString();

psa = SafeArrayCreate (VT_VARIANT, 1, bound);

index = 0;

SafeArrayPutElement (psa, &index, &var);

if (bIPv6)

{

= VT_BSTR;

l = ysString();

index = 1;

SafeArrayPutElement (psa, &index, &ip6);

}

= VT_ARRAY | VT_BSTR;

= psa;

tagVARIANT nul;

= VT_NULL;

m_ylist ().add (szMRL, nul, opt);

m_ylist ().next ();

m_ylist ().play ();

很多人调用VLCActiveX控件都会遇到一个问提就是,播放没有反应。大部分的原因

都是因为plugins的问题。VLC作为exe运行时会递归搜 索当前目录下的modulesplugins

pluginActiveX

HKLM_Software_VideoLan_VLC_InstallDir,并添上plugins作为模块搜索路径,如果这个路

径没有设置或者设置不 对,VLC将找不到大部分的模块,导致大部分功能缺失而无法运行。

如果需要修改这一特性可以修改 0.8.6i)中的 VLCPlugin::getVLC

数。在SimpleTV中,Roger修改的一个片段是

char p_pluginpath[MAX_PATH+1];

int iTmp = 0;

/* 得到的全路径 */

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下的 playermodules */

strcat (p_pluginpath, “playermodules“);

ppsz_argv[ppsz_argc++] = “–plugin-path”;

ppsz_argv[ppsz_argc++] = p_pluginpath;

还有一点是配置文件vlcrc的路径,如果需要修改的话,可以修改 src/misc/configuration.c

中的 GetDir 函数, Windows下这个目录默认返回 %APPDATA% ,以上两步做好的话

其实就可以做出一个Portable的绿色版VLC了。

和其他ActiveX的播放器,例如WMPQuickTimeRealPlayer相比,VLC的优点也很

明显:自带所需解码器、开源、功能强大。

当然ActiveX方式和Mozilla 插件的方式也是有局限性的,这样的方式功能还不够强大,

例如没有截屏的接口如果需要更多完整的功能,可以考虑直接调用libvlc的接口,

VLC官方提供了一些文档和例子 /Libvlc 这里还有一个用C#调用

libvlc的例子/539865/116981

Windowslibvlc可能默认是不编译的(0.8.6i,可以在configure中开启这一选项

enable-shared-libvlc

完整的VLC体积还是不小的,如果只需要VLC一部分功能的话,可以最后做一下精简。