VLC源代码分析Word文档下载推荐.docx
《VLC源代码分析Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《VLC源代码分析Word文档下载推荐.docx(60页珍藏版)》请在冰豆网上搜索。
它的架构有一点类似于DirectShow的技术。
VLC也很注重版权方面的问题,你可以放心的自由的使用而不需要为版权的问题担心——VLC只包括免费的、自由的库。
VLC基于GPL,因此也可以用于商业应用,只需要保留GPL,以及公开源代码,如果你修改了VLC的话。
下面是VLC相关的一些链接
VLC官方网站:
http:
//www.videolan.org/
VLC下载页面:
//www.videolan.org/vlc/
VLC下载目录(源码和安装包):
//download.videolan.org/pub/videolan/vlc/
VLCNightlyBuilds:
http:
//nightlies.videolan.org/
VLC开发Wiki:
//wiki.videolan.org/Developers_Corner
VLCWin32第三方库预编译包下载目录:
//download.videolan.org/pub/testing/win32/
VLC官方论坛:
//forum.videolan.org/
VLC邮件列表:
//www.videolan.org/developers/lists.html
二、Windows平台编译
第一步,要创建编译VLC的环境。
VLC在Windows下可以用Msys+MingW或者Cygwin的方式来编译,二者大同小异,这里主要介绍Cygwin。
Cygwin是一个在Windows下面模拟Linux环境的东西。
它提供了很多库和应用程序,让你可以像在Linux上一样来使用Windows。
你需要在下载一个cygwin的安装程序setup.exe。
然后选择一个cygwin的源来下载所需要的库,国内的话到ftp:
//相对来说会快一点。
第一次安装,除了默认的库以外,我们还需要加入一些库来支持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:
forbuildingextras/contrib)
wget(optional:
然后是下载所需要版本的VLC的源代码。
对于Release版本,可以从这里下载:
//download.videolan.org/pub/videolan/vlc/,如果你需要下载实时最新的库,就要从VLC的源码库上取下来了。
现在VLC改用git了,使用命令:
gitclonegit:
//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/\
–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应该就可以运行了。
为了方便可以把它打包,最简单的是‘makepackage-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上的编译就几乎一样了。
写一个配置脚本然后运行它。
例如一个配置脚本:
–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就可以了。
参考:
//wiki.videolan.org/UnixCompile
四、VLC使用
VLC的功能很强大,它不仅仅是一个视频播放器,也可作为小型的视频服务器,更可以一边播放一边转码,把视频流发送到网络上。
最简单的,从界面打开一个文件播放,也可以在命令行下使用,如C:
\ProgramFiles\VideoLAN\VLC>
vlc.exetest.ts
获取内置的帮助,会写到vlc-help.txt:
C:
vlc.exe-h
获取更详细的帮助,有大量的选项介绍:
vlc.exe-H
在线使用帮助
//www.videolan.org/doc/play-howto/en/play-howto-en.html
//www.videolan.org/doc/streaming-howto/en/streaming-howto-en.html
搜索并显示可用的模块列表:
vlc.exe-l
Windows下,默认情况,VLC的配置文件在%APPDATA%\vlc\vlcrc,%APPDATA%在XP下通常是C:
\DocumentsandSettings\用户名\ApplicationData
Linux下,在用户home目录的/.vlc/中
vlc的选项完全可以通过修改vlcrc来设置,界面只是略微方便一点
重置所有选项到默认状态:
vlc.exe–reset-config
VLC从vlcrc中指定的plugin-path,以及当前目录的modules和plugins目录来递归查找plugin,VLC的大部分功能都是通过plugin来实现的。
VLC默认有大量的动态插件,为了加快启动速度,vlc会在%APPDATA%\vlc\cache中缓存plugin的列表,选项plugins-cache=0可以禁止缓存plugin
打开一个UDP组播流,组播组239.255.1.1,端口4567,默认端口1234,对于rtp协议,VLC会自动识别,写udp还是rtp都没问题
vlc.exeudp:
//@239.255.1.1:
4567
在本地UDP端口888接收流,“@”表示绑定一个地址,而不是连接该地址
//@888
串流输出,就是在播放的时候,以某种方式向外传送视频,在打开界面的串流/保存中设置会比较方便。
例如,循环播放test.ts,以rtp方式传送到224.1.1.1端口1234,同时显示视频
vlc.exetest.ts–loop:
sout=#duplicate{dst=std{access=rtp,mux=ts,dst=224.1.1.1:
1234},dst=display}
例如,接收UDP端口888,数据全部保存到C:
\dump.ts
//@888:
demux=dump:
demuxdump-file=”C:
\dump.ts”
关于Windows下视频输出模块
Direct3D:
效果比DirectX差一点,但是方便截图,也可以在图像上实现alpha
DirectX:
效果最好,利用DirectX的显示加速
OpenGL:
在不同的硬件上表现不太一样
WinGDI:
最慢的一种,不需要显卡加速
caca:
用彩色的Assic字符来显示
临时启用某个视频输出,可以这样:
\ProgramFiles\VideoLAN\VLC-0.8.6e>
vlctest.ts–vout=caca
ActiveX控件
官方发布的VLC自带ActiveX控件axvlc.dll,注册之后可以方便的在应用程序和网页中使用VLC,注册的办法是
regsvr32axvlc.dll
ActiveXVLC的使用方法可以参考源代码中ActiveX目录的README.TXT和test.html,ActiveX控件的接口有第一版和第二版,第一版简单,功能少,已经不再维护建议用第二版本,功能多一点
MozillaPlugin
你还可以在Windows和Linux的Firefox中使用VLC。
Windows下可以在安装VLC的时候选上Mozillaplugin,事实上它做的就是在HKLM_Software_MozillaPlugin键下添加一个VLC的子键。
Linux下可以把libvlcplugin.so(或者叫npvlc.so)和插件目录放到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在服务器上专门作视频流转发一类的事情,这种远程界面可以帮上大忙。
视频过滤器
0.8系列中有多达13种视频过滤器,为视频添加各种效果和特殊处理。
Skin2界面
一个漂亮一点的,可以换肤的界面。
其他的
播放DVD、VCD光盘,打开DirectShow设备,播放当前屏幕…
一些问题
目前的VLC无法播放Real视频,如rm、rmvb。
其实从0.9版本的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/udp.c。
在同目录下还可以看到大量的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/ts.c。
其实之所以需要demux,是因为音视频在制作的时候实际上都是独立编码的,得到的是分开的数据,为了传输方便必须要用某种方式合起来,这就有了各种封装格式也就有了demux。
demux分解出来的音频和视频流分别送往音频解码器和视频解码器。
因为原始的音视频都是占用大量空间,而且冗余度较高的数据,通常在制作的时候就会进行某种压缩。
这就是我们熟知的音视频编码格式,包括MPEG1(VCD)、MPEG2(DVD)、MPEG4、H.264、rmvb等等。
音视频解码器的作用就是把这些压缩了的数据还原成原始的音视频数据。
VLC解码MPEG2使用了一个独立的库libmpeg2,调用它的源文件是/modules/codec/libmpeg2.c。
VLC关于编解码的模块都放在/modules/codec目录下,其中包括著名的庞大的ffmpeg。
解码器,例如视频解码器输出的是一张一张的类似位图格式的图像,但是要让人从屏幕看得到,还需要一个视频输出的模块。
当然可以像一个Win32窗口程序那样直接把图像画到窗口DC上——VLC的一个输出模块WinGDI就是这么干的,但是通常这太慢了,而且消耗大量的CPU。
在Windows下比较好的办法是用DirectX的接口,会自动调用显卡的加速功能。
这样的功能分解使得模块化更容易一点,每个模块住需要专注于自己的事;
从整体来说功能强大而且灵活。
但是事情总是不会那么简单。
就拿access来说,媒体的访问是分层的,如RTSP就涉及到IPv4、TCP、UDP、RTCP、RTSP等多个层次的协议。
有些视频格式包括了传输、封装格式和编辑码格式如MPEG系列,有些封装格式是独立的容器,但是很多人会误解它是编解码格式,如mkv、avi这些。
音频和视频在demux之