VLC源码分析总结

上传人:工**** 文档编号:511835645 上传时间:2023-02-19 格式:DOC 页数:6 大小:65.50KB
返回 下载 相关 举报
VLC源码分析总结_第1页
第1页 / 共6页
VLC源码分析总结_第2页
第2页 / 共6页
VLC源码分析总结_第3页
第3页 / 共6页
VLC源码分析总结_第4页
第4页 / 共6页
VLC源码分析总结_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《VLC源码分析总结》由会员分享,可在线阅读,更多相关《VLC源码分析总结(6页珍藏版)》请在金锄头文库上搜索。

1、VLC源码分析总结1 概述VLC属于Video LAN开源项目组织中的一款全开源的流媒体服务器和多媒体播放器。作为流媒体服务器,VLC跨平台,支持多操作系统和计算机体系结构;作为多媒体播放器,VLC可以播放多种格式的媒体文件。主要包括有:WMV、ASF、MPG、MP、AVI、H.264等多种常见媒体格式。VLC采用全模块化结构,在系统内部,通过动态的载入所需的模块,放入一个module_bank的结构体中统一管理,连VLC的Main模块也是通过插件的方式动态载入的(通过module_InitBank函数在初始化建立module_bank时)。对于不支持动态载入插件的系统环境中,VLC也可以采用

2、builtin的方式,在VLC启动的时候静态载入所需要的插件,并放入module_bank统一管理。VLC的模块分成很多类别主要有:access、access_filter、access_output、audio_filter、audio_mixer、audio_output、codec、control、demux、gui、misc、mux、packetizer、stream_output、video_filter、video_output、interface、input、playlist等(其中黑体为核心模块)。VLC无论是作为流媒体服务器还是多媒体播放器,它的实质思路就是一个“播放器”,之

3、所以这么形象描述,是因为(The core gives a framework to do the media processing, from input (files, network streams) to output (audio or video, on ascreen or a network), going through various muxers, demuxers, decoders and filters. Even the interfaces are plugins for LibVLC. It is up to the developer to choose w

4、hich module will be loaded. 摘于官网说明)它实质处理的是ES、PES、PS、TS等流间的转换、传输与显示。对于流媒体服务器,如果从文件作为输入即:PS-DEMUX-ES-MUX-TS;对于多媒体播放器如果采用UDP方式传输即:TS-DEMUX-ES。2 插件管理框架在VLC中每种类型的模块中都有一个抽象层/结构体,在抽象层或结构体中定义了若干操作的函数指针,通过这些函数指针就能实现模块的动态载入,赋值相关的函数指针的函数地址,最后通过调用函数指针能调用实际模块的操作。对于VLC所有的模块中,有且仅有一个导出函数:vlc_entry_(MODULE_NAME)。(其中

5、MODULE_NAME为宏定义,对于main模块,在includemodules_inner.h中定义为main)动态载入模块的过程是:使用module_Need函数,在module_bank中根据各个插件的capability等相关属性,寻找第一个能满足要求并激活的模块。所谓激活是指,调用插件的初始化函数成功。对于各个插件的初始化函数和析构函数均在vlc_entry_(MODULE_NAME)函数中指定了相关函数地址。因此载入各个插件(动态库)的过程,就成为了解析动态库文件,并找到其中vlc_entry_函数的地址,然后运行。这样各个模块的激活函数就会赋值各个操作的函数地址,以待后面函数动态

6、调用。具体函数调用过程如下:l Main模块的载入过程:int main( int i_argc, char *ppsz_argv )(srcvlc.c)i_ret = VLC_Init( 0, i_argc, ppsz_argv )module_InitBank( p_vlc )(srclibvlc.c void _module_InitBank( vlc_object_t *p_this )) module_LoadMain( p_this )(srcmiscmodules.c)AllocateBuiltinModule( p_this, vlc_entry_main )pf_entry(

7、 p_module )(激活了main模块,以上为main模块的载入过程,对于main模块调用的实际函数为导出函数vlc_entry_main,其它模块导出的均为vlc_entry_0_8_6)l Module_Need函数实现载入任意模块的过程:module_t * _module_Need( vlc_object_t *p_this, const char *psz_capability, const char *psz_name, vlc_bool_t b_strict )(srcmiscmodules.c) vlc_list_find(将所有已经载入的模块查询出来)然后循环,根据cap

8、ability查找第一个最合适的moduleAllocatePlugin(动态载入所需要的插件,该函数会在动态库所在目录,遍历所有动态库文件,)p_module-pf_activate(调用激活函数)l VLC_Init函数流程:module_InitBankmodule_LoadBuiltins(载入静态插件)module_LoadPlugins(载入动态插件VLC_AddIntf(添加interface插件,VLC会静态载入hotkeys模块)在VLC中根据处理任务不同,会静态载入不同的模块,main、memcpy、hotkeys等;动态载入的模块根据处理任务不同,差异很大。3 VLC流媒

9、体服务器体系结构以下主要讨论VLC作为流媒体服务器时的体系结构。针对一个节目单文件,调试其运行过程,并最后给出总结。该实例的播放节目单为如下:New br broadcast enabledSetup br input /mnt/hgfs/movie/caiyan.mpgSetup br output #standardmux=ts,access=udp,url=234.0.1.4,sap,name=ch1在例子中,通过VLC提供API:libvlc_new,libvlc_vlm_new,libvlc_vlm_play_media,libvlc_vlm_load_file等(有些API是自己添

10、加的)可以完成对广播节目br的播放。下面让我们仔细看看通过这几个接口,VLC内部到底是怎么工作完成了流媒体发布的。1. 首先程序调用libvlc_new(srccontrolcore.c)接口,实现创建一个VLC运行实例libvlc_instance_t,该实例在程序运行过程中唯一。2. 在libvlc_new接口中,调用了VLC_Init函数实现具体的初始化工作。3. VLC_Init(srclibvlc.c)函数中,首先通过system_Init函数完成传入参数对系统的相关初始化,接着通过module_InitBank(srcmiscmodules.c)函数初始化module_bank结构

11、体,并创建了main模块,然后通过module_LoadBuiltins载入静态模块,通过module_LoadPlugins(srcmiscmodules.c)函数载入动态模块,通过module_Need(srcmiscmodules.c)函数载入并激活memcpy模块,通过playlist_Create(srcplaylistplaylist.c)函数,创建了一个playlist播放管理的线程,其线程处理函数为RunThread(srcplaylistplaylist.c),通过VLC_AddIntf(srclibvlc.c)函数添加并激活hotkeys模块,最后根据系统设置定义了宏HAV

12、E_X11_XLIB_H,因此还需要添加screensaver模块。4. 总结:此时加载的模块有main,hotkeys,screensaver,memcpy;多创建了一个线程,用于管理playlist,该线程无限循环,直到p_playlist-b_die状态为止。5. 其次程序中调用libvlc_vlm_new接口,创建VLM对象(该接口为自己添加的)。6. 该接口调用的是vlm_New(srcmiscvlm.c)函数,实现VLM对象的创建,函数返回值是指向vlm_t的指针。7. Vlm_new函数中,创建了一个vlm管理线程,线程处理函数为Manage(srcmiscvlm.c)。该函数循

13、环处理当前各种媒体(vod、broadcast、schedule)的播放实例,控制其每个播放细节(如:从一个input切换到下一个input;schedule周期循环调度等)。与playlist线程不同的是,Manage主要针对播放实例的操作,而RunThread主要针对播放列表的管理,也就是说VLC管理是分级的,播放列表级和播放列表中媒体播放实例级。8. 其次程序调用libvlc_vlm_load_file接口,载入播放节目单(该接口也为自己添加,播放节目单如上所述)。9. 该接口调用的是vlm_Load(srcmiscvlm.c)函数,在该函数中,依次调用如下函数:stream_UrlNe

14、w、stream_Seek、stream_Read、Load,以下详细介绍各个函数作用。a) 首先是stream_UrlNew(srcinputstream.c)函数。先调MRLSplit(srcinputinput.c)函数完成对access、demux和path的解析。具体对于本例解析的结果为:access= ,demux= ,path= aa。然后调用access2_New(srcinputaccess.c)函数创建一个access_t结构体并初始化。具体运行时载入模块的相关参数是:capability=access2,name=access_file,psz_filename=acce

15、ss/libaccess_file_plugin.so。最后调用stream_AccessNew(srcinputstream.c)函数,创建stream_t结构体对象,并初始化对象中所有函数指针;b) 再调用stream_Seek(includevlc_stream.h)内联函数,设置起始位置;c) 再调用stream_Size(includevlc_stream.h)获得大小;d) 再调用stream_Read(includevlc_stream.h),读取到缓冲区;e) 最后调用Load(srcmiscvlm.c),完成实际的载入节目单。对于节目单文件,是一行行解析,并调用ExecuteCommand(srcmiscvlm.c)完成解析的。Load函数的调用仅仅是设置了相关参数,如:设置input字符串值,设置output字符串值,设置mux的值及与播放相关的enabled、loop等参数。Load工作仅仅是为了下一步发布流做准备的。10. 程序中调用libvlc_vlm_play_media接口,将节目流发布出去。(自己添加接口)11. 在libvlc_vlm_play_media接口中,实质是创建了命令“control br play”再调用vlm_ExecuteCommand(srcmiscvlm.c),完成对命

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 营销创新

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号