VLC源代码分析一

时间:2023-02-10 15:57:24

一、 VLC简介

VLC的全名是VideoLan Client,是一个开源的、跨平台的视频播放器。VLC支持大量的音视频传输、封装和编码格式,完整的功能特性列表可以在这里获得http://www.videolan.org/vlc/features.html,下面给出一个简要的不完整的列表:

操作系统:Windows、WinCE、Linux、MacOSX、BEOS、BSD

访问形式:文件、DVD/VCD/CD、http、ftp、mms、TCP、UDP、RTP、IP组播、IPv6、rtsp

编码格式:MPEG*、DIVX、WMV、MOV、3GP、FLV、H.263、H.264、FLAC

视频字幕:DVD、DVB、Text、Vobsub

视频输出:DirectX、X11、XVideo、SDL、FrameBuffer、ASCII

控制界面:WxWidgets、QT4、Web、Telnet、Commandline

浏览器插件:ActiveX、Mozilla(firefox) 

实际上为了更清晰一点,我们可以反过来说说VLC不支持哪些常见的。首先是RealVideo(Real的Audio部分支持),因为Real的Video加码器存在版权的问题。实际上VLC 0.9.0已经加入了RealVideo的支持,但是需要额外的解码器(类似MPlayer)。另外,VLC不支持3GP的音频格式AMR。

VLC原先是几个法国的大学生做的项目,后来他们把VLC作为了一个开源的项目,吸引了来自世界各国的很多优秀程序员来共同编写和维护VLC,才逐渐变成了现在这个样子。

至于为什么叫VideoLan Client,是因为以前还有一个VideoLanServer的项目(简称VLS),而目前VLS的功能已经合并到VLC中来,所以VLC不仅仅是一个视频播放器,它也可以作为小型的视频服务器,更可以一边播放一边转码,把视频流发送到网络上。VLC最为突出的就是网络流的播放功能,例如MPEG2的UDP TS流的播放和转发,几乎是无可替代的。

对普通用户来说,VLC还有一个好处是不影响Windows中的解码器。VLC通常不影响也不依赖于系统中自带的解码器(除了realvideo和quicktime的类型),很绿色很环保;更不用担心流氓软件、广告插件之类的恶心的玩意儿。

从程序结构来看,VLC的可扩展性是相当优秀的。VLC绝大部分用高效的C代码来编写(少量的C++和汇编),但是实现了完全动态的模块化,所有功能包括程序框架本身都是module,可以在运行时载入,这使得VLC可以轻易的扩展多种功能并且容易维护。它的架构有一点类似于DirectShow的技术。

VLC也很注重版权方面的问题,你可以放心的*的使用而不需要为版权的问题担心——VLC只包括免费的、*的库。VLC基于GPL,因此也可以用于商业应用,只需要保留GPL,以及公开源代码,如果你修改了VLC的话。

下面是VLC相关的一些链接

VLC官方网站:http://www.videolan.org/

VLC下载页面:http://www.videolan.org/vlc/

VLC下载目录(源码和安装包):http://download.videolan.org/pub/videolan/vlc/

VLC Nightly Builds:http://nightlies.videolan.org/

VLC 开发Wiki:http://wiki.videolan.org/Developers_Corner

VLC Win32第三方库预编译包下载目录:http://download.videolan.org/pub/testing/win32/

VLC 官方论坛:http://forum.videolan.org/

VLC 邮件列表:http://www.videolan.org/developers/lists.html

二、 Windows平台编译

第一步,要创建编译VLC的环境。VLC在Windows下可以用Msys+MingW 或者Cygwin的方式来编译,二者大同小异,这里主要介绍Cygwin。

 Cygwin是一个在Windows下面模拟Linux环境的东西。它提供了很多库和应用程序,让你可以像在Linux上一样来使用Windows。你需要在http://www.cygwin.com/ 下载一个cygwin的安装程序setup.exe。然后选择一个cygwin的源来下载所需要的库,国内的话到ftp://ftp.sjtu.edu.cn/cygwin/和 http://www.cygwin.cn/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 (不一定需要)

ibiconv

ibtool

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版本,可以从这里下载:http://download.videolan.org/pub/videolan/vlc/,如果你需要下载实时最新的库,就要从VLC的源码库上取下来了。现在VLC改用git了,使用命令: git clone git://git.videolan.org/vlc.git

 

VLC还需要很多第三方的库,你可以取得源码来编译,这部分可以参考Linux上的VLC编译的文章。在Windows上VLC做了一个编译好的win32第三方库的包,可以从http://download.videolan.org/pub/testing/win32/ 下载。包需要解压到根目录 ‘/’,事实上这些库都位于’/usr/win32-branch’里边。

在cygwin中进入vlc的主目录,运行bootstrap,’./bootstrap’。在等待它结束之前,我们先来看一下如何配置VLC的编译。运行 ‘./configure -h >cfg_opt.txt’就可以把配置的选项信息都输出到 cfg_opt.txt中,然后慢慢来研究。里面大多是启用、禁用某些特性和功能模块,或者配置某些模块需要的库的路径等信息。为了方便可以写一个简单的脚本来做这件事,当然这个不是必需的。 

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/live.com \

–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就编译好了。直接双击主目录里边的vlc.exe应该就可以运行了。

为了方便可以把它打包,最简单的是 ‘make package-win32-base’,它将创建一个子目录来存放所有运行所需的东西,这个目录就是一个绿色版的VLC啦。

当然如果你运气没那么棒,可能会碰到各种各样的错误,例如在boottrap或者configure中出错,通常是因为没安装某个库或者库的版本不合适;也可能碰到编译的错误,尝试去google一下。

本文参考 http://wiki.videolan.org/Win32CompileCygwinNew

三、 Linux平台编译

先下载源代码,把源代码解压之后也是先运行一下bootstrap,看看缺什么工具没有,例如gcc、make、libtool、automake、autoconfig等是否有合适的版本。如果不合适的话就用你喜欢的方式去升级或者安装。

下面最麻烦的一步来了。VLC在Linux上没有给出和Windows上类似的第三方库的预编译包,你必须去自己获得并编译这些库。这些库的数量取决于你的配置选项。VLC给出了一个自动化的解决方案,关注一下主目录\extras\contrib,里边有一些工具来帮助你自动下载、patch和编译所有可能用到的第三方库。先运行一下那个目录下的bootstrap,如果缺少***.mak的话可以到VLC的代码库中找一下,是一个系统相关的文件,然后简单的一句make就可以了。如果你对这些库比较熟悉的话最好先手动筛选一下,有一些可能不是你所需要的,而下载他们可能需要很长的时间。

在漫长的等待之后,如果一切顺利(我几乎不相信会这样),这一步就算完成了。可能遇到的问题有:下载实在太慢,可以用其他下载工具把库的代码包下下来放到\extras\contrib\src里边;如果下载一半断掉,可以把那个不完整的文件删掉重新再运行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就可以了。

参考:http://wiki.videolan.org/UnixCompile