ffmpeg7.0 flv支持hdr
ffmpeg7.0 flv支持hdr
自从ffmpeg6.0应用enhance rtmp支持h265/av1的flv格式后,7.0迎来了flv的hdr能力。本文介绍ffmpeg7.0如何支持hdr in flv。
如果对enhance rtmp如何支持h265不了解,推荐详解Enhanced-RTMP支持H.265
1. enhance rtmp关于hdr
文档enhance-rtmp-v2.md中,metadata-frame章节规定相关支持HDR部分。
定义一个新的VideoPacketType.Metadata,其内容为AMF格式的metadata(AMF是一种简便的描述格式,非常节省内存),具体内部有HDR相关的colorInfo数据(每次hdr参数更新的时候,就发送该metadata)。
type ColorInfo = {colorConfig: {// number of bits used to record the color channels for each pixelbitDepth: number, // SHOULD be 8, 10 or 12//// colorPrimaries, transferCharacteristics and matrixCoefficients are defined // in ISO/IEC 23091-4/ITU-T H.273. The values are an index into // respective tables which are described in “Colour primaries”, // "Transfer characteristics" and "Matrix coefficients" sections. // It is RECOMMENDED to provide these values.//// indicates the chromaticity coordinates of the source color primariescolorPrimaries: number, // enumeration [0-255]// opto-electronic transfer characteristic function (ex. PQ, HLG)transferCharacteristics: number, // enumeration [0-255]// matrix coefficients used in deriving luma and chroma signalsmatrixCoefficients: number, // enumeration [0-255]},hdrCll: {//// maximum value of the frame average light level// (in 1 cd/m2) of the entire playback sequence//maxFall: number, // [0.0001-10000]//// maximum light level of any single pixel (in 1 cd/m2)// of the entire playback sequence//maxCLL: number, // [0.0001-10000]},//// The hdrMdcv object defines mastering display (i.e., where// creative work is done during the mastering process) color volume (a.k.a., mdcv)// metadata which describes primaries, white point and min/max luminance. The// hdrMdcv object SHOULD be provided.//// Specification of the metadata along with its ranges adhere to the// ST 2086:2018 - SMPTE Standard (except for minLuminance see// comments below)//hdrMdcv: {//// Mastering display color volume (mdcv) xy Chromaticity Coordinates within CIE// 1931 color space.//// Values SHALL be specified with four decimal places. The x coordinate SHALL// be in the range [0.0001, 0.7400]. The y coordinate SHALL be // in the range [0.0001, 0.8400].//redX: number,redY: number,greenX: number,greenY: number,blueX: number,blueY: number,whitePointX: number,whitePointY: number,//// max/min display luminance of the mastering display (in 1 cd/m2 ie. nits)//// note: ST 2086:2018 - SMPTE Standard specifies minimum display mastering// luminance in multiples of 0.0001 cd/m2.// // For consistency we specify all values// in 1 cd/m2. Given that a hypothetical perfect screen has a peak brightness// of 10,000 nits and a black level of .0005 nits we do not need to// switch units to 0.0001 cd/m2 to increase resolution on the lower end of the// minLuminance property. The ranges (in nits) mentioned below suffice// the theoretical limit for Mastering Reference Displays and adhere to the// SMPTE ST 2084 standard (a.k.a., PQ) which is capable of representing full gamut// of luminance level.//maxLuminance: number, // [5-10000]minLuminance: number, // [0.0001-5]},
}
2. flv mux
在libavformat/flvenc.c中,新增flv_write_metadata_packet函数,用于添加metadata。
flv的数据结构:
typedef struct FLVContext {.....int metadata_pkt_written;//0: 还未写过,需要写;1: 写过了,不需要写。
} FLVContext;
在函数flv_write_metadata_packet中实现,见注释:
static void flv_write_metadata_packet(AVFormatContext *s, AVCodecParameters *par, unsigned int ts) {FLVContext *flv = s->priv_data;//不需要写入,就返回;可以通过设置这个标志变量来使能/去使能更新写metadataif (flv->metadata_pkt_written)return;//支持h265, av1, vp9if (par->codec_id == AV_CODEC_ID_HEVC || par->codec_id == AV_CODEC_ID_AV1 || par->codec_id == AV_CODEC_ID_VP9) {......//写入tag头,标识其为视频avio_w8(pb, FLV_TAG_TYPE_VIDEO); //write video tag typemetadata_size_pos = avio_tell(pb);avio_wb24(pb, 0 + flags_size);put_timestamp(pb, ts); //ts = pkt->dts, genavio_wb24(pb, flv->reserved);//根据enhance rtmp标志,写入FLV_IS_EX_HEADER标识,和fourCC的字段(hvc1 or av01 or vp09)if (par->codec_id == AV_CODEC_ID_HEVC) {avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeMetadata| FLV_FRAME_VIDEO_INFO_CMD); // ExVideoTagHeader mode with PacketTypeMetadataavio_write(pb, "hvc1", 4);} else if (par->codec_id == AV_CODEC_ID_AV1 || par->codec_id == AV_CODEC_ID_VP9) {avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeMetadata| FLV_FRAME_VIDEO_INFO_CMD);avio_write(pb, par->codec_id == AV_CODEC_ID_AV1 ? "av01" : "vp09", 4);}//下面为写入AMF格式的hdr相关的colorInfo数据avio_w8(pb, AMF_DATA_TYPE_STRING);put_amf_string(pb, "colorInfo");avio_w8(pb, AMF_DATA_TYPE_OBJECT);put_amf_string(pb, "colorConfig"); // colorConfigavio_w8(pb, AMF_DATA_TYPE_OBJECT);if (par->color_trc != AVCOL_TRC_UNSPECIFIED &&par->color_trc < AVCOL_TRC_NB) {put_amf_string(pb, "transferCharacteristics"); // color_trcput_amf_double(pb, par->color_trc);}if (par->color_space != AVCOL_SPC_UNSPECIFIED &&par->color_space < AVCOL_SPC_NB) {put_amf_string(pb, "matrixCoefficients"); // colorspaceput_amf_double(pb, par->color_space);}if (par->color_primaries != AVCOL_PRI_UNSPECIFIED &&par->color_primaries < AVCOL_PRI_NB) {put_amf_string(pb, "colorPrimaries"); // color_primariesput_amf_double(pb, par->color_primaries);}put_amf_string(pb, "");avio_w8(pb, AMF_END_OF_OBJECT);if (lightMetadata) {put_amf_string(pb, "hdrCll");avio_w8(pb, AMF_DATA_TYPE_OBJECT);put_amf_string(pb, "maxFall");put_amf_double(pb, lightMetadata->MaxFALL);put_amf_string(pb, "maxCLL");put_amf_double(pb, lightMetadata->MaxCLL);put_amf_string(pb, "");avio_w8(pb, AMF_END_OF_OBJECT);}if (displayMetadata && (displayMetadata->has_primaries || displayMetadata->has_luminance)) {put_amf_string(pb, "hdrMdcv");avio_w8(pb, AMF_DATA_TYPE_OBJECT);if (displayMetadata->has_primaries) {put_amf_string(pb, "redX");put_amf_double(pb, av_q2d(displayMetadata->display_primaries[0][0]));put_amf_string(pb, "redY");put_amf_double(pb, av_q2d(displayMetadata->display_primaries[0][1]));put_amf_string(pb, "greenX");put_amf_double(pb, av_q2d(displayMetadata->display_primaries[1][0]));put_amf_string(pb, "greenY");put_amf_double(pb, av_q2d(displayMetadata->display_primaries[1][1]));put_amf_string(pb, "blueX");put_amf_double(pb, av_q2d(displayMetadata->display_primaries[2][0]));put_amf_string(pb, "blueY");put_amf_double(pb, av_q2d(displayMetadata->display_primaries[2][1]));put_amf_string(pb, "whitePointX");put_amf_double(pb, av_q2d(displayMetadata->white_point[0]));put_amf_string(pb, "whitePointY");put_amf_double(pb, av_q2d(displayMetadata->white_point[1]));}if (displayMetadata->has_luminance) {put_amf_string(pb, "maxLuminance");put_amf_double(pb, av_q2d(displayMetadata->max_luminance));put_amf_string(pb, "minLuminance");put_amf_double(pb, av_q2d(displayMetadata->min_luminance));}put_amf_string(pb, "");avio_w8(pb, AMF_END_OF_OBJECT);}put_amf_string(pb, "");avio_w8(pb, AMF_END_OF_OBJECT);flv->metadata_pkt_written = 1;//标识写过了}
}
其中HDR的数据来源为AVCodecParameters *par数据结构中的内容:
typedef struct AVCodecParameters {..../*** Video only. Additional colorspace characteristics.*/enum AVColorRange color_range;enum AVColorPrimaries color_primaries;enum AVColorTransferCharacteristic color_trc;enum AVColorSpace color_space;enum AVChromaLocation chroma_location;/** 类型: AV_PKT_DATA_CONTENT_LIGHT_LEVEL, 数据: AVContentLightMetadata* lightMetadata* 类型: AV_PKT_DATA_MASTERING_DISPLAY_METADATA, 数据: AVMasteringDisplayMetadata *displayMetadata*/AVPacketSideData *coded_side_data;....
}
3. flv demux
解析函数在libavformat/flvdec.c文件中,函数amf_parse_object中。
static int amf_parse_object(AVFormatContext *s, AVStream *astream,AVStream *vstream, const char *key,int64_t max_pos, int depth)
{FLVMetaVideoColor *meta_video_color = flv->metaVideoColor;......if (meta_video_color) {if (amf_type == AMF_DATA_TYPE_NUMBER ||amf_type == AMF_DATA_TYPE_BOOL) {if (!strcmp(key, "colorPrimaries")) {meta_video_color->primaries = num_val;} else if (!strcmp(key, "transferCharacteristics")) {meta_video_color->transfer_characteristics = num_val;} else if (!strcmp(key, "matrixCoefficients")) {meta_video_color->matrix_coefficients = num_val;} else if (!strcmp(key, "maxFall")) {meta_video_color->max_fall = num_val;} else if (!strcmp(key, "maxCLL")) {meta_video_color->max_cll = num_val;} else if (!strcmp(key, "redX")) {meta_video_color->mastering_meta.r_x = num_val;} else if (!strcmp(key, "redY")) {meta_video_color->mastering_meta.r_y = num_val;} else if (!strcmp(key, "greenX")) {meta_video_color->mastering_meta.g_x = num_val;} else if (!strcmp(key, "greenY")) {meta_video_color->mastering_meta.g_y = num_val;} else if (!strcmp(key, "blueX")) {meta_video_color->mastering_meta.b_x = num_val;} else if (!strcmp(key, "blueY")) {meta_video_color->mastering_meta.b_y = num_val;} else if (!strcmp(key, "whitePointX")) {meta_video_color->mastering_meta.white_x = num_val;} else if (!strcmp(key, "whitePointY")) {meta_video_color->mastering_meta.white_y = num_val;} else if (!strcmp(key, "maxLuminance")) {meta_video_color->mastering_meta.max_luminance = num_val;} else if (!strcmp(key, "minLuminance")) {meta_video_color->mastering_meta.min_luminance = num_val;}}}......
}
4. 感谢Zhu Pengfei的提交
Author: Zhu Pengfei <411294962@qq.com>
Date: Mon Mar 4 21:52:04 2024 +0800avformat/flvenc: support enhanced flv PacketTypeMetadataSigned-off-by: Zhu Pengfei <411294962@qq.com>Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
``
相关文章:
ffmpeg7.0 flv支持hdr
ffmpeg7.0 flv支持hdr 自从ffmpeg6.0应用enhance rtmp支持h265/av1的flv格式后,7.0迎来了flv的hdr能力。本文介绍ffmpeg7.0如何支持hdr in flv。 如果对enhance rtmp如何支持h265不了解,推荐详解Enhanced-RTMP支持H.265 1. enhance rtmp关于hdr 文档…...

【教程】极简Python接入免费语音识别API
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,请不吝给个[点赞、收藏、关注]哦~ 安装库: pip install SpeechRecognition 使用方法: import speech_recognition as srr sr.Recognizer() harvard sr…...

详解typora配置亚马逊云科技Amazon S3图床
欢迎免费试用亚马逊云科技产品:https://mic.anruicloud.com/url/1333 当前有很多不同的博客社区,不同的博客社区使用的编辑器也不尽相同,大概可以分为两种,一种是markdown格式,另外一种是富文本格式。例如华为云开发者…...

Python sqlite3库 实现 数据库基础及应用 输入地点,可输出该地点的爱国主义教育基地名称和批次的查询结果。
目录 【第11次课】实验十数据库基础及应用1-查询 要求: 提示: 运行结果: 【第11次课】实验十数据库基础及应用1-查询 声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 1.简答题 数据库文件Edu_Base.db&#…...
iOS-SSL固定证书
文章目录 1. SSL简介2. 证书锁定原理1.1 证书锁定1.2 公钥锁定1.3 客户端获取公钥1.4 客户端使用SSL锁定选择1.5 项目支持SSL证书锁定1.6 问题记录1. SSL简介 证书锁定(SSL/TLS Pinning)顾名思义,将服务器提供的SSL/TLS证书内置到移动端开发的APP客户端中,当客户端发起请求…...
docker 开启 tcp 端口
前言:查了很多网上资料 都说要修改daemons,json 完全不管用,而且还导致添加 {“host”:["tcp://0.0.0.0:2375","unix:///var/lib/docker.sock"]} 后,docker restart 失败,浪费了不少时间 !&am…...
zookeeper之分布式环境搭建
ZooKeeper的分布式环境搭建是一个涉及多个步骤的过程,主要包括准备工作、安装ZooKeeper、配置集群、启动服务以及验证集群状态。以下是搭建ZooKeeper分布式环境的基本步骤: 1. 准备工作 确保所有节点的系统时间同步。确保所有节点之间网络互通…...
java设计模式三
工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。工厂模式有几种变体,包括简单工厂模式、工厂方法模式和抽象工厂模式。下面通过一个简化的案例和对Java标准库中使用工厂模式的源码分析来说明这一模…...

##12 深入了解正则化与超参数调优:提升神经网络性能的关键策略
文章目录 前言1. 正则化技术的重要性1.1 L1和L2正则化1.2 Dropout1.3 批量归一化 2. 超参数调优技术2.1 网格搜索2.2 随机搜索2.3 贝叶斯优化 3. 实践案例3.1 设置实验3.2 训练和测试 4. 结论 前言 在深度学习中,构建一个高性能的模型不仅需要一个好的架构…...

TODESK怎么查看有人在远程访问
odesk怎么查看有人在远程访问 Todesk作为一款远程桌面控制软件,为用户提供了便捷的远程访问与控制功能。但在享受这种便利的同时,许多用户也关心如何确保自己设备的安全,特别是如何知道是否有人在未经授权的情况下远程访问自己的电脑。本文将…...
【Web漏洞指南】服务器端 XSS(动态 PDF)
【Web漏洞指南】服务器端 XSS(动态 PDF) 概述流行的 PDF 生成工具常见攻击载荷 概述 如果一个网页使用用户控制的输入创建 PDF,您可以尝试欺骗创建 PDF 的机器人以执行任意的 JS 代码。 因此,如果PDF 创建机器人发现某种HTML标签…...
Qt中的对象树
一. QT对象树的概念 QObject 的构造函数中会传入一个 Parent 父对象指针,children() 函数返回 QObjectList。即每一个 QObject 对象有且仅有一个父对象,但可以有很多个子对象。 那么Qt这样设计的好处是什么呢?很简单,就是为了方…...

QT-day1
1、 自由发挥应用场景,实现登录界面。 要求:尽量每行代码都有注释。 #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QIcon>//窗口 #include <QLabel>//标签库 #include <QMovie>//动态图片库 #include…...

安装oh-my-zsh(命令行工具)
文章目录 一、安装zsh、git、wget二、安装运行脚本1、curl/wget下载2、手动下载 三、切换主题1、编辑配置文件2、切换主题 四、安装插件1、zsh-syntax-highlighting(高亮语法错误)2、zsh-autosuggestions(自动补全) 五、更多优化配…...

解决方案:‘Series‘ object has no attribute ‘xxxx‘
文章目录 一、现象二、解决方案 一、现象 ...... model.fit(X_train, y_train) y_pred model.predict(X_test) recall recall_score(y_test, y_pred) precision precision_score(y_test. y_pred) ......执行语句到**“precision precision_score(y_test. y_pred)”**这里发…...

智慧手术室手麻系统源码,C#手术麻醉临床信息系统源码,符合三级甲等医院评审要求
手麻系统全套源码,C#手术麻醉系统源码,支持二次开发,授权后可商用。 手术麻醉临床信息系统功能符合三级甲等医院评审要求,实现与医院现有信息系统如HIS、LIS、PACS、EMR等系统全面对接,全面覆盖从患者入院,…...
项目公共组件代码
弹出框标题 <Textstyle{{marginTop: 20,marginBottom: 5,fontSize: 20,textAlign: center,fontWeight: bold,color: black,}}>{data.language.CROUPLIST_CLASS_MEMBERS}</Text>可以复用的公共体 import React, {useContext, useEffect, useState} from react; imp…...

深入解析MySQL中的事务(上)
MySQL事务管理 一、事务的基本概念为什么需要事务?1. 数据完整性2. 并发控制3. 错误恢复4. 复杂业务逻辑的支持5. 安全性 为什么会出现事务查看引擎是否支持事务事务提交方式自动提交(Automatic Commit)手动提交(Manual Commit&am…...

Springboot项目使用redis实现session共享
1.安装redis,并配置密码 这里就不针对于redis的安装约配置进行说明了,直接在项目中使用。 redis在windows环境下安装:Window下Redis的安装和部署详细图文教程(Redis的安装和可视化工具的使用)_redis安装-CSDN博客 2…...

【Linux】Centos7安装部署unimrcp,搭建MRCP服务器
yum install libtool yum install libtool-ltdl-devel yum install libsofia-sip-ua find / -name libsofia-sip-ua.so.0 2>/dev/null # 设置环境变量:如果库文件存在但不在默认搜索路径中,你可以通过设置 LD_LIBRARY_PATH 环境变量来告诉系统在哪…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...

PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...