在这篇文章里,我们将介绍在H.264编解码标准的基础上,实现的各主流编解码器。我们前面曾多次提到,H.264只是一个编解码的标准协议,它同MPEG-1和MPEG-2一样,协议里并没有规定编解码器的具体结构和实现方法。但是要求生成的数据流的结构,必须符合协议的规定,在这里也就是生成符合H.264标准的数据流。

这时我们可以称这种数据流格式为H.264格式,它可以保存在本地的文本文件中,也可以传输在传输信道上。但了解传输协议的都知道,在传输信道上传输的时候,还得在H.264数据包的基础上,再加上传输协议头,相当于给快递贴上快递单。

而在H.264标准文档里规定的数据流格式,当然是它的裸流格式,称为字节流格式,这在后面介绍H.264的句法和语义时将详细讲到。

所以讲上面几段,其实是为了明确学习方向。也是为什么要在这个时候,讲H.264的编解码器的原因。我们前面总在讲H.264标准的各种编码方法,包括片、宏块、帧内预测、帧间预测,而在后面我们要讲的,则是H.264的数据流结构,也即句法和语义。

可以想象一下,从编码方法到比特流结构,这中间少了什么过程?这就是编码器的实现过程!当然了,我们在这里并不会长篇大论,详细讲述各编解码器(codec)的实现原理,只是为了说明,在目前的市场上,比较主流的各大编解码器(codec)有哪些。

为什么会有各个不同的编解码器?
有些同学可能依然对这个问题有疑问,我们开头说了,H.264并没有规定编解码器该如何实现,只是规定了最终的数据流结构。所以H.264编解码器,人人可开发,各个codec,都是殊途同归而已。也正因如此,优秀的编解码器才得以出现。

下面,我们将会介绍几款主流的编解码器,而且是开源的。因为我们是用来学习的,所以在最后,会给出这些编解码器的学习建议,以及H.264的学习方向。

这几款编解码器为:JM、x264、Xvid、T264、ffmpeg、ffdshow,下面我们一一介绍。

1. JM

JM是H.264/AVC的制定方,ISO/IEC官方提供的一个参考软件,就像ISO/IEC的其他MPEG标准一样。它的主要目的,是给出H.264标准的实现示例,而不是为了成为一个实用的软件。这一点成为了它与其他编解码器,明显区别的地方。

使用过JM的人都知道,它的编解码速度是比较慢的,编码一帧的图像,就可能会用0.5-1秒的时间。所以JM很少应用在商业软件上,它较多用于学术研究上面。

也就是说,JM的编解码器,比较贴合H.264标准的规定。我们之前说H.264有三种配置,分别为基本配置(Baseline)、主流配置(main)、扩展配置(Extended),而JM实现了H.264的全部配置。而且它的代码结构比较清晰,所以对于想研究H.264的人来说,JM无疑是很好的选择。

它的源代码下载地址为:
http://iphome.hhi.de/suehring/tml/download/

2. x264

x264最开始是由一个哥们自己开始写的,始于2003年,后来这个哥们在2004年加入ATEME之后,就洗手不干了。另一个哥们开始接手,到目前为止,x264的主要开发成员有4个。

与JM相比,x264并没有实现h.264的全部配置,它主要实现了主流配置(main)。而且它舍去了一些对编码性能贡献较小,但是计算复杂度很高的特性。所以它的编码速度提高很多,但是编码效率并没有明显降低。而且x264主要采用c语言编写,底层模块使用了汇编语言进行优化,在今天,x264已经成为最好的h.264编码器。

要注意的是,x264是一个编码器,它并没有实现解码器的部分。由x264编码得到的h.264数据流,可以由其他实现了h.264 main配置的解码器进行解码,如JM和后面要介绍的FFMPEG。

x264目前广泛的应用于商业上的音视频开发中,如目前火爆的直播、小视频平台。所以只要是做音视频开发的,x264是必不可少要学习的部分。

它的源代码下载地址为:
http://www.videolan.org/developers/x264.html

3. Xvid

Xvid并不属于H.264的编解码器,它是MPEG-4的编解码器。我们之前就知道,MPEG-4分为了很多个部分,其中第十部分(Part 10)即H.264,而Xvid不是MPEG-4 Part 10 的编解码器,它是MPEG-4 Part 2 的编解码器,并且主要实现的是MPEG-4 Part 2 许多配置中的ASP(Advanced Simple Profile)的配置。

这里之所以要讲Xvid,是因为它也非常有名,它是世界上最常用的视频编解码器。它主要采用标准C编写,核心模块实现了多个CPU的汇编优化。如果你要进行MPEG-4的编解码,它可能是最好的选择。

而且它同样是开源的,无论对于音视频学习、软件开发、视频编码应用都很有帮助。另外有一个有趣的故事就是,在Xvid产生的过程中,可谓几经波折。这也就是它和DivX的故事,有兴趣的同学可以自行百度下。

Xvid的影响非常深远,虽然我们将它放在x264下面来讲,但猜也猜得到,它其实产生在x264之前,并且有历史渊源。x264的命名,与Xvid也有些类似,并且x264源码的工程结构,与Xvid非常相似。而后面要讲的T264,更像是仿照Xvid来写的。

它的源代码下载地址为:
https://www.xvid.com

4. T264

T264是由中国视频编码自由组织联合开发的编解码器,没错,它是中国的!但是T264编码得到的码流,与H.264的标准协议少有不同,而且它的解码器,只能解T264编码得到的码流。

所以,知道这些就好啦,不用深入研究。

5. FFMPEG

估计很多人都听过FFMPEG的大名,当然没听过也没关系。与上面几个编解码器不同的是,FFMPEG并不是一个编解码器。因为,它是一个完整的跨平台音视频解决方案,编解码器只是它的一部分,它属于一个集合。

使用FFMPEG,可以进行视频采集、视频格式转换、视频截图、给视频加水印等功能。而FFMPEG之所以能进行H.264编解码,是因为它包含了音视频编解码库libavcodec。除此之外,它还包含了用于各种音视频封装格式的生成和解析的库、公共函数库、场景缩放库、后期处理库、播放器等多个代码库。

可以说,只要掌握了FFMPEG,就掌握了音视频开发的半壁江山!

在FFMPEG中,它包含了一个播放器库ffplay,这个我们后面会单开一篇,来讲音视频开发中,所使用到的播放器。比如yuv、y4m、h264等视频文件的播放,而ffplay,则可以用来播放,由编码器编码得到的h.264数据流文件。

值得注意的是,FFMPEG所用的编码器,是上面说过的x264。FFMPEG里的编解码库libavcodec,在编码时需要通过调用x264来完成编码,所以在FFMPEG的源码中,需要包含x264才能进行编码。

而FFMPEG的解码部分,则要依靠libavcodec自身了。在前面,我们提到了JM、x264、Xvid、T264,而具有H.264解码器的,也就JM和T264,但是JM速度很慢、T264又只能解码自身产生的码流。所以FFMPEG的解码器的出现,显得非常重要,这也是FFMPEG能够流行的部分原因。

FFMPEG同时也支持大部分的音视频格式,比如MPEG-1/2/4、H.261/3/4、WMV、SVQ、PCM、ADPCM、FLV、AVI、MP3、OGG、ASF等90多种音视频格式的编解码器。

它的源代码下载地址为:
http://ffmpeg.org

6. ffdshow

ffdshow类似ffmpeg,它也是一个集合。但是它没有ffmpeg功能完善,它主要用于解码MPEG-4 ASP(编码由Xvid或DivX完成)和H.264的视频,但是它也支持很多其他的音视频格式,如MPEG-2、H.263、VP3、VP6、Theora、MP3、AAV、DTS、Vorbis等。

说ffdshow是一个集合,是因为它是基于DirectShow和VFW的,而DirectShow和VFW,都是微软开发的应用于windows的多媒体开发包,所以ffdshow不是跨平台的,它只能在windows上运行。

所以如果你想在windows下做视频处理,可以研究一下ffdshow,这里我香港vps就不多介绍了,将来有机会可以继续研究。

它的源代码下载地址为:
https://sourceforge.net/projects/ffdshow-tryout/

总结

对于本文介绍的这些编解码器,如果你还是新手,或者并没有多少音视频开发经验的话,这里并不建议直接去研究编解码器的源码。因为无论编码,还是解码,它们都对H.264的比特流结构具有很强的依赖性。所以后面,我们就开始逐步学习H.264的句法和语义,而在那之后,我们会逐步获取阅读codec源码的能力。

不过虽然不建议这时阅读源码,但是我建议同学们把几个编解码器的源码都下下来,尤其是JM、x264和FFMPEG,然后再按照顺序,试着使用它们编码或解码一段视频。当然我们后面还会介绍它们的使用,不着急的同学可以跟着文章的进度一起学习。

93857785