bavon@163.com
VLC Media Player(www.videolan.org/vlc/) 是一个优秀的、跨平台、支持多种传输协议、支持多种视频编码格式的视频播放器(同时也可以作为服务器)。VLC提供了二次开发包,在windows下可以利用VLC提供的ActiveX控件来进行二次开发。本文档介绍了如何在win32平台上利用mingw进行VLC的移植,并通过VLC的ActiveX进行二次开发,实现一个多媒体播放器。
在win32平台上利用mingw进行VLC的移植
首先是创建VLC的编译环境。
到http://sourceforge.net/project/showfiles.php?group_id=2435下载相关文件。
下载MinGW-5.1.3.exe或者更高的版本,然后运行,按照提示安装,最好选择安装full版本。
下载MSYS-1.0.10.exe或者更高的版本,然后运行,按照提示安装,中间要正确填写已经安装好的MinGW的目录,例如“j:/MinGW”。主要要用“/”。
下载msysDTK-1.0.0.exe或者更高的版本,然后运行,按照提示安装。
其次是编译VLC。
下载http://download.videolan.org//pub/testing/win32/contrib-0.8.6e-gcc-3.4.5-only.tar.bz2 到某个目录,如“j:\\vlc”。
到http://www.videolan.org/vlc/download-sources.html下载VLC source code tar.gz文件到上述目录。
运行msys程序,在弹出的控制终端中输入
mkdir /vlc
然后用windows的记事本编辑器编辑msys\\1.0\\etc\\fstab文件,在里面加入一行 j:/VLC /vlc,这样可以挂载vlc目录。
在msys的控制终端中输入
cd /vlc
tar jxvf contrib-0.8.6e-gcc-3.4.5-only.tar.bz2 –C /
会把解码库解压到/usr/win32-branch目录中。
在当前目录继续输入
tar zxvf vlc-0.8.6e.tar.gz
将vlc的源代码解压缩到vlc-0.8.6e目录中。
在当前目录继续输入
cd vlc-0.8.6e
./bootstrap
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 \
./configure \
--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-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 \
--disable-mkv \
--enable-debug
开始VLC的配置,然后执行
make
开始编译。编译过程中先出现如下错误:
j:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/sys/stat.h:113: error: syntax error before "off_t"
j:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/sys/stat.h:118: error: syntax error before '}' token
make[4]: *** [libaccess_output_file_plugin_a-file.o] Error 1
make[4]: Leaving directory `/vlc/vlc-0.8.6e/modules/access_output'
make[3]: *** [all-modules] Error 1
make[3]: Leaving directory `/vlc/vlc-0.8.6e/modules/access_output'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/vlc/vlc-0.8.6e/modules'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/vlc/vlc-0.8.6e'
make: *** [all] Error 2
原因是:没有在sys/stat.h之前包含“config.h”文件。这2个头文件有冲突。
解决办法:将vlc-0.8.6e /modules/access_out/file.c和vlc-0.8.6e /modules/access_out/udp.c这两个文件的“#include 继续编译,又同样出类似问题 j:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/sys/stat.h:113: error: syntax error before "off_t" j:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/sys/stat.h:118: error: syntax error before '}' token make[6]: *** [libmux_ps_plugin_a-pes.o] Error 1 make[6]: Leaving directory `/vlc/vlc-0.8.6e/modules/mux/mpeg' make[5]: *** [all-modules] Error 1 make[5]: Leaving directory `/vlc/vlc-0.8.6e/modules/mux/mpeg' make[4]: *** [all-recursive] Error 1 make[4]: Leaving directory `/vlc/vlc-0.8.6e/modules/mux' make[3]: *** [all] Error 2 make[3]: Leaving directory `/vlc/vlc-0.8.6e/modules/mux' make[2]: *** [all-recursive] Error 1 make[2]: Leaving directory `/vlc/vlc-0.8.6e/modules' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/vlc/vlc-0.8.6e' make: *** [all] Error 2 解决办法:将vlc-0.8.6e\\modules\\mux\\mpeg\\pes.c文件的“#include 继续编译,还是有问题 j:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/wchar.h:419: error: `off_t' does not name a type make[3]: *** [libaxvlc_a-main.o] Error 1 make[3]: Leaving directory `/vlc/vlc-0.8.6e/activex' make[2]: *** [all] Error 2 make[2]: Leaving directory `/vlc/vlc-0.8.6e/activex' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/vlc/vlc-0.8.6e' make: *** [all] Error 2 原因:off_t类型没有定义。 解决办法:在MinGW/include/wchar.h文件中加入如下代码: #ifndef _OFF_T_DEFINED typedef long off_t; #define _OFF_T_DEFINED #endif 继续编译,可以通过,并在vlc-0.8.6e目录下面生成vlc.exe可执行文件,这就是可以用于windows下的VLC了。通过实验,编译成功的文件可以播放*.mpg、*.mp3等格式的多媒体文件以及接收播放网络流媒体。 通过VLC的ActiveX进行二次开发,实现一个多媒体播放器 首先要注册VLC的ActiveX控件。 拷贝vlc-0.8.6e\\activex目录下面的axvlc.dll文件到c:\\windows目录下面,然后运行命令提示符cmd。在命令提示符中输入如下命令注册该控件 REGSVR32 C:\\WINDOWS\\AXVLC.DLL 系统会提示注册成功,但是实际上是无法使用播放功能的!通过分析注册表的注册信息知道,播放的时候依赖的一些动态链接库没有在ActiveX中。 所以得去选择适合Windows下的VLC播放器,取其编译好的插件。到http://www.videolan.org/vlc/download-windows.html下载播放器并安装,然后复制其目录下的axvlc.dll、axvlc.oca、libvlc.dll、npvlc.dll以及plugins下的所有文件到某个目录(例如myRelease)中,作为支持VLC ActiveX控件运行的基础。有了这些文件之后就可以卸载安装的VLC,使用自己开发的播放器了。 运行命令cmd,进入myRelease目录,执行下面的命令注册VLC ActiveX控件: REGSVR32 AXVLC.DLL 然后使用VC++6.0开发一个简单的播放器。具体开发过程不详述了,请参考myVLC目录下面的myVLC.dsw工程文件。 由于VLC没有使用文档,更加没有ActiveX的开发手册,开发时使用的是VLC ActiveX Plugin v1,通过阅读vlccontrol.h文件中的类声明来了解VLC控件的用法的。从中可以知道它实现了基本的播放功能,但是没有提供获取文件播放时间的接口,所以无法使用时间来显示播放进度,只能以播放百分比来表示。 播放器使用方法 运行myVLC.exe后,打开一个VLC控件支持的多媒体文件就可以播放了。 该播放器可以实现以下功能: 1.全屏显示:在播放视频时,可以双击VLC播放窗口实现全屏显示与窗口显示的切换。目前还不知道如何刷新窗口,当播放窗口被部分遮住时,可能会无法自动刷新,得通过全屏切换来实现刷新。 2.进度显示:播放过程中,进度条显示播放进度,进度条旁边的标签显示播放百分比。拖动进度条不会改变播放进度。 3.“FileName”:显示已经打开的文件或者URL。 4.“OpenFile”:选择并播放一个磁盘上的多媒体文件 5.“PlayURL”:在文本输入框中输入网络流媒体URL后单击进行播放。如果接收的是广播,则无法快进/快退、调整播放速度、暂停/继续等。 6.“Play”:从文件的开始处播放。 7.“Pause/Resume”:暂停/继续的切换。 8.“Stop”:停止播放,播放窗口显示VLC的logo。 9.“Backward”:后退5秒钟。在播放mpeg视频时,这个按钮有用,在播放mp3时会导致重新播放。 10.“Forward”:前进5秒钟。在播放mpeg视频时,这个按钮有用,在播放mp3时会导致重新播放。 11.“PlaySlower”:减慢播放速度。单击一次减少一半的速度,最慢只能达到正常速度的1/8。 12.“PlayFaster”:加快播放速度。单击一次增加一倍的速度,最快只能达到正常速度的8倍。 13.“-”“+”:调节音量,每次以5增加或者减少。 14.“Mute”:静音/非静音的切换。 15.“About”:作者信息。 16.“Exit”:退出应用程序。下载本文