视频处理基础

来源:互联网 发布:java 金额抹零 算法 编辑:程序博客网 时间:2024/05/20 16:41

鉴于谈到视频播放好多人概念不清,本人不才,玩视频开发的,写过播放器,写过音视频处理程序,来简单讲讲,欢迎拍砖

1 、MP4,AVI,MKV  。。。。。之类,这种东西叫容器,是壳子,里面封音视频流
2、 H.264(又名AVC),MPEG4,XVID,DIVX,........     诸如此类,是视频压缩标准,也是俗称视频格式
3、 MP3,AAC,ADPCM。。。。。。。之类,是音频压缩标准,也是俗称音频格式
4、 GDI,GAPI,DirectDraw,RawFrameBuffer,这是视频显示的技术,就是解码出来后,用这个接口显示到屏幕上
5、所有播放器的播放流程,不外乎 1、解开容器,抽取音视频流  2、调用不同解码器对音频和视频流进行解码  3、解码后的图像进行处理(缩放,色彩空间转换等等,有硬件实现也有软件实现)并快速显示到屏幕上。

详解:
1、所谓容器,就是装东西的,一个视频文件,就是一个容器里面封装了视频流,音频流。播放的第一步,就是要把容器拆开,把音视频流提取出来交给解码器解码。
不要以为MP4就是MPEG4,MP4是个容器而已,里面封装的视频格式支持MPEG4系列,H.264系列,音频支持AAC;AVI容器很常见,基本上编码格式不限,就是字幕流支持不好,MKV比较牛,但是很少商业公司来玩,比AVI增加很多特性,还能挂多个字幕流。

2、视频格式大家都熟,264牛逼,画质好,有目共睹,但有的264你就是硬解不了,为啥? 因为264有标准,MainProfile,BaseLineProfile,还有Level X.X , 如果你的鸡鸡解码不了某些MP4里面封装的264,不要骂鸡鸡烂,硬件解码都有限制,PC上都如此,何况WM,要调试,看你的鸡鸡最高支持哪个Profile,那个Level,然后压片的时候就要参考这个标准,不要超过了。 不过WM而言,顶多也就BaseLine了不要想MainProfile了。 同理,DIVX,XVID,都有相关的Level,决定解码器的复杂度。所以说,硬解是有限制的,分辨率,码率,Level,Profile,都要满足要求!即所谓压片参数。

3、音频没啥好说的,软解都行,只要支持这个格式。

4、输出回放,就是你解码出来的东西,如何输入到屏幕上,这个我开发做得多,这个玩意的能力,也就是大家常说的显卡硬加速。
        GDI是最烂了,效率低下,而且,不支持硬缩放,比如解码出来640*384的,你在800*480上放,就要扩大,那效果叫一个烂,都是格子,要平滑缩放?没问题,软件处理啊,Lanczos算法,三线性等等,耗费你的宝贵CPU。
        GAPI稍微牛逼些,也过时了,微软早期做WM时搞出来的供游戏用的快速图形库,如果底层驱动写得好,GAPI可以平滑缩放,甚至硬件缩放,硬件色彩空间转换(解码出的大多是YUV,要转成RGB16,谁让WM只支持16位色呢,气结)。但是,据我了解,基本99。9%的驱动都写得烂渣渣。 不过,魅族M8牛逼得一塌糊涂,人家的底层驱动和GAPI挂接非常好,算是对6410物尽其用了。再次强烈鄙视Go force。这么多年了,连个像样的驱动都没。
        DDraw,跟GAPI类似,后期微软把这个PC上的架构移植过来了,好处是,很多PC上的代码能在WM上用了,但也要靠驱动,驱动实现好的,能硬缩放,硬色彩空间转换。效率高,效果好,不耗CPU
        RawFrameBuffer.这玩意是CorePlay和他早期的TCPMP搞出来的,就是写图形缓冲,根据机型不同,还有好多变体,我当年用的696,就有个ATI的,直接硬件平滑缩放,效果很好。但只有CorePlayer/TCPMP自己能调用。

还有个DirectShow,也是微软后面引入WM的,PC上已经演进到Media Foundation了,也给大家说说,DShow是一个架构,有三件套,分离器,解码器,输出,对应关系:
分离器:解开容器         各种格式不同的容器,就需要不同的分离器
解码器:解码音视频流     各种格式的音视频,就需要不同的解码器
渲染器:调用显示模块(先尝试DDraw,再尝试GDI)进行显示
三件套拼合起来,组成一个播放链,就能播放了,PC上大多数播放程序是根据这个写的,而WM上,基本除了自带的WMP,其他播放器都没根据这个玩意来写。WMP虽然烂,饱受歧视,但是某些机器的WMP所调用的DSHOW组件,是做过优化的,比如解码器和渲染器,能利用到硬件性能,所以。。。。。有时候CorePlayer搞不定,WMP行,就是这个道理。

WM上大多程序没用系统的DSHOW架构,而是是用的自己开发的裸架构,比如CorePlayer,TCPMP之类的播放器,全部自己开发的,
早期玩过TCPMP的源码,写得不错。就是自己去完全搞定容器的分离,解码以及显示,在程序架构上模仿了微软的DSHOW,自己实现了一个插件架构。
可惜,目前为止,还是只能软解,顶多利用一下DDraw进行渲染,还能享受一点点硬件的加速,如果驱动写得不好,DDraw都烂。那就没药救了。

今天就讲到这。写得不好,欢迎来拍砖。

原创粉丝点击