x264 编码器选项分析 (x264 Codec Strong and Weak Points) 1

文章文件夹:

x264 编码器选项分析 (x264 Codec Strong and Weak Points) 1

x264 编码器选项分析 (x264 Codec Strong and Weak Points) 2

======================

本文简单翻译了MSU实验室做的X264的Option(即编码选项,后文称其英文名)分析报告《x264 Codec Strong and Weak Points》。看了之后感觉分析得十分透彻。并且其採用的方法也非常有參考价值,因此记录一下当中的要点以作备忘。

众所周知,X264的Option非常繁多,怎样搭配这些繁多的參数以让编码后的视频体积小,质量好。同一时候编码速度快。确实是一个非常让人头疼的问题。本报告中的实验就是为了解决上述问题而设计的。

一.简单介绍

本文通过使用客观质量评价算法分析X264编码器的选项。

下表列出了文中用到的几个词汇。

简单翻译一下:

名称


定义


样例


Option(选项)


编码选项


B帧数,运动预计算法


Option value(值)


编码选项的值


--me(运动预计算法)包括以下值:”dia”, “hex”, “umh”, “esa”, “tesa”


Preset(预设)


由一系列固定Value(值)的Option(选项)组成的集合


Pareto-optimal Point (Preset) (帕累托最优的预设)


没有不论什么其它Preset(预设)能够比该Preset获得更好的视频质量和更快的编码速度。


Envelope line Points (Preset) (包络线上的预设)


位于Convex hull(凸包)上的预设。

代表了最好的预设。


Parameter λ(λ參数)


代表期望的编码时间和码率的比值。

能够用下式表示:

M=λT+Q

当中T代表了相对编码时间,Q代表了相对的视频质量。

二.选项(Option)和选项的值(Option value)

本报告分析的X264的Option例如以下所列。

 

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpeGlhb2h1YTEwMjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />



watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpeGlhb2h1YTEwMjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />

简单翻译一下:


选项



备注


Partitions(分块方式)

--partitions x


"none"

"p8x8,b8x8,i8x8,i4x4"

"all"


宏块使用的分块方式。

默认值:
"p8x8,b8x8,i8x8,i4x4"


B-Frames(B帧数)

--bframes n


0

2

4


I帧和P帧之间连续B帧出现的数量。

默认值:0


Reference Frames(參考帧数)

--ref n


1

4

8


參考帧的数量。

默认值:1


Motion Estimation Method(运动预计方法)

--me x


“dia”

“hex”

“umh”

“tesa”


运动预计的方法。具体见凝视。

默认值:“hex”


Subpixel Motion Estimation(子像素运动预计)

--subme n


1

4

5

6


子像素(subpixel)估測复杂度。

默认值:5


Mixed References

--mixed-refs


off

on


默认值:off


Weighted

Prediction

--weightb


off

on


每一帧对B帧的影响力与其和该B帧的距离相关。

默认值:off

注:
1.运动预计方法简单介绍
  dia(diamond菱形搜索) 是最简单的搜索方式。从最优预測值出发,往上、左、下、右一个像素处检測运动向量。挑选最好值,然后反复该步骤,直至找不到更优的运动向量。
  hex(hexagon正六角形搜索) 的策略相似,但它对周围六个点进行range-2搜索。因此称为正六角形搜索。

此方法效率大大高于dia,且速度相当。因此通常编码经常使用此项。

umh(uneven multi-hex不正确称多六角形搜索)比hex慢非常多,但能搜索复杂的多六角形,以避免错过非常难找到的运动向量。

与hex和dia相似。M.E.半径范围參数直接控制umh的搜索半径,使用者可自行增减搜索的空间尺寸。
  esa(exhaustive全面搜索) 在最优预測值附近M.E.半径范围范围内的整个空间内。以高度优化的智能方式搜索运动向量。相当于数学上的穷举法。搜索区域内的每个运动向量。可是更快些。然而。此方法远远慢于UMH。且优点不多。对于普通编码没有太大用处。
  tesa (transformed exhaustive变换全面搜索)算法尝试对各个运动向量近似哈达玛变换比較法。与exhaustive相似,但效果略好,速度略慢。

2. 子像素运动预计
子像素(subpixel)估測复杂度,越大越好。数值1-5单纯控制子像素细化强度。数值6会开启模式决策RDO,数值8将开启运动向量和内部预測模式RDO。RDO模式大幅慢于低级模式。

採用低于2的值,会使用一种较快、但较低质量的lookahead模式,同一时候会影响--scenecut的决策,因此不推荐。
可选值:
0. fullpel only
1. QPel SAD 1 iteration
2. QPel SATD 2 iterations
3. HPel on MB then QPel
4. Always QPel
5. Multi QPel + bi-directional motion estimation
6. RD on I/P frames
7. RD on all frames
8. RD refinement on I/P frames
9. RD refinement on all frames
10. QP-RD (requires --trellis=2, --aq-mode > 0)
11. Full RD 

三. 最佳Preset

下图显示了本次实验的所有结果。实验系统通过枚举上表所列參数的所有选项,而后进行压缩编码得到的实验结果。每个绿色的点代表一种Preset压缩的结果。可见实验的数据量非常大。

以下简单解释一下这张图的含义。纵坐标代表视频的码率,取值越低,代表同等视频质量的的情况下码率越小。横坐标代表视频的编码时间,取值越低。代表编码时间越低。坐标取值是一个相对值。

每个绿色的点代表一种Preset。因此可知。越是位于左下角的Preset,其编码速度越快。且码率越低。最优的Preset应该是位于凸包(Convex hull)上的点(即那条红颜色线上的点)。须要注意的是。横坐标和纵坐标都是一个相对值而不是绝对的码率和时间。

横坐标和纵坐标的值都是相比于X264的Default Preset而言的。

X264的Default Preset即X264所有使用默认值的Preset,位于这张图的(1,1)点处。

假设固定编码时间,则最优的Preset位于包络线上。

如图所看到的,位于粉红色五角星位置的Preset在同样的编码时间下码率最低。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpeGlhb2h1YTEwMjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />

X264默认值例如以下表所看到的。

Option


默认值


Partitions


“p8x8,b8x8,i8x8,i4x4”


B-Frames


0


Reference Frames


1


Motion Estimation Method


“hex”


Subpixel Motion Estimation


5


Mixed References


off


Weighted Prediction


off

下图显示了Pareto-optimal Point(帕累托最优点)Preset(即没有不论什么其它Preset能够比该Preset获得更好的视频质量和更快的编码速度)以及凸包(Convex hull)上的Preset。

 

凸包(Convex hull)上的Preset数据统计例如以下。

 

凸包(Convex hull)上的Preset分析结果例如以下。表格中一方面列出了凸包(Convex hull)上的Preset使用较多的Option以及使用较少的Option。还有一方面列出了消耗时间较长可是质量较高的Preset以及速度较快可是质量较差一些的Preset。
 

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpeGlhb2h1YTEwMjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />

四. “彩云图”的Preset分析

本章中,每张图相应一种关注的Option,包括不同Option Value的 Preset被标记为不同的颜色。实验结果例如以下所看到的。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpeGlhb2h1YTEwMjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />

从以上图表能够得出的各个Option的分析结果例如以下表所看到的。

 

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpeGlhb2h1YTEwMjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />

简单翻译一下:

选项



结论


Partitions(分块方式)

--partitions x


"none"

"p8x8,b8x8,i8x8,i4x4"

"all"


要求速度快的时候用”none”。要求视频质量高的时候用”all”。

要求速度质量均衡考虑的时候使用"p8x8,b8x8,i8x8,i4x4"


B-Frames(B帧数)

--bframes n


0

2

4


要求速度极高的时候用”0”。其它情况下用”2”,”4”。它们二者之间区别不大。


Reference Frames(參考帧数)

--ref n


1

4

8


要求速度快的时候用”1”,要求视频质量极高的时候用”8”。

要求速度质量均衡考虑的时候使用"4"


Motion Estimation Method(运动预计方法)

--me x


“dia”

“hex”

“umh”

“tesa”


要求速度快的时候用”dia”和”hex”,要求视频质量极高的时候用”tesa”。要求速度质量均衡考虑的时候使用"umh"。


Subpixel Motion Estimation(子像素运动预计)

--subme n


1

4

5

6


要求速度快的时候用”1”。要求视频质量高的时候用”6”。

要求速度质量均衡考虑的时候使用"4"


Mixed References

--mixed-refs


off

on


Weighted

Prediction

--weightb


off

on

注1:“Weighted prediction”作用不明显
注2:“bframes”中的2和 4 B-frames区别不大。

“彩云图”的分析结论例如以下表所看到的。该表列出了不同的使用环境下Option应该使用的值(Option value)。分成三种情况:速度最重要,速度和视频质量平均考虑。视频质量最重要。

原文地址:

http://compression.ru/video/codec_comparison/pdf/x264_options_analysis_08.pdf

时间: 2024-11-07 19:13:22

x264 编码器选项分析 (x264 Codec Strong and Weak Points) 1的相关文章

x264 编码器选项分析 (x264 Codec Strong and Weak Points) 2

上篇文章简单翻译了MSU实验室做的X264的Option(即编码选项,后文称其英文名)分析报告<x264 Codec Strong and Weak Points>的前面部分.前面部分部分比较基础,而其后的内容相对来说要复杂许多.本文继续上篇文章的内容,简单记录接下来的内容. 前文通过"彩云图"的方法分析了X264的Preset."彩云图"这种方式的优点是一目了然,可以清晰地看出各种Option取不同的值对视频的质量和编码速度的影响.但"彩云图

转:x264源代码简单分析:编码器主干部分-1

本文来自:http://blog.csdn.net/leixiaohua1020/article/details/45644367 本文分析x264编码器主干部分的源代码."主干部分"指的就是 libx264中最核心的接口函数--x264_encoder_encode(),以及相关的几个接口函数 x264_encoder_open(),x264_encoder_headers(),和x264_encoder_close().这一部分源代码 比较复杂,现在看了半天依然感觉很多地方不太清晰

x264源代码简单分析:编码器主干部分-1

本文分析x264编码器主干部分的源代码."主干部分"指的就是libx264中最核心的接口函数--x264_encoder_encode(),以及相关的几个接口函数x264_encoder_open(),x264_encoder_headers(),和x264_encoder_close().这一部分源代码比较复杂,现在看了半天依然感觉很多地方不太清晰,暂且把已经理解的地方整理出来,以后再慢慢补充还不太清晰的地方.由于主干部分内容比较多,因此打算分成两篇文章来记录:第一篇文章记录x264

x264源代码简单分析:编码器主干部分-2

本文继续记录x264编码器主干部分的源代码.上一篇文章记录x264_encoder_open(),x264_encoder_headers(),和x264_encoder_close()这三个函数,本文记录x264_encoder_encode()函数. 函数调用关系图 X264编码器主干部分的源代码在整个x264中的位置如下图所示. 单击查看更清晰的图片 X264编码器主干部分的函数调用关系如下图所示. 单击查看更清晰的图片 从图中可以看出,x264主干部分最复杂的函数就是x264_encod

ffmpeg源码分析五:ffmpeg调用x264编码器的过程分析

该文将以X264编码器为例,解释说明FFMPEG是怎么调用第三方编码器来进行编码的. 所有编码器和解码器都是在avcodec_register_all()函数中注册的.从中可以找到视频的H264解码器和X264编码器: REGISTER_DECODER(H264,              h264); REGISTER_ENCODER(LIBX264,           libx264); 他们都是通过一下宏进行相应的注册的: #define REGISTER_DECODER(X, x)  

ffmpeg源码分析五:ffmpeg调用x264编码器的过程分析 (转5)

原帖地址:http://blog.csdn.net/austinblog/article/details/25127533 该文将以X264编码器为例,解释说明FFMPEG是怎么调用第三方编码器来进行编码的. 所有编码器和解码器都是在avcodec_register_all()函数中注册的.从中可以找到视频的H264解码器和X264编码器: REGISTER_DECODER(H264, h264); REGISTER_ENCODER(LIBX264, libx264); 他们都是通过一下宏进行相

x264源代码简单分析:x264命令行工具(x264.exe)

本文简单分析x264项目中的命令行工具(x264.exe)的源代码.该命令行工具可以调用libx264将YUV格式像素数据编码为H.264码流. 函数调用关系图 X264命令行工具的源代码在x264中的位置如下图所示. 单击查看更清晰的图片 X264命令行工具的源代码的调用关系如下图所示. 单击查看更清晰的图片 从图中可以看出,X264命令行工具调用了libx264的几个API完成了H.264编码工作.使用libx264的API进行编码可以参考<最简单的视频编码器:基于libx264(编码YUV

(转)x264源码分析(1):main、parse、encode、x264_encoder_open函数代码分析

转自:http://nkwavelet.blog.163.com/blog/static/2277560382013103010312144/ x264版本:   x264-snapshot-20140226-2245  1.     首先对主函数进行分析,main函数很简洁,主要有三个步骤,见下图: 2.   接下来分析一下Parse函数中的主要过程: static int parse( int argc, char **argv, x264_param_t *param, cli_opt_t

x264源代码简单分析:概述

最近正在研究H.264和HEVC的编码方式,因此分析了一下最常见的H.264编码器--x264的源代码.本文简单梳理一下它的结构.X264的源代码量比较大而且涉及到很多的算法,目前还有很多不懂的地方,因此也不能保证分析的完全正确.目前打算先把已经理解的部分整理出来以作备忘. 函数调用关系图 X264的函数调用关系图如下所示. 单击查看更清晰的大图 下面解释一下图中关键标记的含义. 函数背景色 函数在图中以方框的形式表现出来.不同的背景色标志了该函数不同的作用: 白色背景的函数:不加区分的普通内部