VLC源代码分析.docx

上传人:b****7 文档编号:9462982 上传时间:2023-02-04 格式:DOCX 页数:64 大小:45.22KB
下载 相关 举报
VLC源代码分析.docx_第1页
第1页 / 共64页
VLC源代码分析.docx_第2页
第2页 / 共64页
VLC源代码分析.docx_第3页
第3页 / 共64页
VLC源代码分析.docx_第4页
第4页 / 共64页
VLC源代码分析.docx_第5页
第5页 / 共64页
点击查看更多>>
下载资源
资源描述

VLC源代码分析.docx

《VLC源代码分析.docx》由会员分享,可在线阅读,更多相关《VLC源代码分析.docx(64页珍藏版)》请在冰豆网上搜索。

VLC源代码分析.docx

VLC源代码分析

VLC源代码分析

一、VLC简介

VLC的全名是VideoLanClient,是一个开源的、跨平台的视频播放器。

VLC支持大量的音视频传输、封装和编码格式,完整的功能特性列表可以在这里获得,下面给出一个简要的不完整的列表:

操作系统:

Windows、WinCE、Linux、MacOSX、BEOS、BSD

访问形式:

文件、DVD/VCD/CD、http、ftp、mms、TCP、UDP、RTP、IP组播、IPv6、rtsp

编码格式:

MPEG*、DIVX、WMV、MOV、3GP、FLV、、、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已经加入了RealVideo的支持,但是需要额外的解码器(类似MPlayer)。

另外,VLC不支持3GP的音频格式AMR。

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

至于为什么叫VideoLanClient,是因为以前还有一个VideoLanServer的项目(简称VLS),而目前VLS的功能已经合并到VLC中来,所以VLC不仅仅是一个视频播放器,它也可以作为小型的视频服务器,更可以一边播放一边转码,把视频流发送到网络上。

VLC最为突出的就是网络流的播放功能,例如MPEG2的UDPTS流的播放和转发,几乎是无可替代的。

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

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

从程序结构来看,VLC的可扩展性是相当优秀的。

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

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

VLC也很注重版权方面的问题,你可以放心的自由的使用而不需要为版权的问题担心——VLC只包括免费的、自由的库。

VLC基于GPL,因此也可以用于商业应用,只需要保留GPL,以及公开源代码,如果你修改了VLC的话。

下面是VLC相关的一些链接

二、VLC官方网站:

下载页面:

下载目录(源码和安装包):

NightlyBuilds:

开发Wiki:

Win32第三方库预编译包下载目录:

官方论坛:

邮件列表:

平台编译

第一步,要创建编译VLC的环境。

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

Cygwin是一个在Windows下面模拟Linux环境的东西。

它提供了很多库和应用程序,让你可以像在Linux上一样来使用Windows。

你需要在下载一个cygwin的安装程序。

然后选择一个cygwin的源来下载所需要的库,国内的话到相对来说会快一点。

第一次安装,除了默认的库以外,我们还需要加入一些库来支持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

Webbootstrap’。

在等待它结束之前,我们先来看一下如何配置VLC的编译。

运行‘./configure-h>’就可以把配置的选项信息都输出到中,然后慢慢来研究。

里面大多是启用、禁用某些特性和功能模块,或者配置某些模块需要的库的路径等信息。

为了方便可以写一个简单的脚本来做这件事,当然这个不是必需的。

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就编译好了。

直接双击主目录里边的应该就可以运行了。

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

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

三、本文参考平台编译

先下载源代码,把源代码解压之后也是先运行一下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就可以了。

四、参考:

使用

VLC的功能很强大,它不仅仅是一个视频播放器,也可作为小型的视频服务器,更可以一边播放一边转码,把视频流发送到网络上。

最简单的,从界面打开一个文件播放,也可以在命令行下使用,如C:

\ProgramFiles\VideoLAN\VLC>

获取内置的帮助,会写到:

C:

\ProgramFiles\VideoLAN\VLC>-h

获取更详细的帮助,有大量的选项介绍:

C:

\ProgramFiles\VideoLAN\VLC>-H

在线使用帮助

搜索并显示可用的模块列表:

C:

\ProgramFiles\VideoLAN\VLC>-l

Windows下,默认情况,VLC的配置文件在%APPDATA%\vlc\vlcrc,%APPDATA%在XP下通常是C:

\DocumentsandSettings\用户名\ApplicationData

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

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

重置所有选项到默认状态:

C:

\ProgramFiles\VideoLAN\VLC>–reset-config

VLC从vlcrc中指定的plugin-path,以及当前目录的modules和plugins目录来递归查找plugin,VLC的大部分功能都是通过plugin来实现的。

VLC默认有大量的动态插件,为了加快启动速度,vlc会在%APPDATA%\vlc\cache中缓存plugin的列表,选项plugins-cache=0可以禁止缓存plugin

打开一个UDP组播流,组播组,端口4567,默认端口1234,对于rtp协议,VLC会自动识别,写udp还是rtp都没问题

C:

\ProgramFiles\VideoLAN\VLC>888接收流,“@”表示绑定一个地址,而不是连接该地址

C:

\ProgramFiles\VideoLAN\VLC>,就是在播放的时候,以某种方式向外传送视频,在打开界面的串流/保存中设置会比较方便。

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

–loop:

sout=#duplicate{dst=std{access=rtp,mux=ts,dst=:

1234},dst=display}

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

\

:

demux=dump:

demuxdump-file=”C:

\”

关于Windows下视频输出模块

Direct3D:

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

DirectX:

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

OpenGL:

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

WinGDI:

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

caca:

用彩色的Assic字符来显示

临时启用某个视频输出,可以这样:

C:

\ProgramFiles\VideoLAN\–vout=caca

ActiveX控件

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

C:

\ProgramFiles\VideoLAN\

ActiveXVLC的使用方法可以参考源代码中ActiveX目录的和,ActiveX控件的接口有第一版和第二版,第一版简单,功能少,已经不再维护建议用第二版本,功能多一点

MozillaPlugin

你还可以在Windows和Linux的Firefox中使用VLC。

Windows下可以在安装VLC的时候选上Mozillaplugin,事实上它做的就是在HKLM_Software_MozillaPlugin键下添加一个VLC的子键。

Linux下可以把(或者叫)和插件目录放到Firefox的plugins目录,来使之生效。

同样这适用于基于Xulrunner的应用程序,事实上像Miro、SongBird等xul应用都是用的这个插件。

与ActiveX类似的,VLC的MozillaPlugin也有两套接口,建议用新的第二版。

注册表

在Windows下VLC只使用很少量的注册表的信息,最重要的一条是HKLM_Software_VLC键下的InstallDir项,VLC的MozillaPlugin和ActiveX控件通过这一项来定位其插件的目录。

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

Windows下默认使用的是wxwidgets图形界面,还可以使用http、telnet等界面,来远程控制VLC,如果用VLC在服务器上专门作视频流转发一类的事情,这种远程界面可以帮上大忙。

视频过滤器

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

Skin2界面

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

其他的

播放DVD、VCD光盘,打开DirectShow设备,播放当前屏幕…

一些问题

目前的VLC无法播放Real视频,如rm、rmvb。

其实从版本的VLC开始可以依赖其他解码器播放。

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

RTSP的播放,拖动有问题,在获取播放位置时有缺陷。

例如和达尔文服务器的配合。

五、视频播放的基本原理

几乎所有的视频播放器,如VLC、MPlayer、Xine,包括DirectShow,在播放视频的原理和架构上都是非常相似的,理解这个对理解VLC的源码会有事半功倍的效果。

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

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

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

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

4.output输出,也分为音频和视频的输出(aout和vout)

拿播放一个UDP组播的MPEGTS流来说吧,access部分负责从网络接收组播流,放到VLC的内存缓冲区中,access模块关注IP协议,如是否IPv6、组播地址、组播协议、端口等信息;如果检测出来是RTP协议(RTP协议在UDP头部简单得加上了固定12个字节的信息),还要分析RTP头部信息。

这部分可以参看VLC源码/modules/access/。

在同目录下还可以看到大量的access模块,如file、http、dvd、ftp、smb、tcp、dshow、mms、v4l…等等

而demux部分首先要解析TS流的信息。

TS格式是MPEG2协议的一部分,概括地说,TS通常是固定188字节的一个packet,一个TS流可以包含多个program(节目),一个program又可以包含多个视频、音频、和文字信息的ES流;每个ES流会有不同的PID标示。

而又为了可以分析这些ES流,TS有一些固定的PID用来间隔发送program和es流信息的表格:

PAT和PMT表。

关于TS格式的详细信息可以去google一下。

VLC专门做了一个独立的库libdvbpsi来解析和编码TS流,而调用它的代码可以参见VLC源码/modules/demux/。

其实之所以需要demux,是因为音视频在制作的时候实际上都是独立编码的,得到的是分开的数据,为了传输方便必须要用某种方式合起来,这就有了各种封装格式也就有了demux。

demux分解出来的音频和视频流分别送往音频解码器和视频解码器。

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

这就是我们熟知的音视频编码格式,包括MPEG1(VCD)、MPEG2(DVD)、MPEG4、、rmvb等等。

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

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

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

解码器,例如视频解码器输出的是一张一张的类似位图格式的图像,但是要让人从屏幕看得到,还需要一个视频输出的模块。

当然可以像一个Win32窗口程序那样直接把图像画到窗口DC上——VLC的一个输出模块WinGDI就是这么干的,但是通常这太慢了,而且消耗大量的CPU。

在Windows下比较好的办法是用DirectX的接口,会自动调用显卡的加速功能。

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

但是事情总是不会那么简单。

就拿access来说,媒体的访问是分层的,如RTSP就涉及到IPv4、TCP、UDP、RTCP、RTSP等多个层次的协议。

有些视频格式包括了传输、封装格式和编辑码格式如MPEG系列,有些封装格式是独立的容器,但是很多人会误解它是编解码格式,如mkv、avi这些。

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

同时我们需要有一套机制来控制速度、暂停、停止、跳进,获取各种媒体信息,这些都是很复杂而又很重要的事情。

另外也许需要在某个地方插入一些修改,来实现某种效果。

如音频的EQ,视频的亮度调整之类的,VLC专门设计了access_filter、audio_filter和video_filter类型的模块来做这一类事情。

VLC比较独特的地方是集成了原来的VLS的功能,这依赖于VLC中stream_output类型的模块,它们可以把正在播放的视频以某种方式重新转码和发送出去,如http、UDP、文件等等。

MPlayer的结构与此是类似的,如/stream目录对应的是access的功能,/mpdemux对应的demux功能,/libmpcodecs是解码器,/libvo和/libao2分别是视频和音频的输出。

DirectShow也是类似的,不过分类更多一些更复杂一点。

DirectShow里面的模块叫做“filter”,filter之间通过”pin”来连接。

access的模块对应于DirectShow中的SourceFIlter,这一类Filter只有输出pin没有输入pin。

demux模块对应于splitterfilter,这种filter有一个输入pin,多个输出pin。

解码模块是一类transformfilter,有一个输入pin、一个输出pin,输出模块对应于readeringfilter,有一个输入pin,没有输出pin。

当然transformfilter不一定是解码器,也可能是某种其他的处理。

另外给出一个VLC的APIDocument,参见:

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\

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1