vlc/ffmepg/mplayer/gstreamer/openmax/mpc/ffdshow/directshow
载自:http://www.cnblogs.com/mr-nop/archive/2013/05/17/3083819.html
修bug修得头疼,看看自己的博客,坑挖了一堆,出来混,迟早是要还的,这里先补一个。
刚开始看多媒体这块时,总是发现有新框架,新平台,新名词弄得云山雾绕,为了避免重复google/wiki,我尝试做个总节吧。
之前写过codec与container的区别,这里就不多说了,更近应用层的东西。
这些东西大概有:vlc/ffmepg/mplayer/gstreamer/openmax/mpc/ffdshow/directshow...
这些软件,所涉及的层面和针对的应用场景,系统各不相同,按层次分别说一下。
一.播放器层次
这个层次上,是直接可以用的软件,已经做完了一切工作,如果我们需要用他们,是不需要写一行代码的,编译通过就可以拿来使用了,对于国内这些山寨公司来说,基本就是拿来就可以骗钱的档次了。
包括 vlc/mplayer/mpc,这里我只是简介一下,我就不费劲从维基和官网复制东西了,貌似网上其他文章也都是从这两个地方复制了点东西,毫无营养。
其中vlc与mplayer都是跨平台的,都是起源于linux界的大佬,后来逐渐发展到跨平台了。
vlc,插件机制的播放器,非常灵活,但是总觉得这货速度太慢,不过可移植平台比较多,ios/android/win8。。。。等等都有他的身影。
官网:http://www.videolan.org/
维基:http://zh.wikipedia.org/wiki/Vlc
mplayer,单线程,状态机机制的播放器,比较古老,代码有些凌乱。
官网:http://www.mplayerhq.hu/design7/news.html
维基: https://zh.wikipedia.org/wiki/MPlayer
mpc,是windows平台上的开源播放器,基于filter机制,像qq影音/射手播放器/百度影音/.......一系列windows上的播放器,都是脱胎于这个软件。
这套软件不太爽的一点是,只能在windows上运行,不能移植到其他平台,原因是他的使用了windows的directshow框架。
官网:http://mpc-hc.org/
维基:http://zh.wikipedia.org/wiki/Media_Player_Classic
这里有篇文章,是讲述这些播放器的架构与应用的,非常经典。来自射手播放器的博客
链接:http://blog.splayer.org/index.php/2010/03/%E5%AA%92%E4%BD%93%E6%92%AD%E6%94%BE%E4%B8%89%E5%A4%A7%E5%BA%95%E5%B1%82%E6%9E%B6%E6%9E%84%E7%AE%80%E6%9E%90/
二.框架层次
主要包括gsteamer/directshow/openmax
1.gstreamer是基于gnome的基础类库gobject所写的一套,开源多媒体框架。主要针对于linux,当然windows上也可以使用。
基本设计思路类似于directshow,区别只是
gstreamer基本部件是component(组件,demux/codec/access/等,都可以当成一个组件),对directshow来说,对应的概念是filter。
gstreamer各个组件的链接是pipe(管道,组件间传递数据,通信的机制),对directshow来说,对应的概念是pin。
对于这个框架一些比较典型应用就是meego/tizen手机平台上的媒体框架。
2.directshow是微软的推出的windows平台上的媒体框架
详细请戳:http://zh.wikipedia.org/wiki/DirectShow
应用比较广泛,像视频监控上位机,也就是pc端,基本上都得用这个了。另外windows平台的播放器,也基本遵行这个框架的一些概念空间。
xvid/x264两个组织,都把自己的算法库给封装了一套filter,方便兼容到这个平台上。
3.openmax
层次比较gstreamer与directshow低一些,主要用来封装解码库,基本的概念空间也是组件,不过通信方式叫什么tunels(隧道)
典型应用就是android手机平台了,呵呵。(好牛b啊)
对这些框架来说,都是为了方便开发应用准备的,与第一个层次区别就是,第一个层次就是一个单纯的应用,而这个层次,只是提供了一些机制,你可以用这些机制做任何你想要的东西
另外觉得这些开源的家伙太能捣腾了,基本类似的概念空间组合来组合去。让我们这些小菜学得学得头大。
三.库
首先要明确的是,库与框架的区别。
一般来说,框架只用写一些回调函数,应用就能跑起来,类似于mfc的button响应,android的oncreate之流。
库,只是一些功能,你需要自己调用起这些功能。
(一个简单的区别方法是,你用不用自己写main函数,呵呵,相当不科学,不过一般是准确的)
好吧,我觉得我也没说清,呵呵。
ffmpeg/ffshow基本属于这个概念层次的。
ffmpeg是上面介绍的东西的老祖宗,软件/框架,都是依赖这个库来实做的,ffmpeg提供了万能解复用,解码功能,他们只是调用这个库,进行自己需要的封装。
ffshow与ffmpeg的关系更暧昧。对directshow的filter概念空间来说,很多filter要自己写,所以有人就站出来做了这事,开源了,ffshow就是这样的东西。
一句话,用ffmpeg与了一堆filter.