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. 编程算法 - 圆圈中最后剩下的数字(递推公式) 代码(C++)

    圆圈中最后剩下的数字(递推公式) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 0,1...,n-1这n个数字排成一个圆圈, 从数字0開始 ...

  2. zabbix-web界面图形中文乱码解决方法

    1.搜索windows-server X86-64机器上C:/windows/fonts的simkai.tts文件,windows7下有时候不行. 2.把它拷贝到zabbix的web端的fonts目录 ...

  3. HTML - Textarea - 空格的问题解决方式

    第一种方式: <textarea name="textareaname" rows="XX" cols="XX" ></t ...

  4. asp.net mvc输出自定义404等错误页面,非302跳转

      朋友问到一个问题,如何输出自定义错误页面,不使用302跳转.当前页面地址不能改变. 还要执行一些代码等,生成一些错误信息,方便用户提交反馈. 500错误,mvc框架已经有现成解决方法: filte ...

  5. Code Complete 读后总结和新的扩展阅读计划

    Code Complete 读后总结和新的扩展阅读计划 用了一年时间终于将代码大全读完了,在这里做一个简单的总结,并安排下一阶段的扩展阅读计划. 1.选择代码大全作为我程序员职业入门的第一本书,我认为 ...

  6. VS2015预览版中的C#6.0 新功能(二)

    VS2015预览版中的C#6.0 新功能(一) VS2015预览版中的C#6.0 新功能(三) 自动属性的增强 只读自动属性 以前自动属性必须同时提供setter和getter方法,因而只读属性只能通 ...

  7. (原)ubuntu上安装qt

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5652429.html 参考网址: http://doc.qt.io/qt-4.8/install-x1 ...

  8. spring3+hibernate3+(dbcp+oracle+拦截器事务配置)整合(一)

    1.applicationContext-base.xml文件 <?xml version="1.0" encoding="UTF-8"?>< ...

  9. PHP PSR-3 日志接口规范 (中文版)

    日志接口规范 本文制定了日志类库的通用接口规范. 本规范的主要目的,是为了让日志类库以简单通用的方式,通过接收一个 Psr\Log\LoggerInterface 对象,来记录日志信息. 框架以及CM ...

  10. centos6.4x64安装vncserver

    参考文章:http://blog.csdn.net/mchdba/article/details/43058849 主要是远程安装oracle11g需要用到这个东西: 进入系统依次执行下列命令: #查 ...