FFmpeg中的Color颜色参数解析、转码和HDR

前言

视频中帧的颜色信息非常重要,表示着编码时用到的标准,意味着解码时也要对应上,或者要使用正确的转换函数,否则就会带来色差问题。
关于FFmpeg中的颜色参数,有下边几个重要的结构体:

颜色参数相关的结构体

这些结构体都在pixfmt.h中定义:

AVColorPrimaries

enum AVColorPrimaries {AVCOL_PRI_RESERVED0   = 0,AVCOL_PRI_BT709       = 1,  ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex BAVCOL_PRI_UNSPECIFIED = 2,AVCOL_PRI_RESERVED    = 3,AVCOL_PRI_BT470M      = 4,  ///< also FCC Title 47 Code of Federal Regulations 73.682 (a)(20)AVCOL_PRI_BT470BG     = 5,  ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAMAVCOL_PRI_SMPTE170M   = 6,  ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSCAVCOL_PRI_SMPTE240M   = 7,  ///< functionally identical to aboveAVCOL_PRI_FILM        = 8,  ///< colour filters using Illuminant CAVCOL_PRI_BT2020      = 9,  ///< ITU-R BT2020AVCOL_PRI_SMPTE428    = 10, ///< SMPTE ST 428-1 (CIE 1931 XYZ)AVCOL_PRI_SMPTEST428_1 = AVCOL_PRI_SMPTE428,AVCOL_PRI_SMPTE431    = 11, ///< SMPTE ST 431-2 (2011) / DCI P3AVCOL_PRI_SMPTE432    = 12, ///< SMPTE ST 432-1 (2010) / P3 D65 / Display P3AVCOL_PRI_JEDEC_P22   = 22, ///< JEDEC P22 phosphorsAVCOL_PRI_NB                ///< Not part of ABI
};

色度主基准:描述视频色度信息,即视频中可见颜色的范围。它定义了色度信号的原色坐标。
不同的色度主基准对应不同的色彩空间范围。
比如BT.601,BT.709,BT.2020等。

AVColorTransferCharacteristic

enum AVColorTransferCharacteristic {AVCOL_TRC_RESERVED0    = 0,AVCOL_TRC_BT709        = 1,  ///< also ITU-R BT1361AVCOL_TRC_UNSPECIFIED  = 2,AVCOL_TRC_RESERVED     = 3,AVCOL_TRC_GAMMA22      = 4,  ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAMAVCOL_TRC_GAMMA28      = 5,  ///< also ITU-R BT470BGAVCOL_TRC_SMPTE170M    = 6,  ///< also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSCAVCOL_TRC_SMPTE240M    = 7,AVCOL_TRC_LINEAR       = 8,  ///< "Linear transfer characteristics"AVCOL_TRC_LOG          = 9,  ///< "Logarithmic transfer characteristic (100:1 range)"AVCOL_TRC_LOG_SQRT     = 10, ///< "Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)"AVCOL_TRC_IEC61966_2_4 = 11, ///< IEC 61966-2-4AVCOL_TRC_BT1361_ECG   = 12, ///< ITU-R BT1361 Extended Colour GamutAVCOL_TRC_IEC61966_2_1 = 13, ///< IEC 61966-2-1 (sRGB or sYCC)AVCOL_TRC_BT2020_10    = 14, ///< ITU-R BT2020 for 10-bit systemAVCOL_TRC_BT2020_12    = 15, ///< ITU-R BT2020 for 12-bit systemAVCOL_TRC_SMPTE2084    = 16, ///< SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systemsAVCOL_TRC_SMPTEST2084  = AVCOL_TRC_SMPTE2084,AVCOL_TRC_SMPTE428     = 17, ///< SMPTE ST 428-1AVCOL_TRC_SMPTEST428_1 = AVCOL_TRC_SMPTE428,AVCOL_TRC_ARIB_STD_B67 = 18, ///< ARIB STD-B67, known as "Hybrid log-gamma"AVCOL_TRC_NB                 ///< Not part of ABI
};

色调传递特性:描述视频的色调传递函数,即为亮度信号分配不同的电压或光强度。
不同的色调传递特性决定了视频在显示设备上的亮度响应曲线。
比如AVCOL_TRC_SMPTE2084,AVCOL_TRC_ARIB_STD_B67(HLG)等HDR标准。

AVColorSpace

enum AVColorSpace {AVCOL_SPC_RGB         = 0,  ///< order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB)AVCOL_SPC_BT709       = 1,  ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex BAVCOL_SPC_UNSPECIFIED = 2,AVCOL_SPC_RESERVED    = 3,AVCOL_SPC_FCC         = 4,  ///< FCC Title 47 Code of Federal Regulations 73.682 (a)(20)AVCOL_SPC_BT470BG     = 5,  ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601AVCOL_SPC_SMPTE170M   = 6,  ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSCAVCOL_SPC_SMPTE240M   = 7,  ///< functionally identical to aboveAVCOL_SPC_YCGCO       = 8,  ///< Used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16AVCOL_SPC_YCOCG       = AVCOL_SPC_YCGCO,AVCOL_SPC_BT2020_NCL  = 9,  ///< ITU-R BT2020 non-constant luminance systemAVCOL_SPC_BT2020_CL   = 10, ///< ITU-R BT2020 constant luminance systemAVCOL_SPC_SMPTE2085   = 11, ///< SMPTE 2085, Y'D'zD'xAVCOL_SPC_NB                ///< Not part of ABI
};

色彩空间:描述视频的色彩编码方式,即颜色信息在视频中的表示方式。
不同的色彩空间定义了颜色的表示范围和编码方式。

AVColorRange

enum AVColorRange {AVCOL_RANGE_UNSPECIFIED = 0,AVCOL_RANGE_MPEG        = 1, ///< the normal 219*2^(n-8) "MPEG" YUV rangesAVCOL_RANGE_JPEG        = 2, ///< the normal     2^n-1   "JPEG" YUV rangesAVCOL_RANGE_NB               ///< Not part of ABI
};

色域范围:描述视频的色彩值范围,即视频中亮度和色度值的取值范围。
不同的色域范围定义了亮度和色度值的归一化范围。

在ffmpeg命令查看一个视频文件的时候,有yuv420pyuvj420p。这两种格式就分别对应AVCOL_RANGE_MPEGAVCOL_RANGE_JPEG

AVCOL_RANGE_MPEG的像素颜色范围是[16,235],16表示黑色,235表示白色。主要用于TV。
AVCOL_RANGE_JPEG的像素颜色范围是[0,255],0表示黑色,255表示白色。主要用于PC。

不同标准间的转码

线性RGB:相机CMOS 传感器产生并写入原始文件(Raw File)的数据是线性的。线性数据通常看起来非常暗且对比度较低。
非线性RGB:原始文件数据经过伽马校正来匹配人眼感知。
XYZ:色彩转换需要在线性空间下进行,不同的 RGB 色域空间是不能直接进行转换的,需要一个设备无关、线性的颜色模型(XYZ)作为中转。

FFmpeg 中,BT. 601->BT. 709 的转换过程:
在这里插入图片描述

在如上的变换中,涉及到 3 个颜色空间的转换,分别是:

  1. YUV 和 非线性RGB 之间的转换
  2. 线性 RGB 和非线性 RGB 之间的转换
  3. 线性 RGB 和 XYZ 之间的转换

在FFmpeg 中,所有的这些转换参数都保存在 AVFrame 结构中:
AVFrame->colorspace 中保存了 YUV/RGB 的转换矩阵
AVFrame->color_trc 中保存了线性 RGB和非线性 RGB 之间的转换函数(transformation characteristics)。
AVFrame->color_primaries 中保存了 RGB/XYZ 的转换矩阵

上边内容来自:视频中为什么需要这么多的颜色空间?

HDR

这里说到颜色参数,就不得不提一下HDR。
来自维基百科的描述:

高动态范围成像(High Dynamic Range Imaging,简称HDRI或HDR),在计算机图形学与电影摄影术中,是用来实现比普通数位图像技术更大曝光动态范围(即更大的明暗差别)的一组技术。高动态范围成像的目的就是要正确地表示真实世界中从太阳光直射到最暗的阴影这样大的范围亮度。

gamma曲线

BT.2100标准提供两条伽玛曲线作为不同类型生产工作的标准:

  • PQ(Perceptual Quantizer 感知量化)
    PQ曲线的值是绝对的。这意味着PQ曲线不会去匹配一块屏幕的工作特性,而是正相反:屏幕必须去匹配PQ曲线。当一块屏幕的实际最大亮度与最小亮度都无法达到理想值——0 nits与10000 nits时(在目前的技术水平下可以说是必然情况),它会丢失掉显示设备允许的动态范围之外的内容。
  • HLG(Hybrid Log-Gamma 混合对数伽马)
    与传统伽马曲线相比,HLG通过对信号值的上半部分使用对数曲线(下半部分仍使用伽马曲线)来增加视频的动态范围
    HLG 的输出不带元数据,其编码值是相对值,按照百分比进行。 最大亮度值=显示设备的技术指标,因此 HLG 可以根据不同的显示设备显示出不同程度的HDR 效果,具备自适应性能。

在这里插入图片描述

一般的HLG适用于广电(根据用户设备的峰值亮度动态的调整最高显示亮度),PQ适用于数码电脑等(绝对的亮度,如果设备达不到,则进行削峰)

元数据

静态元数据:提供有关整个视频的信息。(包含了HDR内容的颜色信息以及亮度信息,ST 2086同时也会传输HDR内容的MaxCLL和MaxFALL)
动态元数据:描述了应该对显示在与母带显示具有不同色量的显示器上显示的内容应用什么色量变换。它针对每个场景和每帧显示进行了优化。

不同HDR标准

常见的有Dolby Vision,HDR 10+和HLG。
不同标准对于元数据的支持示意图:
在这里插入图片描述

SMPTE ST 2084:指的就是PQ转换函数
SMPTE ST 2086MDCV(Mastering Display Color Volume):静态元数据标准,它描述了主控显示器的色彩量(即原色、白点以及最大和最小亮度)
SMPTE ST 2094DMCVT(Dynamic Metadata for Color Volume Transform ) :是SMPTE于 2016 年发布的动态元数据标准,分为六个部分。

  • -10:用于Dolby Vision
  • -40:用于HDR10+

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/678166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ //练习 5.5 写一段自己的程序,使用if else语句实现把数字成绩转换成字母成绩的要求。

C Primer&#xff08;第5版&#xff09; 练习 5.5 练习 5.5 写一段自己的程序&#xff0c;使用if else语句实现把数字成绩转换成字母成绩的要求。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /***************************…

Linux操作系统基础(七):Linux常见命令(二)

文章目录 Linux常见命令&#xff08;二&#xff09; 一、kill命令 二、ifconfig命令 三、clear命令 四、重启与关机命令 五、which命令 六、hostname命令 七、grep命令 八、|管道 九、useradd命令 十、userdel命令 十一、tar命令 十二、su命令 十三、ps命令 Linu…

腾讯云4核8G服务器多少钱?2024精准报价

腾讯云4核8G服务器S5和轻量应用服务器优惠价格表&#xff0c;轻量应用服务器和CVM云服务器均有活动&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;标准型SA2服务器1444.8元一年&#xff0c;轻量应用服务器4核8G12M带宽一…

C语言-----自定义类型-----结构体枚举联合

结构体和数组一样&#xff0c;都是一群数据的集合&#xff0c;不同的是数组当中的数据是相同的类型&#xff0c;但是结构体中的数据类型可以不相同&#xff0c;结构体里的成员叫做成员变量 结构体类型是C语言里面的一种自定义类型&#xff0c;我们前面已经了解到过int,char,fl…

ChatGPT高效提问—prompt常见用法(续篇九)

ChatGPT高效提问—prompt常见用法(续篇九) ​ 如何准确地向大型语言模型提出问题,使其更好地理解我们的意图,从而得到期望的答案呢?编写有效的prompt的技巧,精心设计的prompt,获得期望的的答案。 1.1 增加条件 ​ 在各种prompt技巧中,增加条件是最常用的。在prompt中…

【漏洞复现】狮子鱼CMS某SQL注入漏洞01

Nx01 产品简介 狮子鱼CMS&#xff08;Content Management System&#xff09;是一种网站管理系统&#xff0c;它旨在帮助用户更轻松地创建和管理网站。该系统拥有用户友好的界面和丰富的功能&#xff0c;包括页面管理、博客、新闻、产品展示等。通过简单直观的管理界面&#xf…

2024年 前端JavaScript入门到精通 第一天

主要讲解JavaScript核心知识&#xff0c;包含最新ES6语法&#xff0c;从基础到API再到高级。让你一边学习一边练习&#xff0c;重点知识及时实践&#xff0c;同时每天安排大量作业&#xff0c;加深记忆&#xff0c;巩固学习成果。 1.1 基本软件与准备工作 1.2 JavaScript 案例 …

6 scala-面向对象编程基础

Scala 跟 Java 一样&#xff0c;是一门面向对象编程的语言&#xff0c;有类和对象的概念。 1 类与对象 与 Java 一样&#xff0c;Scala 也是通过关键字 class 来定义类&#xff0c;使用关键字 new 创建对象。 要运行我们编写的代码&#xff0c;同样像 Java 一样&#xff0c;…

力扣面试题 17.04. 消失的数字(求和,位运算)

Problem: 面试题 17.04. 消失的数字 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1:求和 先求取1-n的数字和,再减去数组中所有元素的和即为缺失数 思路2:位运算 我们利用异或运算的特性:相同位为0,不同位为1;0与仍何数异或后得到仍何数,即我们先另一个变量(初始为0)与…

1Maven分模块设计与开发

目录 1.1 介绍 1.2 实践 1.2.1模块进行拆分 1.3 总结 首先&#xff1a;Maven 是一款构建和管理 Java 项目的工具 1.1 介绍 所谓分模块设计&#xff0c;顾名思义指的就是我们在设计一个 Java 项目的时候&#xff0c;将一个 Java 项目拆分成多个模块进行开发。 1). 未分模…

SpringCloud-高级篇(十九)

我们已经学过使用 SpringAMQP去收和发消息&#xff0c;但是发和收消息是只是MQ最基本的功能了&#xff0c;在收发消息的过程中&#xff0c;会有很多的问题需要去解决&#xff0c;下面需要学习rabbitMQ的高级特性去解决 死信交换机&#xff1a;这个可以帮助我们实现消息的延迟的…

深入了解Elasticsearch索引生命周期管理

在今天的数据驱动世界中&#xff0c;Elasticsearch因其强大的搜索和分析能力而受到许多企业和开发者的青睐。随着数据量的不断增长&#xff0c;如何高效地管理这些数据成为了一个挑战。Elasticsearch索引生命周期管理&#xff08;ILM&#xff09;就是为解决这一问题而设计的。本…

数据库管理-第14期 Oracle Vector DB AI-01(20240210)

数据库管理149期 2024-02-10 数据库管理-第149期 Oracle Vector DB & AI-01&#xff08;20240210&#xff09;1 机器学习2 向量3 向量嵌入4 向量检索5 向量数据库5 专用向量数据库的问题总结 数据库管理-第149期 Oracle Vector DB & AI-01&#xff08;20240210&#xf…

车载电子电器架构 —— 电子电气系统车载功能子系统

车载电子电器架构 —— 电子电气系统车载功能子系统 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 本就是小人物&#xff0c;输了就是输了&#xff0c…

290. Word Pattern(单词规律)

题目描述 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 提示: 1 < pattern.length < 300 pa…

蓝桥杯每日一解

可以看看a的ascii码为6532 而A为ascii码为65&#xff0c;大小写相差32位 #include <iostream>using namespace std; int main(){int n;cin >> n;char a;for (int i 1;i<n;i){while(scanf("%c",&a) ! EOF){//无限输入直到输入到空格if(a a || a …

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏10(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言快捷栏绘制UI代码控制快捷列表信息 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中&#xff0c;我们将探索如何制作…

Linux开发工具的使用 (gcc/g++ | gdb)

目录 一、gcc/g 1.关于gcc/g 2.gcc如何使用 gcc选项&#xff1a; 预处理&#xff1a; 编译: 汇编: 连接: 函数库是什么&#xff1a; 函数库分为动态库和静态库两种 二、调试器gdb 1.关于gdb 2. gdb的使用 gdb选项&#xff1a; Linux是一个广泛用于开发的操作系统&…

第二节 zookeeper基础应用与实战

目录 1. Zookeeper命令操作 1.1 Zookeeper 数据模型 1.2 Zookeeper服务端常用命令 1.3 Zookeeper客户端常用命令 1.3.1 基本CRUD 1.3.2 创建临时&顺序节点 2. Zookeeper JavaAPI操作 2.1 Curator介绍 2.2 引入Curator 2.3 建立连接 2.4 添加节点 2.5 修改节点 …

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之AlphabetIndexer组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之AlphabetIndexer组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、AlphabetIndexer组件 可以与容器组件联动用于按逻辑结构快速定位容器显…