VLC学习笔记(1): 概述

以前看过VLC的代码,学习过VLC相关的知识,现将其记下来以作备忘

注:本记录是以VLC2.0作为参考,如有出入,请先核对版本号

一、简介

VLC多媒体播放器(最初命名为VideoLAN客户端)是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影音光盘及各类流式协议。它也能作为unicast或 multicast的流式服务器在IPv4或 IPv6的高速网络连接下使用。它融合了FFmpeg项目的解码器与libdvdcss程序库,使其有播放多媒

体文件及加密DVD影碟的功能。

二、特性

简单、快速、强大的媒体播放器。
可播放任何介质:文件、光盘、摄像头、设备及流媒体。
可播放大多数格式,而无需安装编解码器包,其内已经包含MPEG-2, DivX, H.264, MKV, WebM, WMV, MP3… 等诸多library。
可在所有平台运行: Windows, Linux, Mac OS X, Unix…
完全免费,无间谍软件,无广告,无跟踪用户的行为。
可对媒体进行转换与串流。
详细Features见:

http://www.videolan.org/vlc/features.html

三、架构

3.1 整体框架

这里写图片描述

  • libVLCcore: libvlc的核心,抽象出了一个libvlc_instance_t 对象。modules的装载/
    卸载机制。还有一套多媒体相关的操作接口。如:input, multiplexing,
    demultiplexing, audio output, video output.

  • Modules: modules提供了具体的功能。根据编译配置module数量200-400之间。
    根据功能可分类为:输入输出(文件、网络、cd)、编解码(mp3,h254)、
    模块化的GUI(基于qt、mac)

  • External libraries: 开源软件都秉承着不要重复造轮子的思想。所以vlc本身也依赖了大
    量外部开源库,如知名的ffmpeg、qt、live555等。

  • VLC main: player的main。初始化libVLC并加载用户界面,注意vlc的用户界面也是
    以module的形式存在。基于libvlc我们就能自己开发自己的播放器了。

3.2 分层框架结构

这里写图片描述

3.3 modules 按照功能大致分类

这里写图片描述

3.4 源代码目录结构

这里写图片描述

3.5 模块关系

这里主要是关于模块的关系,控制接口以及线程再整个框架中的分布情况(即哪些地方使用到了线程)
这里写图片描述
上图标有红色圆圈的模块就表示其中有使用到线程

3.6 抽象结构

以下,是我按照对VLC的理解抽象出的VLC的结构图
这里写图片描述

上图中,每一个虚线框起来的,都可以认定为是一个较大的模组(由多个模块组成)

四、运行流程

ELF (Linux下可执行文件的格式) 先被动态加载,然后主线程就变成了接口线程并且在src/interface/interface.c中开始。它执行下列步骤:

  1. cpu探测:什么型号?所有能力(MMX,MMXEXT,3DNow,AltiVec等等)
  2. 消息接口初始化;
  3. 命令行选项解析组件
  4. 创建播放列表
  5. 仓库初始化
  6. 加载所有内置和动态组件
  7. 打开接口
  8. 安装信号处理器:SIGHUP,SIGINT和SIGQUIT(捕获一个,忽略后来的并退出)。
  9. 派生音频输出线程;
  10. 派生视频输出线程;
  11. 主循环:事件管理;

下图为具体的流程图
这里写图片描述

猜你喜欢

转载自blog.csdn.net/xuanwolanxue/article/details/68071242