热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

选择视频编码器的误区傅德良

大家好,我是傅德良,在Hulu主要负责的团队是在做音视频编解码和传输相关的一些优化和开发的工作,很高兴跟大家聊一聊对于视频编码器的对比和选

大家好,我是傅德良,在Hulu主要负责的团队是在做音视频编解码和传输相关的一些优化和开发的工作,很高兴跟大家聊一聊对于视频编码器的对比和选择。

 

主要内容分为以下三个方面:

 

1,纷争的视频标准与视频编码器

2,视频编码器对比中的常见误区

3,选择最合适的视频编码器

 

由于今天的热身分享时间相对比较有限,所以今天主要会讲常见误区这一块,关于选择最合适的视频编解码器这个领域,更多的会在10月份的LiveVideoStackCon 正式分享中进行介绍。

 

前言

 

关于Hulu

Hulu是美国的一家在线流媒体服务公司,在中国并没有业务,主要服务的是美国的用户。Hulu是由美国最大的几家传统的媒体公司合资创办的,它的使命是为了重新定义电视这一行业。大家也知道电视这一行当已经出现很久了,不过一直到现在,它在每个人的生活中仍然具有相当重要的地位。在Hulu上既有点播,也有直播的内容,我们站上的这些视频大部分都是高质量的视频,主要是一些美剧,还有一些电影,同时也有一些自制剧,Hulu近几年自制剧上面也有一些比较多的好剧出来。

         上图是一个由第三方的数据公司做的美国比较主流的几个在线流媒体服务公司的一些数据统计,第一列的大概意思就是说,如果一个人从来没有用过有线电视,他直接就开始在电视上使用在线流媒体服务的情况,我们称之为Cordless,Hulu在这几家公司里面是最高的。而且Total OTT Viewing Hours和Viewing Days也是最高的,也就是说对于Hulu来讲,用户在站上的黏性是非常高的。Hulu的商业模式是付费加广告的一种模型,也就是说首先需要付费成为付费玩家才能够真正的在我们的站上观看视频,在此基础之上,还可以选择去广告或者是有广告。在这种模式下,为了提供比较优质的内容,视频质量对于我们的这种服务来讲是非常重要的,因此,不断地提高视频的传输和压缩的水平是非常重要的。所以,Hulu经常会做一些不同的编码器,不同的技术之间的一些选型,在这方面我们也积攒了一些相关的经验。

 

纷争的视频标准与视频编码器

 

1, 视频编解码标准

 

视频编解码标准一般是由一些标准化组织去组织创办和制订的一种规范,它主要规定了我们在网络上传输视频的码流格式,从码流格式中也相应的规定了音视频编解码的基本流程。从流程上来讲,编解码标准主要统一的是编码器和解码器的接口,它通过规定了码流的格式,也就规定了在编码标准中可以使用的一些编解码工具的集合,也就能够保证音视频的压缩效率。

上图是目前最常见的混合编码框架的基本流程图,这里就不细讲了,整个视频编码的基本原理就是通过一系列的方法去除冗余,最终达到降低码率,但是同时又能够恢复原始图像的目的。另外,编解码标准只是对码流进行了一系列的规定,事实上它并没有去具体的规定编码是怎样做的,如果你去看标准文档,它其实规定的是整个解码的流程。

 

2, 视频编码器

 

视频编码器实际上跟视频编解码标准是有很大不同的,视频编码器是视频编解码标准的一种代码实现,但是同一套算法的不同的实现,性能和效率的差别都是很显著的。视频编码器之间的主要差异分为以下几个方面:

 

1) 视频编解码标准中压缩工具的支持情况

2) 针对视频编码速度的优化

3) 针对视频编码质量的优化

4) 功能和代码的可扩展性

5) 商用 vs. 免费

 

举个例子,有人认为HEVC编码器一定比H.264的编码器要强,但是我们知道在HEVC中有很多种不同的预测方向,如果我设计一种编码器不使用帧间预测,只使用帧内预测,而且不管内容是怎样的,都使用这一个固定的模式来进行编码,那么这样编出来的码流可想而知,它的预测的效果是很差的,压缩的效率会非常的低。虽然码率很高,质量很差,但是这个码流仍然可能是符合HEVC标准的。相对来说,如果用H.264的来做编码,但是整个编码器的优化做得非常的好,整个的码率控制都优化到了非常优秀的程度,那么这个H.264编码器编出来的视频码流的质量完全可以比HEVC编码器编出来的效果更好。在视频编解码领域,新的标准刚刚出来的时候,大家不会很快的去采用这种新标准的编码方案,原因就是在于编码器端的优化还没有做到位,所以说单纯在考虑编码器的性能和它对这种标准的支持是非常片面的一种做法。因此,在实际的工作中,选择编码器一定不要盲目的相信H.265的编码器就一定比H.264的编码器好,这个是不一定的,甚至有些时候一些比较Low的标准也可以做得很好。因此,在选择编码器的时候,要从上述的视频编码器之间的差异出发来选择。

 

3, 纷争的编解码标准与编码器

 

在整个编码器对比的过程中,经常遇到的一个非常大的误区就是把视频编解码标准和视频编码器混为一谈。

上面简单罗列一下目前市面上的很多种不同的编解码标准以及不同标准的编码器,在实际生产中,作为一个在线视频提供方,如果希望自己去做视频的压缩,那么在编码器的选择上,毫无疑问是一个大问题。并不是说,市面上只有那么几款编码器直接用就行了,并不是那么的简单,在很多的场景中,我们都会遇到如何去对比不同的音视频编码器来选择适合的编解码器的课题。

 

视频编码器对比中的常见误区

 

1, 误区一:脱离速度评价质量

 

从视频编解码标准的发展历史来讲,整体来说是复杂度越来越高,效率越来越高。在很多场景下,视频编码中速度和质量在一定范围内是可以相互转换的,也就是说可以牺牲质量来加快速度。因此,如果只是单纯考虑质量维度,但不考虑速度,就会有很大的误差;此外,即使同一编码器的不同的速度档次之间的质量差距也可以非常的巨大。

 

 

上图是我们内部对开源的HEVC编码器的测试图,可以看出对于同一编码器,在不同的速度档次下,质量是有差距的;在相同码率下,速度越快,质量也相对较低。因此,我们在对比不同编码器的编码质量时,一定要在同一速度下比较编码质量才有意义。

 

2, 误区二: 速度对比中环境不一致

 

为了达成准确的视频编码器对比,需要使得编码器速度一致再进行对比,在这个过程中,有的时候会有一个问题即对比的环境不一致。当编码器放在不同的这种软硬件环境下进行测试时,对比结果可能有很多的误差。由于优化和实现上的区别,各编码器在不同运行环境下速度差别显著。在对比不同编码器的过程中,我们需要考虑到CPU线程数量,硬件加速环境和开关,CPU指令集支持情况和内存容量、带宽等因素。要在相同的测试环境下对比,不一致或不合理的测试环境会导致编码器对比结果不正确。

 

3, 误区三: 脱离码率范围对比质量

 

在视频编码的过程中,视频编码质量通常与视频编码码率成正相关,但并非线性相关。在大的码率范围内,随着码率的进一步增加,质量的增加是慢慢的衰减的,这也就意味着说,各个编码器在不同的码率范围的性能表现可能是很不一致的。在实际生产中,视频编码码率潜在范围非常宽广,例如,同样都是720P的AVC的编码器,有的用5000kbps,有的用500kbps。对于一些硬件编码器,在低码率的情况下,速度很快,编码质量也还可以,它的编码效果就比一些软件编码器要好。但在高码率的情况下,硬件编码器可能由于它的编码工具实现的不够完善导致质量上不去,这时候软件编码器就会表现的更好。因此,在对比编码器的时候,一定要在它合适的码率范围内来比较性能,脱离码率范围对比编码质量很容易导致错误结论。

 

4, 误区四: 仅依赖小规模公开测试序列进行测试

 

在视频编码的过程中,视频编码效率与视频内容高度相关的,同一视频编码器在不同类型内容上的表现经常是不一致的。此外,还有一部分编码工具主要针对某一类视频有效,它主要针对某一特定场景有效,如果你的测试场景并不包含它,这个测试的结果就不会好。因此在测试过程中,最好能够针对你的业务需求由真正的应用场景去设计比较大规模的测试集,仅仅依赖小规模公开测试序列测试容易引入误差。测试群规模小就不能够涵盖产品中的所有情况,而且公开测试序列不能体现业务特点与需求,此外还有部分编码器针对公开测试序列进行了过拟合的调优,这些都会导致测试结果误差较大。

 

5, 误区五: 仅使用PSNR评价质量

        PSNR为视频编码领域经典指标,至今被广泛应用,它是纯客观指标,单纯体现编码后视频与原始视频差异程度。但是像PSNR这样子的纯客观指标是有一定的局限性的,在很多情况下并不能正确反映视频主观质量。

 

 

上面两幅图如果用PSNR来衡量,与原图相比较它们的PSNR的大小是一样的。但是我们很明显的可以看到,右边的图它有一些噪音在里面,在主观上来看,左边的图比右边的图质量要好。因此,如果单纯使用PSNR评价质量可能会使的我们进入一些误区,而且近些年,很多的编码器里都会有基于主观质量进行的优化。

 

选择最合适的视频编码器

 

当我们避开上面的误区时,选择的编码器一般是相对靠谱的。在选择编码器的过程中,我们要充分考察业务需求,选定必要功能,还要详细考察运行环境,并相应制定测试环境。在测试的过程中,要明确定义测试目标,要注意编码速度和码率范围。此外,如果是你只是想做个学术的研究,只用公开的序列就足够,对于工业实践还要根据自己的业务需求定制特定的测试序列,而且测试序列规模应当足够大。最后评价编码器的编码质量要主观质量和客观质量结合起来,不可仅仅从单一方面评价好坏。

 

Q&A

 

Q1: 请问有没有公开大量数据集的计划?

 

A: 如果你关注的话,你会发现在业界对于数据集的公布,成本是比较高的,因为它除了拍摄还有一个处理的过程,还有包括一些版权,这些相对来讲还是比较复杂的,我们目前暂时没有公布测试数据集的一种行为。在业界有一些公司其实是能够找到一些的,但是数量坦白的说也并不是非常的大,个人建议就是说还是在自己的业务场景里边根据自己的需求去做,像这样相对来讲比较靠谱一些。

 

Q2: 数字水印有什么好的测量方法呢?

 

A: 这块没有太多涉及,在我们的业务中比较少涉及到数字水印,不同的水印原理也不一样,据我所知在美国市场上有一些这种数字水印,它并不一定是加在视频上的,有的时候是加在音频上的,据我所知,尼尔森有一些这种数字水印的技术,它的原理是把它加在人耳不容易感知到的频段上,再使用相关的设备进行相关的提取。视频上面的话,没有接触过。

 

Q3: X264除了参数调优以外提升质量还有哪些的优化?

 

A: X264这个编码器本身的优化做得已经比较好了,如果说参数调优不考虑在内的话,这个也要看你的业务场景,如果说你的业务场景是这种对编码速度要求很高的情况的话,你可以考虑对它的这种原有的这些速度级别进行有针对性的一些筛选,比方说它原来给你提供了大概八九个不同的速度的级别,但是如果你需要一个比较快的档次的话,你可以自己对这些工具进行定制化的改动。其他的话,就是比较外围的,很多都是跟参数调优相关的。

转载: 傅德良 LiveVideoStackCon


推荐阅读
  • PyTorch实用技巧汇总(持续更新中)
    空洞卷积(Dilated Convolutions)在卷积操作中通过在卷积核元素之间插入空格来扩大感受野,这一过程由超参数 dilation rate 控制。这种技术在保持参数数量不变的情况下,能够有效地捕捉更大范围的上下文信息,适用于多种视觉任务,如图像分割和目标检测。本文将详细介绍空洞卷积的计算原理及其应用场景。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • 从运维繁忙到屡获殊荣:一位CIO的辉煌转型之路
    企业首席信息官(CIO)常常面临一个棘手的问题:如何有效推动公司的数字化转型?尽管数字化转型已成为企业未来发展的重要共识,但如何具体实施依然是许多CIO面临的重大挑战。在日常运营中,企业需要处理大量的业务问题和制定各种发展规划,这使得数字化转型往往被排在较低的优先级。此外,不断涌现的新问题和新规划也常常打乱原有的计划,进一步增加了转型的难度。 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • #30 序列压缩算法优化与实现
    本文探讨了序列压缩算法的优化与实现,旨在提高数据存储效率和处理速度。通过对现有算法的深入分析,提出了一种新的优化方法,该方法在保持高压缩比的同时,显著降低了计算复杂度。实验结果表明,新方法在多种数据集上均表现出色,具有广泛的应用前景。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • 独家解析:深度学习泛化理论的破解之道与应用前景
    本文深入探讨了深度学习泛化理论的关键问题,通过分析现有研究和实践经验,揭示了泛化性能背后的核心机制。文章详细解析了泛化能力的影响因素,并提出了改进模型泛化性能的有效策略。此外,还展望了这些理论在实际应用中的广阔前景,为未来的研究和开发提供了宝贵的参考。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 在最近的WWDC17大会上,苹果公司宣布了多项重要更新,其中一项是macOS High Sierra 10.13 Final的正式发布。这一版本经过优化,显著提升了系统的稳定性和响应速度,为用户在任何Mac设备上提供了更加流畅的使用体验。本文将详细介绍如何在Windows系统中利用VMware虚拟机软件安装并运行macOS High Sierra 10.13 Final,帮助用户在非苹果硬件上体验这一先进操作系统。 ... [详细]
  • 体积小巧的vsftpd与pureftpd Docker镜像在Unraid系统中的详细配置指南:支持TLS加密及IPv6协议
    本文详细介绍了如何在Unraid系统中配置体积小巧的vsftpd和Pure-FTPd Docker镜像,以支持TLS加密和IPv6协议。通过这些配置,用户可以实现安全、高效的文件传输服务,适用于各种网络环境。配置过程包括镜像的选择、环境变量的设置以及必要的安全措施,确保了系统的稳定性和数据的安全性。 ... [详细]
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
author-avatar
大道废_796
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有