音视频入门基础:H.264专题(13)——FFmpeg源码中通过SPS属性获取视频色彩格式的实现
一、引言
通过FFmpeg命令可以获取到H.264裸流文件的色彩格式(又译作色度采样结构、像素格式):

在vlc中也可以获取到色彩格式(vlc底层也使用了FFmpeg进行解码):

这个色彩格式就是之前的文章《音视频入门基础:像素格式专题(4)——YUV简介》中描述的像素格式。所以FFmpeg和vlc是怎样获取到H.264编码的视频的色彩格式呢?它们其实是通过SPS中的属性chroma_format_idc获取的。
二、H.264官方文档对chroma_format_idc的描述
chroma_format_idc属性在H.264官方文档《T-REC-H.264-202108-I!!PDF-E.pdf》第44页中定义:

根据H.264官方文档《T-REC-H.264-202108-I!!PDF-E.pdf》第22页,当chroma_format_idc = 0时,色彩格式为单色;chroma_format_idc = 1时,色彩格式为YUV 4:2:0;chroma_format_idc = 2时,色彩格式为YUV 4:2:2;chroma_format_idc = 3时,色彩格式为YUV 4:4:4:

根据H.264官方文档第74页,chroma_format_idc的值应该在0到3的范围内(包括0和3)。当chroma_format_idc不存在时,应推断其值为1(4:2:0的色度格式)。

也就是说,只有当profile_idc等于下面红框里的这些值时,chroma_format_idc才会存在。如果profile_idc不是这些值,chroma_format_idc的值就是1,表示色彩格式为YUV 4:2:0:

三、计算色彩格式的例子
下面以某个视频文件为例,讲述怎么计算它的色彩格式。用Elecard Stream Analyzer工具打开一个用H.264编码的视频文件,看到其profile_idc值为77。由于profile_idc不是上图红框里的那些值,所以chroma_format_idc值为1,所以该视频的色彩格式为YUV 4:2:0:

用Elecard StreamEye工具可以看到该视频的色彩格式确实为YUV 4:2:0,证明我们的计算是正确的:

四、FFmpeg源码中获取色彩格式的实现
从文章《音视频入门基础:H.264专题(10)——FFmpeg源码中,存放SPS属性的结构体和解码SPS的函数分析》中,我们可以知道,FFmpeg源码中通过ff_h264_decode_seq_parameter_set函数解码SPS,从而拿到SPS中的属性。
在ff_h264_decode_seq_parameter_set函数中有如下代码,通过下面的这部分代码拿到SPS中的chroma_format_idc:
int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx,H264ParamSets *ps, int ignore_truncation)
{//...if (sps->profile_idc == 100 || // High profilesps->profile_idc == 110 || // High10 profilesps->profile_idc == 122 || // High422 profilesps->profile_idc == 244 || // High444 Predictive profilesps->profile_idc == 44 || // Cavlc444 profilesps->profile_idc == 83 || // Scalable Constrained High profile (SVC)sps->profile_idc == 86 || // Scalable High Intra profile (SVC)sps->profile_idc == 118 || // Stereo High profile (MVC)sps->profile_idc == 128 || // Multiview High profile (MVC)sps->profile_idc == 138 || // Multiview Depth High profile (MVCD)sps->profile_idc == 144) { // old High444 profilesps->chroma_format_idc = get_ue_golomb_31(gb);//...}else {sps->chroma_format_idc = 1;//...}//...
}
然后在FFmpeg源码的源文件libavcodec/h264_parser.c的parse_nal_units函数中,通过如下代码,得到色彩格式:
static inline int parse_nal_units(AVCodecParserContext *s,AVCodecContext *avctx,const uint8_t * const buf, int buf_size)
{//...for (;;) {switch (nal.type) {case H264_NAL_SPS:ff_h264_decode_seq_parameter_set(&nal.gb, avctx, &p->ps, 0);break;//...case H264_NAL_IDR_SLICE://...switch (sps->bit_depth_luma) {case 9:if (sps->chroma_format_idc == 3) s->format = AV_PIX_FMT_YUV444P9;else if (sps->chroma_format_idc == 2) s->format = AV_PIX_FMT_YUV422P9;else s->format = AV_PIX_FMT_YUV420P9;break;case 10:if (sps->chroma_format_idc == 3) s->format = AV_PIX_FMT_YUV444P10;else if (sps->chroma_format_idc == 2) s->format = AV_PIX_FMT_YUV422P10;else s->format = AV_PIX_FMT_YUV420P10;break;case 8:if (sps->chroma_format_idc == 3) s->format = AV_PIX_FMT_YUV444P;else if (sps->chroma_format_idc == 2) s->format = AV_PIX_FMT_YUV422P;else s->format = AV_PIX_FMT_YUV420P;break;default:s->format = AV_PIX_FMT_NONE;}//... }//...}
}
相关文章:
音视频入门基础:H.264专题(13)——FFmpeg源码中通过SPS属性获取视频色彩格式的实现
一、引言 通过FFmpeg命令可以获取到H.264裸流文件的色彩格式(又译作色度采样结构、像素格式): 在vlc中也可以获取到色彩格式(vlc底层也使用了FFmpeg进行解码): 这个色彩格式就是之前的文章《音视频入门基础…...
WEB前端05-JavaScrip基本对象
JavaScript对象 1.Function对象 函数的创建 //方法一:自定义函数 function 函数名([参数]) {函数体[return 表达式] }//方法二:匿名函数 (function([参数]) {函数体[return 表达式] }); **使用场景一:定义后直接调用使用(只使用一次) (fun…...
新手教学系列——简单的服务配置项集中管理
前言 在开发和运维过程中,配置管理是一个非常重要但经常被忽视的环节。常用的配置文件格式包括env、ini和yaml等,它们非常适合模块级别的系统配置,尤其是一些敏感信息的配置,例如数据库连接字符串和密码等。但是,对于…...
《0基础》学习Python——第十三讲__面向对象
<类(class)> 一、面向对象概念 1、面向对象是一种编程思想和技术,它是一种将程序设计问题分解成对象的方式。每个对象都有自己的状态(数据)和行为(方法),并且可以通过相互之间…...
前端JS特效第42波:纯CSS实现的卡片切换效果
纯CSS实现的卡片切换效果,先来看看效果: 部分核心的代码如下: <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"utf-8"><title>纯CSS实现的卡片切换效果演示</title><l…...
2.10、matlab中字符、数字、矩阵、字符串和元胞合并为字符串并将字符串以不同格式写入读出excel
1、前言 在 MATLAB 中,可以使用不同的数据类型(字符、数字、矩阵、字符串和元胞)合并为字符串,然后将字符串以不同格式写入 Excel 文件。 以下是一个示例代码,展示如何将不同数据类型合并为字符串,并以不…...
中文科技核心论文发表
中文科技核心论文题目如下: 1.混凝土结构用纤维增强塑料筋的耐久性评述:适合建筑、结构、材料等专业 2.建筑工程用阻燃塑料的研究进展:适合建筑、材料专业 3.纤维增强热塑性塑料在面部护具中的应用研究:适合化工、医学、材料等专…...
使用 Flask 3 搭建问答平台(一):项目结构搭建
一、项目基本结构 二、app.py from flask import Flask import config from exts import db from models import UserModel from blueprints.qa import bp as qa_bp from blueprints.auth import bp as auth_bp# 创建一个Flask应用实例,__name__参数帮助Flask确定应…...
力扣经典题目之->用队列实现栈 的详细讲解和实现,看这一篇就够了!
一:题目 二:思路 1:先看两个概念: 更清晰的对比: 理解这两张图的不同对题目的一个函数( 返回栈顶元素) 会更好做 由图可知 : 返回栈顶函数即返回队列队尾即可 2:题…...
[JS]认识feach
介绍 feach是浏览器内置的api, 用于发送网络请求 请求方式对比 AJAX: 基于XMLHttpRequest接收请求, 使用繁琐Axios: 基于Promise的请求客户端, 在浏览器和node中均可使用, 使用简单fetch: 浏览器内置的api, 基于Promise, 功能简单 基础语法 <body><button>发请求…...
tomcat如何进行调优?
从两个方面考虑:内存和线程 首先启动Tomcat,实际上就是启动了一个JVM,所以可以按JVM调优的方式来进行调整,从而达到Tomcat优化的目的。 另外Tomcat中设计了一些缓存区,比如appReadBufSize、bufferPoolSize等缓存区来提…...
复现GMM文章(一):图1代码和数据
介绍 复现GMM文章的的Fig1图。 加载R包 library(tidyr)library(tidyverse)library(dplyr)library(ggsci)library(ggpubr)导入数据 所有的数据可以通过下列链接下载: 百度网盘链接: https://pan.baidu.com/s/1isKEK1G5I6X90KYqLufmWw 提取码: t9ca 图1B 数据 …...
链接追踪系列-07.logstash安装json_lines插件
进入docker中的logstash 容器内: jelexbogon ~ % docker exec -it 7ee8960c99a31e607f346b2802419b8b819cc860863bc283cb7483bc03ba1420 /bin/sh $ pwd /usr/share/logstash $ ls bin CONTRIBUTORS Gemfile jdk logstash-core modules tools x-pack …...
火山引擎数据飞轮实践:在电商场景中,如何建设全链路数据血缘?
数据作为新型生产要素,正支撑企业的数智化转型。但企业数字化建设也存在管理成本高、数据产品使用门槛高、数据资产价值不够的问题,其原因在于业务和数据之间没有形成双向良性驱动。 结合新时代企业数字化转型需求,火山引擎基于字节跳动十余…...
使用加密软件对企业来说有什么好处
泄密时间近年来层出不穷,一旦重要文件或数据被盗,无疑会对企业带来巨大的损失。 2024年3月,我国某高新科技企业遭境外黑客攻击,相关信息化系统及数据被加密锁定,生产经营活动被迫停止。企业生产经营活动受阻ÿ…...
STM32入门开发操作记录(二)——LED与蜂鸣器
目录 一、工程模板二、点亮主板1. 配置寄存器2. 调用库函数 三、LED1. 闪烁2. 流水灯 四、蜂鸣器 一、工程模板 参照第一篇,新建工程目录ProjectMould,将先前打包好的Start,Library和User文件^C^V过来,并在Keil5内完成器件支持包的…...
n3.平滑升级和回滚
平滑升级和回滚 1. 平滑升级流程2. 平滑升级和回滚案例 有时候我们需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时 Nginx又在跑着业务无法停掉,这时我们就可能选择平滑升级 1. 平滑升级流程 平…...
C#WPF DialogHost.Show 弹出对话框并返回数据
在WPF中,使用DialogHost.Show方法显示一个对话框并获取返回数据,你需要定义一个对话框,并在对话框关闭时返回数据。以下是一个简单的例子: 首先,在主窗口中添加DialogHost控件: <MaterialDesign:DialogHost x:Name="dialogHost" /> 然后,创建一个对话…...
Kafka Producer发送消息流程之分区器和数据收集器
文章目录 1. Partitioner分区器2. 自定义分区器3. RecordAccumulator数据收集器 1. Partitioner分区器 clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java,中doSend方法,记录了生产者将消息发送的流程,其中有一步…...
Codeforces Round 958 (Div. 2)
C o d e f o r c e s R o u n d 958 ( D i v . 2 ) \Huge{Codeforces Round 958 (Div. 2)} CodeforcesRound958(Div.2) 文章目录 Problems A. Split the Multiset题意思路标程 Problems B. Make Majority题意思路标程 Problems C. Increasing Sequence with Fixed OR题意思路标…...
利用快马平台AI快速构建游戏cc switch功能原型,十分钟实现创意验证
利用快马平台AI快速构建游戏cc switch功能原型 最近在开发一个小型游戏项目时,遇到了一个常见需求:需要快速测试和切换各种游戏功能。比如在调试阶段,可能需要临时开启无敌模式、无限弹药等功能。传统做法是为每个功能单独写调试代码&#x…...
Llama-3.2-3B入门指南:Ollama部署详解,从安装到生成第一段文字
Llama-3.2-3B入门指南:Ollama部署详解,从安装到生成第一段文字 1. 认识Llama-3.2-3B:轻量级多语言文本生成专家 Llama-3.2-3B是Meta公司推出的开源大语言模型,属于Llama 3.2系列中的3B参数版本。这个模型特别适合需要快速响应和…...
intv_ai_mk11开源可部署实践:支持Webhook回调,可对接企业微信/钉钉/飞书通知
intv_ai_mk11开源可部署实践:支持Webhook回调,可对接企业微信/钉钉/飞书通知 1. 项目概述 intv_ai_mk11是一款基于Llama架构的AI对话机器人,拥有7B参数规模,能够运行在GPU服务器上。这个开源项目不仅提供了强大的对话能力&#…...
2024电子数据取证实战:从手机取证到恶意APP逆向分析
1. 手机取证实战入门:从ADB到蓝牙MAC地址追踪 手机取证是电子数据取证中最常见的场景之一。去年我参与处理的一起案件中,嫌疑人通过恶意APP窃取了受害者通讯录,当时就是通过ADB连接记录锁定了关键证据。先说说ADB这个基础但极其重要的工具。 …...
资源提取高效解析与跨设备管理:猫抓浏览器扩展的技术实践
资源提取高效解析与跨设备管理:猫抓浏览器扩展的技术实践 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字化内容爆炸的今天&…...
从ET1100迁移到AX58100:我的EtherCAT从站代码需要重写多少?
从ET1100迁移到AX58100:EtherCAT从站代码重构实战指南 当你的产品线需要从百兆升级到千兆EtherCAT网络,或者要支持时间敏感网络(TSN)功能时,从经典的ET1100切换到AX58100几乎是必然选择。但作为经历过完整迁移周期的开发者,我必须…...
5分钟学会OrgChart:从零开始创建动态组织图
5分钟学会OrgChart:从零开始创建动态组织图 【免费下载链接】OrgChart Its a simple and direct organization chart plugin. Anytime you want a tree-like chart, you can turn to OrgChart. 项目地址: https://gitcode.com/gh_mirrors/or/OrgChart 如果你…...
Phi-4-mini-reasoning推理模型Python入门实战:3步完成环境部署与基础调用
Phi-4-mini-reasoning推理模型Python入门实战:3步完成环境部署与基础调用 1. 开篇:为什么选择Phi-4-mini-reasoning 如果你刚接触大模型推理,可能会被各种复杂的部署流程吓到。Phi-4-mini-reasoning作为一款轻量级开源推理模型,…...
LockSupport深度解析:线程阻塞与唤醒的底层实现原理
在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...
Kook Zimage 真实幻想 Turbo在软件测试中的应用:自动化UI设计验证
Kook Zimage 真实幻想 Turbo在软件测试中的应用:自动化UI设计验证 1. 引言:UI设计验证的痛点与机遇 在软件开发流程中,UI设计验证一直是个让人头疼的环节。测试人员需要对照设计稿,逐个像素检查界面元素的位置、颜色、字体和布局…...
