关键词:
http://blog.csdn.net/tteaonly/article/details/7279130
0. 起因
VLC最近出了2.0版本,决定今年深入掌握之,从分析代码开始,以此为备忘。
1. 概述
VLC多媒体框架的优点是:1.系统更加紧凑、高效;2.跨平台支持好,特别是桌面平台(包括Windows、Mac);
3. 编译系统完善,很容易可以构造出支持Windows,Linux的版本;4. 社区活跃,长期技术更新支持有保证。
整个VLC是以libvlc和libvlccore以及第三方插件组成,前端是独立的。据悉VLC C源码是黑客级别,本人看了多
眼之后,深以为然,包括有:类对象架构,观察者模式,插件管理系统等值得学习的代码。另外一方面,整个代
码要消化和理解也是一件不容易的事情。而且由于历史原因,整个VLC代码到处充满了垃圾和无用的代码,估计
清理起来也非常麻烦。
2. 目录说明 ( 以 vlc-2.0.0 为准)
- include/ libvlccore 库的头文件,编写自己的插件也是需要包含这里
- include/vlc libVLC头文件,如果仅仅使用libvlc开发,需要包含这里
- bin vlc程序代码,即原生GUI前端程序代码
- lib libVLC接口实现代码
- compat 跨 OS 代码
- contrib 第三方库的针对VLC的patch以及编译脚本
- extras 一些不太常用的辅助工具以及脚本
- modules 将各种第三方库封装为VLC的插件,按目录区分功能,如demux,video_filter等等
- src libvlccore实现,是vlc架构最重要部分
主要需要重点学习和关注的是:lib src两个目录之下的代码,这个两个目录也是整个vlc项目的核心。
3. 核心对象
使用libVLC构建一个最简单的播放器只需要调用下面间的API
- _vlcinstance = <strong>libvlc_new</strong>(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args);
- _mp = <strong>libvlc_media_player_new</strong> (_vlcinstance);
- libvlc_media_player_set_xwindow (_mp, windid );
- _msource = libvlc_media_new_location(_vlcinstance, "./demo.mp4");
- <strong>libvlc_media_player_set_media</strong> (_mp, _msource);
- <strong>ibvlc_media_player_play</strong> (_mp);
首先通过libvlc_new构造一个全局的instance对象,这个指针可以看作VLC context的handler. 整个VLC对象使用
XXX_new , XXX_release, XXX_retain 三个函数来管理对象的创建销毁以及引用,针对每个对象使用ref_count记录
指针引用次数,这样可以调用XXX_release函数多次,在最后一次进行真正的资源释放工作。 libvlc_instance_t 对
象组成如下,包括两个核心功能的顶层指针(核心对象一个是管理播放,一个是管理流媒体服务)。
libvlc_int_t *p_libvlc_int; |
---|
libvlc_vlm_t libvlc_vlm; |
unsigned ref_count; vlc_mutex_t instance_lock; |
为了完成播放人物还需libvlc_media_player_t 以及 libvlc_media_t 两个对象,这个两个对象都是从libvlc_instance对象
创建,其中libvlc_media_t封装了多媒体对象,可以是一个文件,一个URL或者一个媒介(如DVD)。 libvlc_media_player
对象则封装播放相管内容。
首先看看 libvlc_media_t 对象,主要组成如下:
//指向顶层指针
int i_refcount;
libvlc_instance_t *p_libvlc_instance;
|
---|
//播放对象描述 input_item_t *p_input_item; libvlc_media_list_t *p_subitems; void *p_user_data; |
//控制变量 libvlc_event_manager_t * p_event_manager; vlc_cond_t parsed_cond; vlc_mutex_t parsed_lock; |
//内置变量 bool is_parsed; bool has_asked_preparse; |
接下来就是最重要libvlc_player对象的组成了:
int i_refcount; libvlc_instance_t * p_libvlc_instance; vlc_mutex_t object_lock; |
libvlc_media_t * p_md; libvlc_event_manager_t * p_event_manager; |
struct { input_thread_t *p_thread; input_resource_t *p_resource; vlc_mutex_t lock; } input; |
其中最最重要的就是这个 struct input结构体,几乎所有重要的内容都在这个结构体内部,是理解整个VLC的核心,VLC内
主要的对象Access, Stream, Demuxer, Decoder, Vout, Aout全部都包含在input_thread, input_resource内。
linux目录结构详细介绍
目录1、树状目录结构图2、/目录3、/etc/目录4、/usr/目录5、/var/目录6、/proc/目录7、/dev/目录 该文章主要来自于网络进行整理。目录结构参考地址:http://www.hudong.com/wiki/linux%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84http://linux.ccidnet.com/art/3067/20... 查看详情
微擎目录结构介绍
...├─addons…………………………………………【模块安装目录】(意为附加组件)│├─business……………………………………模块的名称(示例)││├─images建议css文件也放此目录.││├─template模板目录│││├─mobileAPP端模板... 查看详情
vue学习笔记——目录结构介绍
1.初始目录结构如下: 2.目录结构介绍目录/文件说明build最终发布的代码存放位置。config配置目录,包括端口号等。我们初学可以使用默认的。node_modulesnpm加载的项目依赖模块src这里是我们要开发的目录,基本上要做的... 查看详情
basecms系列文章:项目目录结构介绍
一、目录结构截图 二、目录结构说明-documents 存放项目相关的文档文件-api api数据接口目录-assets 资源文件目录-components 组件存放目-mixins ... 查看详情
crosscompilevlc播放器
...ors.neusoft.edu.cn/videolan/vlc/2.2.6/vlc-2.2.6.tar.xz 解压,进入目录。 然后 设置ffmpeg路径 ,上一章 查看详情
linux系统目录结构介绍(代码片段)
linux目录:一切从“根”开始,“/”是所有目录的起点(定点)linux每个目录可以挂载在不同的设备(磁盘)上。在逻辑上所有目录(包括目录下的子目录)都在最高级别的目录“/”下,根(“/”)... 查看详情
z平台-源码包结构介绍
...回Z平台-帮助文档-首页】 本章节介绍Z平台源代码包结构目录总体结构java源码结构配置文件结构前端文件结构总体结构src/main/java【 java源码目录】src/main/resources【配置文件目录】src/main/webapp【Web资源文件目录】java源码结构 ... 查看详情
系统目录结构以及日常使用的命令介绍
系统目录结构ls列出系统目录或者文件的root用户家目录是在根下/root下面普通用户家目录是在/home/etc配置文件目录/dev设备文件目录/boot启动文件目录/home用户家目录/lib库文件目录、/sbinroot用的命令/bin普通用户用的命令放置系统命... 查看详情
vue目录结构及简单的开发介绍
熟悉vue项目的目录结构,在一定程度上能提高我的开发效率及查找文件的速度。这里比较推荐使用VScode编译器,HBuild-x,webstorm等编译器相比之下逊色不少,用过的就知道有多香。目录Vue.js目录结构 目录说明VUE入门基本操作Vue.... 查看详情
magento学习第一课——目录结构介绍
Magento学习第一课——目录结构介绍一.Magento为何强大 Magento是在Zend框架基础上建立起来的,这点保证了代码的安全性及稳定性。选择Zend的原因有很多,但是最基本的是因为zend框架提供了面向对象的代码库并且... 查看详情
03-目录结构
目录结构作者:矮哥归档:学习笔记2017/1/6目录第1章linux系统沐目录结构的基本特点介绍...11.1挂载光盘和卸载光盘...11.2小结...3第2章目录的介绍...32.1小结:重要目录回顾...5第3章/etc/重要目录里的重点(了解)...63.1/etc/sysconfig/net... 查看详情
大数据必学java基础(一百二十一):maven项目结构介绍
文章目录Maven项目结构介绍一、标准目录结构二、结构图Maven项目结构介绍一、标准目录结构 查看详情
大数据必学java基础(一百二十一):maven项目结构介绍
文章目录Maven项目结构介绍一、标准目录结构二、结构图Maven项目结构介绍一、标准目录结构 查看详情
epub电子书--目录结构介绍
epub电子书简介 epub全称为ElectronicPublication的缩写,意为:电子出版,epub于2007年9月成为国际数位出版论坛(IDPF)的正式标准,以取代旧的开放OpeneBook电子书标准,epub这种格式kindel目前不支持,必须用相应的软件打开,... 查看详情
linux基础篇——linux操作系统目录结构运行级别介绍
目录一、Linux系统目录结构介绍二、Linux操作系统运行级别1.级别切换2.指定运行级别一、Linux系统目录结构介绍 Linux的文件系统是采用层级形式的树状目录结构,最上层为根目录“/”,然后在根目录下创建其他... 查看详情
springboot主类及目录结构介绍
SpringBoot与传统项目最大的区别是,传统项目都是打成WAR包部署到服务器上面,需要额外的Servlet容器,而SpringBoot则可以直接打成jar包,并内置集成了Servlet容器,通过命令java-jarxx.jar则可以直接运行,不需要独立的Servlet容器。打... 查看详情
[linux]文件系统和目录结构详解
...键,通配符等等下篇文章会写都文件的具体操作命令目录一、linux文件结构介绍1、Linux目录结构的特点2.Linux目录结构常见:补充:二、Linux文件系统介绍1.索引介绍:2.Linux链接介绍1.硬链接:2.软连接(符号... 查看详情
linux下的目录结构(代码片段)
文章目录Linux系统的目录结构Linux下主要目录介绍相对路径和绝对路径Linux命令提示符解析Linux系统的目录结构Linux系统的目录结构是一个倒立的树状结构,根目录用/表示,对比windows目录结构理解linux的目录结构。Linux下主要目... 查看详情