x264实现了h.264的视频编码,但是没有实现解码算法。开源了优秀多媒体解码合集ffmpeg提供了h.264的解码算法,ffmpeg实现了市面上可见的绝大部分解码器的功能,ffmpeg解码功能被其他各大解码器ffdshow,Mplayer等所包含或应用。
x264只实现了h.264的Main Profile,在开源的h.264编码工程中,x264编码效率最高。
x264编码库libx264实现真正的视频帧编码,根据前面的H.264关键技术分析,该算法仍然是基于块的混合编码技术,即帧内/帧间预测,然后对预测值变换、量化,最后熵编码所得。编码帧类型仍然分为I帧(x264_type_i)、P帧(x264_type_p)、B帧(x264_type_b),在H.264中叫图像片Slice。x264把整帧图像看作一个Slice,片中有slice_type_i、slice_type_p、slice_type_b之分。I帧只有slice_type_i,p帧有slice_type_i、slice_type_p,B帧三种片均有。
x264的H.264视频编码过程大致可以分为三个过程。首先根据规则判定当前帧的编码类型,如果是B帧还要缓冲存放、获取,然后对待编码图像采用帧内预测、帧间预测、整数DCT变换、量化和熵编码,最后把压缩后的码流进行NAL层打包输出。
如果存在B帧,则从next区域中取出B帧以后的P帧放到current区域中,也就是说先编码I、P帧再编码其间的B帧;
若为IDR(Instantaneous Decoder Refresh)帧,则意味着是一个新图像片的开始。在H.264中为了防止编码错误扩散,规定当前片不以本片以外的其它帧为参考,因而编码器遇到IDR帧则需要重置参考帧区域。同时,将SEI(Sequence Enhancement Information)、SPS(Sequence Parameter Set)和PPS(Picture Parameter Set)分别单独写入NAL单元。这三个参数集集合了编解码的核心参数,直接关系解码端能否正常解码。如果不是IDR帧,依据帧类型设定当前NAL单元的类型和图像片的类型。接着进行一系列初始化参数的操作,包括建立关于参考帧的list0和list1,初始化码流控制得到量化步长、参考帧等相关信息,初始化写比特流环境变量等。
命令参数根据作用可分为帧类型选项(表1)
码率控制选项(表2)
模式抉择分析选项(表3)
视频标准化选项(表4)
输入/输出选项(表5)
补充:
ffmpeg支持音视频的大部分格式,如MPEG-1/2/4、H.261/3/4、WMV、SVQ、PCM、ADPCM、FLV、AVI、MP3、OGG、Matroska、ASF等90多种音视频数据的CODEC。