文章目录:

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的Option只能定性的作分析,而不能定量地作分析。如果想要定量地画出图表,还需要下文所述的几种方法。

下文所述的几种方法,可以定量地分析X264的Option。根据不同的情况,画出相应的图表。

Lambda的 Preset分析

编码速度和编码质量对于视频编码器来说都很重要。但是这两个因素差别太大,因而很难以比较它们。如果一个Preset的速度和质量都高于另一个Preset,我们可以说前面那个Preset更好一些。但是如果一个Preset的速度高于另一个Preset,质量却低于另一个Preset,该如何比较?比较极端的情况下,我们通过主观的方式可以进行比较。比如说Preset A比Preset B的速度高两倍,但是码率高0.1%,我们可以说Preset A好于Preset B。为了定量研究上述问题,我们引入参数λ,用于表示期望编码时间与期望质量之间的比值。

λ=期望编码时间较优/期望质量较优

较大的λ代表期望的速度比质量重要(如果λ为无穷大,则只追求最快的速度,而质量根本无足轻重)。较小的λ含义则相反。

我们将通过以下方式分析数据

1.计算所有Preset的λ值。

2.根据λ值选取“前10%的Preset”。

3.选择不同的λ值,分别得到它们“前10%的Preset”,最后得到实验结果。

注意下面这张图,非常形象了说明了实验的步骤。

选择λ

本实验的难点之一是λ的取值。取值过程不再细说,最后选定了0.01-7的多个λ值。较大的λ代表速度比质量重要(如果λ为无穷大,则希望速度最快而质量无所谓)。较小的λ含义则相反。

据λ值选取“前10%的Preset”

其中有较多的数学方法,讲述起来很繁琐,自己也没有深入进去看。大概明白其选择”前10%的Preset“的方法,简单叙述一下。

筛选的目的其实就是找到一部分速度和质量都比较好的Preset。前文已经分析过,实验结果图上越是位于左边的点,代表其Preset速度快;越是位于下面的点,代表其Preset质量好。因此位于左下方的Preset是最好的。关键的问题就是选择哪些位于左下方的点。实验中使用下述公式进行筛选:

M=λT+Q

这是一个普通的线性函数。斜率是λ,横坐标T是相对时间,纵坐标M是相对码率,截距Q是一个不定的数字。这样当我们选定一个λ的时候,就确定了一条斜率固定,截距可以变化的直线,如图所示(如图中的粉红和蓝色的线)。下面假设这条线的截距从0开始逐渐增加,当它碰上的第一个点,就是该λ值最佳的Preset(因为它是最靠近左下方的,如下图中红色五角星的点)。然后直线截距继续增加,会遇到越来越多的点。直到获取到占总点数10%的点(如图中浅蓝色的点)。至此,直线遇到的所有的点就可以列为该λ下“前10%的Preset”。

下面几张图分别列举了不同的λ情况下,“前10%的Preset”的点的分布情况。可以看出,λ越小,点越分布在图表的下方(例如λ=0.01,λ=0.02)。代表期望编码质量更优。λ越大,点越分布在图表左边(例如λ=7)。代表期望编码时间更优。

最后的分析就是针对上述的“前10%的Preset”的点进行分析的。其它没有列入的位于图表右上方的点都不在本次实验数据分析的范围内。由此可见本次实验数据主要分析图表中左下方的点(也就是性能比较好的Preset),取不同的λ,分析的点也不同。

实验结果

最终的分析结论如下列图所示。每种Option可以得到一张结果图,它的横坐标为λ(图上是Q/T),值越大,代表期望的时间更优(也就是希望更快一些,质量相对较差),值越小,代表期望质量更优(质量要好,时间相对较慢),纵坐标为百分比,代表每个Option Value占用的比例。

最终得到的各Option的分析结果如下表所示。

最终得到的分析结果如下表所示。下表分别列出了λ在不同取值范围内(取值越小,代表对质量要求高;取值大,代表对速度要求高;当然表中也包含了对应的Time和Bitrate)各个Option最适合的value。

距离凸包(Convex hull)的Preset分析

上一章介绍的“Lambda的Preset分析”方法,集中分析了位于实验数据图表左下方的Preset。这些Preset都属于比较“好”的Preset。要么质量高,要么速度快,要么不但质量高而且速度快。本章介绍的距离凸包的Preset分析和上一章有很大的不同。本章将要衡量所有的Preset。大体上的思想是将Preset分成不同“质量”的Preset:距离凸包近(位于左下方)的Preset属于“优秀生”;距离凸包远(位于右上方)的Preset则属于“差生”(例如位于右上方的Preset,不但质量低,而且速度慢)。最后得到不同的Preset的“质量”下各个Option的value的分布情况。

PS:凸包可以理解为包络线

算法不再细说。直接说一说实验中的图表。根据实验结果图表中各个Preset与凸包的距离,将不同的Preset分成了不同的类别。下图列出了1-10,11-20,21-30,31-40,41-50,51-60这些类别的Preset,并标记成了不同的颜色。绿色的点为不在这些类别中的Preset。

下图继续列出了62-70,71-80,81-90,91-100,101-110,111-120这些类别的Preset,并标记成了不同的颜色。

下图列出了不同类别的点的个数。可以看出后几个类别点的个数要稍微小一点。

最终分析的结论图如下图所示。每个Option对应一张图表。横坐标为上文所述的根据与凸包的距离而划分的类别,纵坐标为不同的Option value所占的比例。

最终得到的各Option的分析结果如下表所示。

不同视频序列的分析

本部分的主要目的是验证上文所述方法的合理性。上文所述的方法只使用了一个测试视频序列。而实际环境中视频的内容多种多样。因此必须确定本报告提出的方法也适用于其他的视频。否则本报告的研究就没有意义了。下面列出了3个标准测试视频序列的实验结果图:“bus”,“news”,“stefan”。简单描述一下图表的含义:每张图表对应一个测试视频序列的实验结果;除了包含该测试视频序列的实验结果之外,还包含了其他2个测试视频序列位于凸包(convex hull)上的点,并标记以不同的颜色。

从结果上来看,尽管视频的内容不同,它们位于凸包上的点的位置是趋近于一条包络线的。也就是说,“最佳Preset”不太受视频内容的影响(当然还是有一点点的,只是程度不大)。

本报告中使用的是“bus”测试视频序列的实验结果。

总结

本报告一共用了4种方法分析x264的选项:

1.使用凸包(convex hull)分析最佳Option。

2.使用“彩云图”分析Option。这种方法简单直观,但是无法精确的量化分析。

3.使用Lambda参数分析Option。这种方法可以分析Option的速度和质量的权衡。

4.使用凸包距离分析Option。这种方法可以分析“好”和“坏”的Option。

原文地址:http://compression.ru/video/codec_comparison/pdf/x264_options_analysis_08.pdf

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

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

    文章文件夹: x264 编码器选项分析 (x264 Codec Strong and Weak Points) 1 x264 编码器选项分析 (x264 Codec Strong and Weak P ...

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

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

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

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

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

    原帖地址:http://blog.csdn.net/austinblog/article/details/25127533 该文将以X264编码器为例,解释说明FFMPEG是怎么调用第三方编码器来进行 ...

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

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  6. x264源代码简单分析:熵编码(Entropy Encoding)部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  7. x264源代码简单分析:宏块编码(Encode)部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  8. x264源代码简单分析:宏块分析(Analysis)部分-帧间宏块(Inter)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  9. x264源代码简单分析:宏块分析(Analysis)部分-帧内宏块(Intra)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

随机推荐

  1. Postgresql 创建SEQUENCE,Springboot中使用KeyHolder

    项目中使用到JdbcTemplate中的KeyHolder,代码如下: String sql = "insert into web_users(username, password, pho ...

  2. Java锁机制了解一下

    前言 回顾前面: 多线程三分钟就可以入个门了! Thread源码剖析 多线程基础必要知识点!看了学习多线程事半功倍 只有光头才能变强! 本文章主要讲的是Java多线程加锁机制,有两种: Synchro ...

  3. nginx的yum安装,基本参数使用,编译参数说明和Nginx基本配置,模块安装

    nginx的yum安装从nginx官网获取源 vim /etc/yum.repose.d/nginx.repo[nginx]name=nginx repobaseurl=http://nginx.or ...

  4. Linux完全卸载Oracle的操作步骤

    卸载步骤如下:1.运行$ORACLE_HOME/bin/localconfig delete2.rm -rf $ORACLE_BASE/*3.rm -f /etc/oraInst.loc etc/or ...

  5. SpringBatch简介

    spring Batch是一个轻量级的.完善的批处理框架,旨在帮助企业建立健壮.高效的批处理应用.SpringBatch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,使 ...

  6. Android开发学习之路--逆向分析反编译

      一般情况下我们想要了解别人的app怎么实现这个动画,这个效果的时候,总是会想到反编译一下,看下布局,看下代码实现.对,这对于有经验的玩家确实手到擒来了,但是初学者,根本就不知道怎么反编译,怎么看代 ...

  7. Xcode Organizational Identifiers

    操作系统(不管是iOS或是OS X)使用bundle标识去唯一标识你的应用.Bundle标识由一个组织id和你App的名字组成. 一般的,组织id是你域名的反转.如果你的域名是example.com那 ...

  8. 初识gd库

    必备基础 开启GD拓展 列表使用 获取图片信息代码 图片详细信息 特效函数 示例 运行结果 分析 获取图片基本信息 获取图片宽度 获取图片高度 获取图片后缀名 获取图片mime类型 操作图片 添加文字 ...

  9. 理解性能的奥秘——应用程序中慢,SSMS中快(4)——收集解决参数嗅探问题的信息

    本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(3)--不总是参数嗅探的错 前面已经提到过关于存储过程在SSMS中运行很 ...

  10. named let 递归和闭包的利器

    named let和递归,闭包联系十分密切.而且还是提高性能的重要手段.先来看一个make-list函数的模拟,最原始的写法大概是: (define (imake-list n member) ( n ...