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. 【COCOS2DX-对28游戏开发】 Cocos2d-x-3c 道路设计 CocosBase CocosNet CocosWidget

    原文链接:http://blog.csdn.net/cocosviva/article/details/18970717 另一个比較不错的cocos2dx扩展库:https://github.com/ ...

  2. css-布局1-基本属性

    <!DOCTYPE html>CSS4-布局1-基本属性 属性:displayvisibilityfloatclear HTML元素类型:行内元素,块级元素 块级元素:最大的区别:换行行内 ...

  3. Chrome 开发者工具详解(2):Network 面板

    面板上包含了Elements面板.Console面板.Sources面板.Network面板. Timeline面板.Profiles面板.Application面板.Security面板.Audit ...

  4. ext.net中ComboBox空间实现模糊查询

    ComboBox中的属性添加Mode="Local"可以实现第一个字的模糊查询但是搜索中间的字无法实现 现提供一下方法使用正则表达式实现全模糊查询 <ext:ComboBox ...

  5. 返回某个界面——nav

     NSInteger index=[[self.navigationController viewControllers]indexOfObject:self];  [self.navigationC ...

  6. 仿QQ好友列表界面的实现

    TableView有2种style:UITableViewStylePlain 和 UITableViewStyleGrouped. 但是QQ好友列表的tableView给人的感觉似乎是2个style ...

  7. git configuration

    git的配置文件由section名和变量名组成: [user] name = abc emial = example.com []里面的user就是section名,section只能由字母,数字,- ...

  8. 利用radio实现纯css选项卡切换

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtIAAABCCAIAAAD18aaXAAAG70lEQVR4nO3dO5KrPBCGYRY0VV4OEX

  9. 最大连续子序列(HDU 1231 DP)

    最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  10. SpringMVC原理+流程图

    SpringMVC工作原理:整个处理过程从一个HTTP请求开始:1)DispatcherServlet接收到请求后,根据对应配置文件中配置的处理器映射,找到对应的处理器映射项(HandlerMappi ...