VLC框架总结(一)初识庐山真面目

3,841 阅读7分钟

开头说三件事:

1、周末送书已全部寄出。获取者注意查收,考虑到顺丰着实贵了。发的是百世快递,已都帮大家付了邮费。北京市内6块,外省都是10块。觉得这快递价格还是挺实惠的。如果有要转账给我的,直接下面随意赞赏下就行了。

2、今天我老爹生日。老爹平时都有打赏我这个公众号,也一直在背后默默支持我。顺再祝他生日快乐。

3、最近我老家归阳古镇,被洪水围困。淹没到街道一楼,我家的很多东西也是损失惨重。有加我微信的,看我朋友圈这两天动态频繁。也是基于此。洪水乃天灾。没办法完全避免,只能减少损失,确保生命财产安全。也上了新华社图片头条。我们镇变成了别人所说的严重受灾区。上一张图


在多媒体中,经常有问到一个问题,FFmpeg和VLC的关系,首先FFmpeg是跨平台解决方案,是一个工具载体,从FFmpeg结构上来说,它不是真正意义上FrameWork,通常作为FrameWork,具有几个要素,举例,Android中有很多FrameWork,这些都会对外提供统一机制,方便开发者快速上手,如一个MediaPlayer,从创建到setDataSource,Prepare,Start,就可以播放一个音视频。对于VLC来说,就是属于一套播放的FrameWork,当然它不仅是一套FrameWork。FFmpeg只是它其中的一部分。

1

VideoLan简介

官网:http://www.videolan.org/

VideoLan组成

Videolan有以下两部分组成:

  • VLC:一个最主要的部分,它可以播放各种类型的媒体文件和流媒体文件,并且可以创造媒体流并保存成各种格式的媒体文件,这些文件的质量要比没保存前的件好。videolan作为客户端可以播放本地文件,httP://,rtsp://。

  • VLS:是一种流服务器,专门用来解决流的各种问题,它也具有一些VLC的特征。videolan作为服务器可以输出httP,rtP,rtsp的流。

VLC优点

VLC是一种跨平台的媒体播放器和流媒体服务器,最初为videolan的客户端,它是一种非常简便的多媒体播放器,它可以用来播放各种各样的音视频的格式文件(MPEG-1、MPEG- 2、MPEG- 4、DivX、WMV、mp3、OGG、Vorbis、AC3、AAC等等)流媒体协议,最具特色的功能是可以边下载边观看Divx媒体文件,并可以播放不完全的AVI文件。并且支持界面的更改。VLC支持多种的操作系统,linux(rh9,Debian,Mandrake,Gentoo),BSD,windows,Mac OS X,Be OS,Solaris等等。支持带菜单的VCD,SVCD,和DVD,数字卫星频道、数字地球电视频道(digital terrestrial television channels),在这些操作系统下通过宽带IPv4、IPv6网络播放线上影片。此软件开发项目是由法国学生所发起的,参与者来自于世界各地,设计了多平台的支持,可以用于播放网络流媒体及本机多媒体文件,特别是它能直接播放未下载完整的多媒体文件。

下图表示出了VideoLan的解决方案:

VideoLan Client是VideoLan项目(一个完整的MPEG-2客户/服务器解决方案)的一个组成部分。不过VideoLan Client也可以作为一个独立的程序来播放来自硬盘或者DVDROM的MPEG数据流。它目前支持GTK+、GNOME、KDE和QT,并且可以使用X11、Xvideo、SDL或者DirectX作为视频输出。对于声音,VideoLan Client支持OSS、ALSA和ESD。要访问DVD,VideoLan Client使用的是Libdvdcss库。它是一个简单的专为DVD访问设计的库。它可以像访问块设备一样访问DVD,而不用考虑解密问题。

2

播放引擎架构

VLC虽然是用c代码实现的,但是在代码编写上遵循了面向对象原则,易修改和扩展。不过实话实说,结构之间的关联太过于频繁,理解上还是不太容易。如果能够改成c++那是最好不过了。


对于媒体播放器,肯定离不开解复用,解码,音频和视频输出这四个模块,不管是DirectShow,还是VLC,或者自己要开发一个播放器,都是如此。媒体播放器的差异主要存在于模块之间的通信方式,界面消息处理上。DirectShow使用Filter形成Graph形式,可以自由搭建想要的数据处理流程,能够实现定制自己要求的播放器,但是系统占用资源较多,实时性能上要差一些;VLC结构上更为紧凑,不能够自由组合想要的处理流程,但是实时效率更高,系统占用率上更低。


播放引擎架构,主要有以下活动线程,解复用线程,音频和视频解码线程,视频处理线程,音频和视频播放线程。

  • 解复用线程:实现对音频和视频的分离,将压缩包送入相应的解码线程。另外在VLC中,解复用线程空闲时候用于处理播放控制消息,这个做的比较巧妙,但是当视频数据较大时候,比如播放高清素材时候,可能响应界面就不太及时了。

  • 解码线程:音频和视频线程分别调用相应的解码器完成数据解码。

  • 视频处理线程:完成视频画面的处理,譬如亮度调节,对比度调节,反交织。还有上字幕等等。另外,视频处理线程还处理视频设置的界面消息,包括播放的时候加载字幕等等。音频其实也有处理的,包括音量调节,混音,但是这些耗时都不大,所以在解码送到播放过程中直接完成了,并不需要单独线程执行。

  • 音视频播放线程:根据时间戳分别负责音频和视频的播放。

3

module管理机制

vlc从整体框架上来说,就是设计了一套module管理机制,将功能分类并抽象成modules。例如播放器相关的如demux decoder access output这些都成了vlc的modules。新添加一个功能(新的媒体容器格式demux、新的解码器、新的编码器)只要遵循这套机制,自己完成这个子module就可以了。所以说vlc依赖的是这些modules。没有modules其实啥也干不了。




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

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

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

VLC main:player的main。初始化libVLC 并加载用户界面,注意vlc的用户界面也是已module的形式存在。

基于libvlc 我们就能自己开发自己的播放器了。


modules 按照功能大致分类

第一时间获得 不止个人原创 android/音视频技术干货,问题深度总结,FrameWork源码解析,插件化研究,FFmpeg研究,直播技术,最新开源项目推荐,还有更多职场思考 ,欢迎关注我的微信公众号,扫一扫下方二维码或者长按识别二维码