现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

VLC库运行核简介

2013-07-12 06:40 工业·编程 ⁄ 共 2524字 ⁄ 字号 暂无评论

VLC 媒体播放器的运行核称之为libVLCcor.

libVLCcore 管理线程,模块(编解码器,解复用器等), 模块功能层,时钟,播放清单和VLC的低层控制.例如, 音频和视频同步管理。在它的上层,是libVLC,通过该模块,外部的应用开发者可以使用运行库的所有功能。功能模块与livVLCcore关联和交互。

功能模块按照libVLCcore要求设计,而外部应用程序按照libVLC要求设计.

VLC管道和模块化

VLC一个主要的概念是 "模块化".

VLC实际上是一个完整的多媒体框架(有点像DirectShow或 GStreamer),它可以根据需要动态装载插件模块。

该核心框架用来在媒体数据处理过程中,连接各个模块,从输入(文件,网络流)到输出(音频,视频显示或播放,或输出到网络)。VLC使用模块来做实际的各种工作(如复用,解码,过滤,输出)。(请参考VLC装载机制).

每个模块提供不同的功能,这些功能可能满足一些特别的要求或在特定的环境下使用。另外,VLC的可移植性,可以为不同系统平台编写可以音视频输出模块,甚至用户接口模块。

插件模块(plugins)利用函数可以动态装载,这些函数定义在src/modules.c 文件里面。

利用libVLC,功能模块也可以直接在应用系统里面开发,例如有些操作系统不支持动态装载功能。这些模块可以称之内置件(buitlins)

在源代码里面,模块通常放在modules目录下的子目录。

线程管理

VLC为多线程。

使用单线程方法复杂度比较高。解码重入和调度为主要原因(如解码和输出必须分开,否则,不能保证一帧可以在指定时间内显示)。

多进程方法也没有采用。多进程解码意味着更多系统开销,而且进程间通信也是非常困难。

VLC线程结构按照POSIX (pthread)线程进行封装。然而,为了便于移植,VLC没有直接使用pthread函数,而是采用一套定制的API。

线程(vlc_thread_t)

·       vlc_clone()创建线程.

·       vlc_join() 等待线程终止,并释放占用的资源。

互斥锁 (vlc_mutex_t)

·       vlc_mutex_init() 创建非递归锁.

·       vlc_mutex_init_recursive() 创建递归锁(不建议).

·       vlc_mutex_lock() 锁住,如需要,可以等待.

·       vlc_mutex_trylock() 尝试锁定,(如果还没有锁定,就进行锁定,否则,返回一个错误)

·       vlc_mutex_unlock() 解锁.

·       vlc_mutex_destroy() 销毁锁。

条件变量 (vlc_cond_t)

·       vlc_cond_init() 创建一个条件变量,利用mdate()时钟记时。

·       vlc_cond_init_daytime() 创建一个条件变量,使用实时时钟记时。

·       vlc_cond_signal() 为等待的线程产生一个信号。

·       vlc_cond_broadcast()为多个等待的线程产生一个信号。

·       vlc_cond_wait() 等待一个条件变量产生信号。

·       vlc_cond_timedwait() 在指定的时间内,等待条件变量产生信号。

·       vlc_cond_destroy() 销毁条件变量。

其它

VLC 也提供一些同步对象的抽象。瘦读写锁,线程内变量。

原子变量

原子变量是很小的值,这些值可以在没有锁定的情况下,进行操作。了解更多支持的操作,请参考include/vlc_atomic.h。

同步

另一个VLC关键的特点是解码和播放为异步的:解码线程进行解码,音频输出或视频输出线程进行播放。 这个设计目标保证音频或视频帧在正确的时间里面播放,而不会阻塞解码线程。这样就在用户接口,输入,解码,输出模块之间形成一个复杂的通信结构。

几个输入和输出线程允许同时读写多个文件(尽管当前的用户接口不允许这么做)。 这样意味着不可重入的库需要使用全局锁以后才能使用。

播放时间戳在媒体流的系统层,并传送给解码器,这样所有的采样帧相应进行播放记时。输出层根据这个时间进行播放。 时间为毫秒单位,为1970/1/1以来的毫秒数。 mtime_t类型为 64位有符号整数。

当前的时间使用mdate()函数获取。执行线程在等待一定时间后进行播放。

警告

请记住,如果需要进行特别的处理(如  色度转换 ),线程应该比播放时间稍微早一点进行播放。.如在 modules/codec/libmpeg2.c里面, 平均解码时间的跟踪可以保证图片不会解码太迟。

运行库源代码详细介绍

所有 libVLCcore 源代码文件在src目录下的子目录里面:

·       audio_output/: 初始化音频混合器,即找到正确的播放频率,然后重新将从解码器传送过来的音频帧进行采样。

·       config/: 从命令行和配置文件装载配置信息,提供函数给模块进行读写。 

·       control/: 控制livVLCcore的行为,如播放/暂停,音量管理,满屏,LOG输出等等

·       extras/: 主要为面向平台的代码

·       input/: 打开输入模块,读取数据包,解析数据包,将非结构化的单元流传送给解码模块。

·       modules/: 模块管理

·       interface/: 用户接口代码,如按键,设备弹出。

·       misc/: 为分类的实用函数,如线程管理,消息队列,CPU检测,对象查找系统,面向平台的代码

·       network/: 网络接口 (套接字管理,网络错误等)

·       osd/:屏幕显示操作

·       playlist/: 管理播放清单接口,如停止,播放,下一曲,随机播放。

·       stream_output/: 将音频/视频流输出到网络

·       test/: libVLC 本身测试代码

·       text/: 字符集

·       video_output/: 初始化视频显示,获取所有图片,需要的化将他们转换成其他格式如 (YUV到 RGB),然后显示。

给我留言

留言无头像?