VLC采用多线程并行解码架构,线程之间通过单独的一个线程控制所有线程的状态,解码器采用filter模式.组织方式为模块架构


模块简述:
libvlc                  
是VLC的核心部分。它是一个提供接口的库,比如给VLC提供功能接口:流的接入,音频视频的输出,插件管理,线程系统。

interface           包含与用户交互的按键和设备弹出。
Playlist               管理播放列表的交互,如停止,播放,下一个,或者随机播放。
Video_output    初始化video显示器,从解码器得到所有的图片和子图片。随意将他们转换为其他的格式并且播放(如YUV到RGB)
Stream_output  类似Audio_output
Misc                    是被其他部分使用的杂项,如线程系统,消息队列,CPU探测,对象查询系统,或者特定平台代码。
 

运行时架构:步骤

1.main负责初始化所有结构体,全局资源,派生出:
--->   2.playlist,初始化和管理播放器的播放列表。
--->   3.一个中间线程,
--->   4.SigThread控制播放器的播放暂停等,管理最终的程序退出,在接到信号(待定)后执行libvlc_Quit()销毁所有与libvlc相关的线程和资源.。播放完毕后,音视频的输出线程先退出(可能由他们自己管理自己,完成后自动退出 )
      接着渲染(或者驱动)线程退出。2个视频解码渲染,1个音频解码渲染。
        ( 7-Vout,    9-video_output,   10-xcb.c/Thread()
                                                    11-xdg.c/Thread()
            8-Aout,    12-audio_output/alsa.c/ALSAThread()循环调用ALSAFill(p_aout))
--->  5.RunInterface: setups necessary data and give control to the interface
     执行Run(),控制所有线程开始,其他线程得到消息之后并行运行。 Run()函数中ReadCommand( p_intf, p_buffer, &i_size );解析外部命令。这里是一个命令模式
 
 
线程2 派生出
 
     线程6.input/Run(),该线程阻塞在while( !LoopInput( p_playlist )
) vlc_cond_wait( &p_sys->signal, &p_sys->lock ); 上。并且通过
LoopRequest( p_playlist );循环解析播放列表,播放所有的资源。
线程6派生出:
      线程7.input/DecoderThread(),这个线程被VoutCreate函数创建,使用Ffmpeg作为解码库
      线程8.input/DecoderThread(),这个线程被audio_output/alsa.c/Open()函数创建
线程7是Video的解码线程,它派生出:
      线程9.video_output/RunThread(),这个线程作为视频解码器使用,这是它的调用栈的回溯表:
          FT_Get_Glyph () from /usr/lib/i386-linux-gnu/libfreetype.so.6
          RenderText () at freetype.c:1212
          SpuRenderText () at video_output/vout_subpictures.c:1093
          SpuRenderRegion () at video_output/vout_subpictures.c:1361
          spu_RenderSubpictures () at video_output/vout_subpictures.c:507
          vout_RenderPicture () at video_output/vout_pictures.c:383
           RunThread () at video_output/video_output.c:1148
 
       线程9派生出两个渲染器线程线程分别为:
              ---> 线程10.video_output/xcb/Thread()
              ---> 线程11.modules/misc/inhibit/xdg.c/Thread()
线程8.是音频解码线程,通过aout_outputNew创建,它派生出线程12.audio_output/alsa.c/ALSAThreade()作为音频的渲染。
 

VLC播放器架构剖析的更多相关文章

  1. iOS实现基于VLC播放器的封装效果

    前言: 在一些特定场景下,我们获取到的音视频,由于格式比较特殊,用avplayer等播放器是无法播放的,此时,我们可以借助强大的VLC播放器来处理. 原理这里不再赘述,下面我们讲一下如何添加VLC播放 ...

  2. Android VLC播放器二次开发2——CPU类型检查+界面初始化

    上一篇讲了VLC整个程序的模块划分和界面主要使用的技术,今天分析一下VLC程序初始化过程,主要是初始化界面.加载解码库的操作.今天主要分析一下org.videolan.vlc.gui.MainActi ...

  3. 使用vlc播放器做rtsp流媒体服务器

    可参考: 使用vlc播放器播放rtsp视频 web网页中使用vlc插件播放相机rtsp流视频 使用vlc进行二次开发做自己的播放器 首先需要安装vlc播放器,下载及安装步骤略 使用vlc播放器做rts ...

  4. 使用vlc播放器播放rtsp流视频

    可参考: 使用vlc播放器做rtsp服务器 web网页中使用vlc插件播放相机rtsp流视频 使用vlc进行二次开发做自己的播放器 首先需要安装vlc播放器,下载及安装步骤略 使用vlc播放器播放rt ...

  5. Android VLC播放器二次开发1——程序结构分析

    最近因为一个新项目需要一个多媒体播放器,所以需要做个视频.音频.图片方面的播放器.也查阅了不少这方面的资料,如果要从头做一个播放器工作量太大了,而且难度也很大.所以最后选择了VLC作为基础,进行二次开 ...

  6. centos7安装VLC播放器

    centos7安装VLC播放器 1.安装eple 下载地址:https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noar ...

  7. Centos 上使用mmsh协议听猫扑网络电台 VLC播放器

    Centos 上使用mmsh协议听猫扑网络电台 VLC播放器 安装CentOS已经有一段时间了,但是由于在Linux下除了学习,其他是事情都干不了.今天想闲来无事开了CentOS就想听一下歌,突然想起 ...

  8. Ubuntu安装VLC播放器

    Ubuntu安装VLC官方介绍:http://www.videolan.org/vlc/download-ubuntu.html sudo apt-get update sudo apt-get in ...

  9. Android VLC播放器二次开发3——音乐播放(歌曲列表+歌词同步滚动)

    今天讲一下对VLC播放器音频播放功能进行二次开发,讲解如何改造音乐播放相关功能.最近一直在忙着优化视频解码部分代码,因为我的视频播放器需要在一台主频比较低的机器上跑(800M主频),所以视频解码能力受 ...

随机推荐

  1. FileSystemWatcher使用方法具体解释

    FileSystemWatcher控件主要功能: 监控指定文件或文件夹的文件的创建.删除.修改.重命名等活动.能够动态地定义须要监控的文件类型及文件属性修改的类型. 1.经常使用的几个基本属性: (1 ...

  2. javascript 获取event对象

    //转载处 http://www.cnblogs.com/funlake/archive/2009/04/07/1431238.html 非常详细 先从一个简单的例子说起,一个简单的button控件如 ...

  3. 使用图片拉伸resizableImageWithCapInsets

    在仿写QQ会话的时候背景蓝色图片是拉伸而来,但是有些地方是受保护的不能拉伸 所以定义了下面的工具类中的一个方法,专门拉伸图片 UIImageResizingModeStretch:拉伸模式,通过拉伸U ...

  4. OpenCV——IplImage

    IplImage结构: typedef struct _IplImage { int nSize; /* IplImage大小 */ int ID; /* 版本 (=0)*/ int nChannel ...

  5. vs2010中出现:程序管理器匹配不正确错误

    http://bbs.csdn.net/topics/360074795 这是一篇csdn上的讨论帖,第15楼给出了正解

  6. linux学习方法之一

    相信不少想学习linux的新手们正愁不知道看什么linux学习教程好,下面小编给大家收集和整理了几点比较重要的教程,供大家学习,如需想学习更多的话,可到wdlinux学堂寻找更多教程. 1.什么是RP ...

  7. 循环与range

    Python的循环有两种,一种是for...in循环,依次把list或tuple中的每个元素迭代出来,看例子: names = ['Michael', 'Bob', 'Tracy'] for name ...

  8. 再谈php乱码问题

    在开博不久,写了一篇关于解决php乱码问题文章,php 解决乱码的通用方法,绝大部分乱码,这篇博文都可以解决,但是也有例外. 如果有人传参数给你,你根本不知道,传给你的参数到底是什么编码,这个时候该怎 ...

  9. MVC Controller 与 View 传值

    Controller 到 View 1 强类型 控制器 // GET: /Test/ public ActionResult Index() { DateTime date = DateTime.No ...

  10. Effective Java单元测试JUnit - 就是爱Java

    实作了RoleImpl class,现在要开始单元测试了,或许你会觉得奇怪,才刚做好一个class而已,它并没有商业规则,只有getter/setter与clone(),那是要测试什么呢?没错,传统上 ...