VLC源码分析

本文介绍了分析VLC 2.1.4源码,特别是关注播放RTSP流的代码逻辑。首先通过编译源码安装VLC,然后详细描述了从安装到播放RTSP流的步骤,包括编译源码、安装检查、使用live555库等。文章还展示了VLC播放RTSP流时的主要代码路径,涉及lib、src、modules和bin目录的功能,并给出了详细的日志输出,展示播放过程中的关键步骤和模块加载情况。
摘要由CSDN通过智能技术生成

看了几天VLC2.1.4的源码,不过说是看源码,其实是了解vlc播放rtsp流的代码执行逻辑,目的是先了解其执行路径,然后再看细节。看的时间不多,可能有部分写的不对,如有朋友发现有问题,欢迎指正。

要了解其执行路径,需要先安装vlc,我是通过编译源代码来安装的,这样可以在播放时打印log,方便追踪。编译源码方法如下:

1.安装vlc的依赖环境:

#sudo apt-get build-dep vlc

2. 下载源码在本地,解压:

3.编译安装:

a../bootrap
b../configure --enable-live --enable-debug --enable-run-as-root --prefix=/usr/local/vlc  //备注:要支持播放rtsp流,必须enable live,同理要能打印debug,也要enable debug选项,如果在linux下面要用root账号来启用vlc,要enable run-as-root,最后是指定安装目录路径
c.make
d.make install

4.检查是否安装成功:

root@hmr-VB:/usr/local/vlc# ls
bin  include  lib  share
root@hmr-VB:/usr/local/vlc# cd bin/
root@hmr-VB:/usr/local/vlc/bin# ls
cvlc  nvlc  qvlc  rvlc  svlc  vlc  vlc-wrapper
root@hmr-VB:/usr/local/vlc/bin#
5.vlc播放rtsp流是使用的live555库,live555也可以用源码编译安装,这样方便学习vlc的代码.

a.下载源码,解压;

b.编译:

./genMakefile linux
make

对于live555库的分析,有个朋友写了学习笔记,个人感觉是比较详细,有兴趣的可以去看看

 

使用vlc搭建RTSP流服务器:

1.启动vlc;

2.菜单:媒体->流->文件(添加)->串流->新目标中选择RTSP,点击添加->设置端口号和流名称(可以使用默认的)->选择转码,建议使用Video-MPEG2+MPGA(TS),用这个客户端能够比较好的播放,具体原因未知

 

vlc的代码结构主要如下:

1.lib目录:该目录是vlc提供的一些库,用于支持二次开发,比如用这些接口实现自己的播放器;

2.src目录:vlc的核心源码,readme文件的描述是:libvlccore source code.

3.modules目录:vlc的组件和插件源码,vlc开发用了比较多面向对象的编程方法,很多功能通过组件的方式提供,然后用函数指针加载,实现会简单,但是个人感觉这正是学习vlc源码可读性差的地方,开源代码可读性都不怎么样,不像企业更多追求可读性。

4.bin目录:这个目录代码很少,readme的描述是VLC binaries.没怎么了解,但是这个目录的vlc.c中定义了一个main函数,是程序入口。

现在把主要代码路径贴一下:

main()(bin/vlc.c)<-libvlc_new()<-libvlc_InternalInit()<-module_InitBank()//这里执行了较多接口,module_InitBank是初始化module,然后解析执行命令中的参数等,当然包含一个主角GetFilenames(),该接口会创建一个playlist.playlist代表vlc播放的一个节目.

pl_Get()->playlist_Create()(engine.c)->playlist_MLload()&playlist_Active()->Thread->LoopRequest()->playItem()->input_Create()&input_Start()->Run()->Init()->InputSourceInit()

这个为创建输入的主流程,playlist_MLload()会调用module_need加载一些模块,InputSourceInit()也会调用module_need加载模块,看log时要注意这点.

在播放RTSP流时,必须创建一个input,并对应一个节目,创建input和节目的流程见前面所述,这里说明下建立rtsp session的过程:

InputSourceInit()->demux_New()->module_need()->vlc_module_load()->module_load()->m_pfactive()(对应的是open函数)->connect()&session_setup();

connect()接口使用live555库先发送rtsp:option,服务端响应后发送rtsp:describe,得到服务器响应的describe后从connect()返回,此时已经解析到了sdp信息,然后调用session_setup()创建RTP session.session_setup先发送两个Setup到服务端并等待响应,setup交互过程中指定了服务器端和客户端的udp端口号,这样客户端可以创建socket接收RTP数据.客户端发送rtsp:play后服务端会开始发送音视频数据.由于时间关系,只分析了这部分流程,后面有时间看看能否补充.

后面贴一下使用vlc播放rtsp流的log信息,还有很多没有没分析,已分析的有标注调用路径,有些log是我自己加的,不影响分析.

进入vlc安装目录的bin目录,执行以下命令播放:

./vlc -vvv rtsp://192.168.x.x:8554/  //备注:192.168.x.x时rtsp流服务器的ip地址,我是用vlc搭流服务器,option -vvv会打印log,如果不需要log,不加该选项即可

root@hmr-VB:/home/hmr/Documents/vlc-2.1.4# /usr/local/vlc/bin/vlc -vvv rtsp://192.168.197.75:8554/
VLC media player 2.1.4 Rincewind (revision 2.1.4-0-g2a072be)
[0x912aa28] main libvlc debug: VLC media player - 2.1.4 Rincewind<<<<<<<src/misc/messages.c-vlc_LogSet()<-vlc_LogInit<-libvlc_InternalInit
[0x912aa28] main libvlc debug: Copyright ? 1996-2014 the VideoLAN team
[0x912aa28] main libvlc debug: revision 2.1.4-0-g2a072be
[0x912aa28] main libvlc debug: configured with ./configure  '--enable-live' '--enable-debug' '--enable-run-as-root' '--prefix=/usr/local/vlc'<<<<<<<src/misc/messages.c-vlc_LogSet()
[0x912aa28] main libvlc debug: searching plug-in modules<<<<<<<<<<<<<<<module_LoadPlugins<-libvlc_InternalInit
[0x912aa28] main libvlc debug: loading plugins cache file /usr/local/vlc/lib/vlc/plugins/plugins.dat
[0x912aa28] main libvlc debug: recursively browsing `/usr/local/vlc/lib/vlc/plugins'
[0x912aa28] main libvlc debug: saving plugins cache /usr/local/vlc/lib/vlc/plugins/plugins.dat
[0x912aa28] main libvlc debug: plug-ins loaded: 416 modules<<<<<<<<<<<<<<<module_LoadPlugins<-libvlc_InternalInit
[0x912aa28] main libvlc debug: opening config file (/root/.config/vlc/vlcrc)<<<<<<<<<<<config_OpenConfigFile()<-config_LoadConfigFile()<-libvlc_InternalInit()
[0x912aa28] main libvlc debug: translation test: code is "C"<<<<<<<<<<<<libvlc_InternalInit()
[0x912aa28] main libvlc debug: CPU has capabilities MMX MMXEXT SSE SSE2 SSE3 SSSE3 FPU <<<<<<<<<<<<<<<<<<<<<vlc_CPU_dump()<-libvlc_InternalInit()
[0x91c8ee0] main input debug: Creating an input for 'Media Library'<<<<<<<<<<<<<<<<<GetFilenames()中添加.log:src/input/input.c/Create()<-input_Read<-playlist_MLLoad()<-playlist_Create()
[0x91c8ee0] main input debug: Input is a meta file: disabling unneeded options<<<<<<<Init()<-input_Read()
[0x91c8ee0] main input debug: using timeshift granularity of 50 MiB, in path '/tmp'
[0x91c8ee0] main input debug: `file/xspf-open:///root/.local/share/vlc/ml.xspf' gives access `file' demux `xspf-open' path `/root/.local/share/vlc/ml.xspf'
[0x91c8ee0] main input debug: creating demux: access='file' demux='xspf-open' location='/root/.local/share/vlc/ml.xspf' file='/root/.local/share/vlc/ml.xspf'
[0x91b32d8] main demux debug: looking for access_demux module matching "file": 19 candidates<<<<<<<<<<<<<<<<<<<<<<<<<<<vlc_module_load()<-module_need()<-demux_New()
[0x91b32d8] main demux debug: no access_demux modules matched
[0x91c8ee0] main input debug: creating access 'file' location='/root/.local/share/vlc/ml.xspf', path='/root/.local/share/vlc/ml.xspf'
[0x91b4798] main access debug: looking for access module matching "file": 21 candidates<<<<<<<<<<<<<<<<<<<<<<<<<<<vlc_module_load()<-module_need()<-access_New()
[0x91b4798] filesystem access debug: opening file `/root/.local/share/vlc/ml.xspf'
[0x91b4798] main access debug: using access module "filesystem"<<<<<<<<<<<<<<<<<<<<<<<<<<<vlc_module_load()<-module_need()<-access_New()
[0x91b5498] main stream debug: Using stream method for AStream*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<stream_AccessNew()
[0x91b5498] main stream debug: starting pre-buffering<<<<<<<<<<<<<<<<<<<<<<<<<<<AStreamPrebufferBlock()<-stream_AccessNew()
[0x91b5498] main stream debug: received first data after 13 ms
[0x91b5498] main stream debug: pre-buffering done 296 bytes in 0s - 22 KiB/s
[0x91b4ea8] main stream debug: looking for stream_filter module matching "any": 9 candidates<<<<<<<<<<<<<<<<<<<<<<<<vlc_module_load()<-module_need()<-stream_FilterNew()
[0x91b4ea8] main stream debug: no stream_filter modules matched
[0x91b4ea8] main stream debug: looking for stream_filter module matching "record": 9 candidates
[0x91b4ea8] main stream debug: using stream_filter module "record"
[0x91c8ee0] main input debug: creating demux: access='file' demux='xspf-open' location='/root/.local/share/vlc/ml.xspf' file='/root/.local/share/vlc/ml.xspf'
[0x91b8250] main demux debug: looking for demux module matching "xspf-open": 63 candidates<<<<<<<<<<<<<<<<<<<<<<<<<<vlc_module_load()<-module_need()<-demux_New()
[0x91b8250] playlist demux debug: using XSPF playlist reader
[0x91b8250] main demux debug: using demux module "playlist"
[0x91b8338] main demux meta debug: looking for meta reader module matching "any": 2 candidates<<<<<<<<<<<<<<<<<<<<<<<<vlc_module_load()<-module_need()<-InputSourceMeta()
[0x91b8338] lua demux meta debug: Trying Lua scripts in /root/.local/share/vlc/lua/meta/reader
[0x91b8338] lua demux meta debug: Trying Lua scripts in /usr/local/vlc/lib/vlc/lua/meta/reader
[0x91b8338] lua demux meta debug: Trying Lua playlist script /usr/local/vlc/lib/vlc/lua/meta/reader/filename.luac
[0x91b8338] lua demux meta debug: Trying Lua scripts in /usr/local/vlc/share/vlc/lua/meta/reader
[0x91b8338] main demux meta debug: no meta reader modules matched
[0x91c8ee0] main input debug: `file/xspf-open:///root/.local/share/vlc/ml.xspf' successfully opened
[0x91cc618] main xml reader debug: looking for xml reader module matching "any": 1 candidates<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<vlc_module_load()<-module_need()<-xml_ReaderCreate()

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值