抱歉,你查看的文章不存在

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

开头说三件事:

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 按照功能大致分类

原文发布于微信公众号 - 何俊林(DriodDeveloper)

原文发表时间:2017-07-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

码农突围

0 篇文章93 人订阅

相关文章

来自专栏钱曙光的专栏

一周极客热文:2014最受欢迎的10种编程语言

从10个重要的信息源(包括IEEE Xplore,谷歌和GitHub)中选取了12个重点指标,评选出了2014最流行的编程语言。(具体排名请看上图) 下面是小编...

20750
来自专栏刘望舒

开源项目源码阅读指北

作为一个程序员,阅读大牛们优秀的开源项目源码是一个提升个人编程能力、扩展思维的重要途径。在实际工作中,相信并不是所有人接手的项目代码都很优雅和优秀,而且很大可能...

12620
来自专栏Java学习网

你需要每天写代码吗?

你需要每天写代码吗? 就像运动员每天锻炼一样,每天练习写代码可以成就更优秀的你。 最近我看过的博客,基本上每篇都有提到,“你需要每天写代码”。什么主题不重要,关...

29770
来自专栏腾讯大讲堂的专栏

如何为红包提供稳定支付体验

腾讯大讲堂隆重推出【100亿次的挑战】系列海量服务之道2.0讲座,覆盖技术、产品、项目管理、支撑、支付5个维度。第一场【技术篇】3000名鹅厂员工参与,场面火爆...

256100
来自专栏后端技术探索

12306系统高并发探讨

铁道部的12306网上购票系统着实“火”了一把,在中国境内可谓是无人不知无人不晓,曾有人在网上戏称12306为“史上最牛电商”。12306购票系统的初衷是系统通...

93720
来自专栏知晓程序

除了聊天,我们还能在微信群里,干哪些正经事?

今天,就不妨收下「知晓程序」精选的 5 个群工具小程序,让你在微信群中组织活动、投票、协作都不费吹灰之力。

9110
来自专栏斑斓

回眸Unix设计哲学

我觉得一切伟大的设计似乎都是不朽的,例如矗立在雅典卫城石灰岩山岗上的帕特农神庙,米开朗基罗刀工斧凿下充满雄性魅力的大卫,毕达哥拉斯对勾股定理的演绎证明,乱臣贼子...

34360
来自专栏区块链

每天有数百人搜索App破解,开发者该怎么保护自己的手机应用呢?

百度上搜索“App破解”,会出现1210万条结果。从App破解的入门知识到逆向工具下载,从破解技术视频到全图文教程。 随着黑客技术的普及化平民化,App——智能...

39550
来自专栏SAP梦心的SAP分享

【域控管理】域控的必要性

题记:本来域控这玩意儿跟我没有半毛钱关系,毕竟我是做应用类的,域控纯属系统管理范畴。 以前在TTE和LDS,公司里有使用域控,几年来以使用者的角度在观察,觉得这...

27750
来自专栏北京马哥教育

亲自动手写一个Python库(一)

引子 学习编程以来,接触过Basic,C/C++,Swift,JavaScript和Python五种语言,其中最爱的当属Python,简洁的语法和丰富的库让我...

488100

扫码关注云+社区

领取腾讯云代金券