音视频入门基础:MPEG2-TS专题(21)——FFmpeg源码中,获取TS流的视频信息的实现

一、引言

通过FFmpeg命令可以获取到TS文件/TS流的视频压缩编码格式、色彩格式(像素格式)、分辨率、帧率信息:

./ffmpeg -i XXX.ts

本文以H.264为例讲述FFmpeg到底是从哪个地方获取到这些视频信息的。 

二、视频压缩编码格式

FFmpeg获取TS文件/TS流的视频压缩编码格式,是从PMT表的stream_type属性中获取的。由《音视频入门基础:MPEG2-TS专题(16)——PMT简介》可以知道,TS文件/TS流的PMT表中存在一个占8位的stream_type属性,表示媒体流的类型,即音视频压缩编码格式:

由《音视频入门基础:MPEG2-TS专题(17)——FFmpeg源码中,解析TS program map section的实现》可以知道,FFmpeg源码中使用pmt_cb函数解析PMT表中的TS program map section。pmt_cb函数会通过下面代码块将stream_type属性提取出来,赋值给变量stream_type:

    for (i = 0; i < MAX_STREAMS_PER_PROGRAM; i++) {st = 0;pes = NULL;stream_type = get8(&p, p_end);if (stream_type < 0)break;//...
}

然后pmt_cb函数中,会调用mpegts_set_stream_info函数:

        if (pes && !pes->stream_type)mpegts_set_stream_info(st, pes, stream_type, prog_reg_desc);

mpegts_set_stream_info函数内部又会将上述得到的stream_type属性赋值给变量pes->stream_type,然后调用mpegts_find_stream_type函数:

static int mpegts_set_stream_info(AVStream *st, PESContext *pes,uint32_t stream_type, uint32_t prog_reg_desc)
{
//...pes->stream_type = stream_type;
//...mpegts_find_stream_type(st, pes->stream_type, ISO_types);
//...
}

mpegts_find_stream_type函数代码如下:

static void mpegts_find_stream_type(AVStream *st,uint32_t stream_type,const StreamType *types)
{FFStream *const sti = ffstream(st);for (; types->stream_type; types++)if (stream_type == types->stream_type) {if (st->codecpar->codec_type != types->codec_type ||st->codecpar->codec_id   != types->codec_id) {st->codecpar->codec_type = types->codec_type;st->codecpar->codec_id   = types->codec_id;sti->need_context_update = 1;}sti->request_probe = 0;return;}
}

ISO_types是一个数组,根据上述表格将stream_type属性和音视频压缩编码格式对应起来。所以调用mpegts_find_stream_type函数后,st->codecpar->codec_type,即AVCodecParameters的codec_id会得到该stream_type属性对应的音视频压缩编码格式。比如stream_type的值为0x1B,那对应的视频压缩编码格式就是H.264:

static const StreamType ISO_types[] = {{ 0x01, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_MPEG2VIDEO },{ 0x02, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_MPEG2VIDEO },{ 0x03, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_MP3        },{ 0x04, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_MP3        },{ 0x0f, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AAC        },{ 0x10, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_MPEG4      },/* Makito encoder sets stream type 0x11 for AAC,* so auto-detect LOAS/LATM instead of hardcoding it. */
#if !CONFIG_LOAS_DEMUXER{ 0x11, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AAC_LATM   }, /* LATM syntax */
#endif{ 0x1b, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_H264       },{ 0x1c, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AAC        },{ 0x20, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_H264       },{ 0x21, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_JPEG2000   },{ 0x24, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_HEVC       },{ 0x33, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VVC        },{ 0x42, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_CAVS       },{ 0xd1, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_DIRAC      },{ 0xd2, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_AVS2       },{ 0xd4, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_AVS3       },{ 0xea, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VC1        },{ 0 },
};

然后在pmt_cb函数外部,通过avcodec_parameters_to_context函数将AVCodecParameters的codec_id赋值给AVCodecContext的codec_id:

int avcodec_parameters_to_context(AVCodecContext *codec,const AVCodecParameters *par)
{
//...codec->codec_id   = par->codec_id;
//...
}

然后在dump_stream_format函数中,通过avcodec_string函数中的语句:codec_name = avcodec_get_name(enc->codec_id) 拿到AVCodecContext的codec_id对应的视频压缩编码格式名称。最后再在dump_stream_format函数中将视频压缩编码格式打印出来:

void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
{
//...codec_name = avcodec_get_name(enc->codec_id);
//...
}

所以FFmpeg获取TS文件/TS流的视频压缩编码格式,是根据PMT表的stream_type属性获取的:

三、视频压缩编码格式的profile

如果TS文件/TS流中的视频压缩编码格式为H.264,FFmpeg获取其视频压缩编码格式的profile,是通过SPS的profile_idc属性获取到的,具体可以参考:《音视频入门基础:H.264专题(17)——FFmpeg源码中,获取H.264视频的profile的实现》:

四、视频的色彩格式

如果TS文件/TS流中的视频压缩编码格式为H.264,FFmpeg获取其视频的色彩格式,是通过SPS中的属性chroma_format_idc获取到的,具体可以参考:《音视频入门基础:H.264专题(13)——FFmpeg源码中通过SPS属性获取视频色彩格式的实现》:

五、视频分辨率

如果TS文件/TS流中的视频压缩编码格式为H.264,FFmpeg获取其视频分辨率,是通过SPS中的属性获取的,具体可以参考:《音视频入门基础:H.264专题(12)——FFmpeg源码中通过SPS属性计算视频分辨率的实现》:

六、视频码率

由于TS文件/TS流的文件格式(包括TS Header、PES packet header)不包含视频码率信息,所以无法通过FFmpeg直接获取到其视频码率。与之对应,由于FLV文件的Script Tag中包含视频码率信息,所以FFmpeg可以直接打印FLV文件的视频码率,具体可以参考:《音视频入门基础:FLV专题(24)——FFmpeg源码中,获取FLV文件视频信息的实现》。

七、视频帧率

如果TS文件/TS流中的视频压缩编码格式为H.264,对其视频进行编解码时,FFmpeg源码内部使用的是通过SPS中的属性计算得到的视频帧率(具体可以参考:《音视频入门基础:H.264专题(15)——FFmpeg源码中通过SPS属性获取视频帧率的实现》)。

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

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

相关文章

BenchmarkSQL使用教程

1. TPC-C介绍 Transaction Processing Performance Council (TPC) 事务处理性能委员会&#xff0c;是一家非盈利IT组织&#xff0c;他们的目的是定义数据库基准并且向产业界推广可验证的数据库性能测试。而TPC-C最后一个C代表的是压测模型的版本&#xff0c;在这之前还有TPC-A、…

火山引擎发布数据飞轮 2.0,AI 重塑企业数据消费

12 月 18 日&#xff0c;在 2024 冬季火山引擎 FORCE 原动力大会上&#xff0c;火山引擎数智平台&#xff08;VeDI&#xff09;正式升级发布数据飞轮 2.0 模式。 延续去年 4 月发布的数据飞轮“以数据消费促资产建设&#xff0c;以数据消费助业务发展”的核心内涵&#xff0c;…

LLaMA-Factory 单卡3080*2 deepspeed zero3 微调Qwen2.5-7B-Instruct

环境安装 git clone https://gitcode.com/gh_mirrors/ll/LLaMA-Factory.git 下载模型 pip install modelscope modelscope download --model Qwen/Qwen2.5-7B-Instruct --local_dir /root/autodl-tmp/models/Qwen/Qwen2.5-7B-Instruct 微调 llamafactory-cli train \--st…

合并比对学习资料

目录 ContractComparison已开源: ContractComparison已开源: GitHub - UnstoppableCurry/ContractComparison: Comparison of General Chinese Contracts with OCR Pytorch

全速下载 50M/S,不限速下载就是香

近几年来虽说各大网盘层出不穷&#xff0c;各有乾坤&#xff0c;而这其中某些网盘对于网速限制非常严重&#xff0c;这也是很多小伙伴一直吐槽的点&#xff0c;并且某些网盘下载文件还需要安装客户端&#xff0c;并且每家的限速方式不同&#xff0c;有的限速取决于文件大小&…

回归预测 | MATLAB实现CNN-BiGRU-Attention卷积神经网络结合双向门控循环单元融合注意力机制多输入单输出回归预测

回归预测 | MATLAB实现CNN-BiGRU-Attention卷积神经网络结合双向门控循环单元融合注意力机制多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-BiGRU-Attention卷积神经网络结合双向门控循环单元融合注意力机制多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效…

RunCam WiFiLink连接手机图传测试

RunCam WiFiLink中文手册从这里下载 一、摄像头端 1.连接天线&#xff08;易忘&#xff09; 2.打开摄像头前面的盖子&#xff08;易忘&#xff09; 3.接上直流电源&#xff0c;红线为正&#xff0c;黑线为负 4.直流电源设置电压为14v&#xff0c;电流为3.15A&#xff0c; 通…

AI的进阶之路:从机器学习到深度学习的演变(二)

AI的进阶之路&#xff1a;从机器学习到深度学习的演变&#xff08;一&#xff09; 三、机器学习&#xff08;ML&#xff09;&#xff1a;AI的核心驱动力 3.1 机器学习的核心原理 机器学习&#xff08;Machine Learning, ML&#xff09;突破了传统编程的局限&#xff0c;它不再…

WordPress 去除?v= 动态后缀

Wordpress url后面带有?vxxx的参数符&#xff0c;这种现象出现在安装了Woocommerce插件的店铺类型站点上&#xff0c;参数的作用是帮助系统根据用户的geographic定位计算 tax and shipping fee。 如何删除&#xff1f; 后台进入WooCommerce Settings &#xff0c;将根据IP定…

Spring Cloud Gateway 源码

Spring Cloud Gateway 架构图 按照以上架构图&#xff0c;请求的处理流程&#xff1a; 1.客户端请求发送到网关 DispatcherHandler 2.网关通过 HandlerMapping 找到相应的 WebHandler 3.WebHandler生成FilterChain过滤器链执行所有的过滤器 4.返回Response结果 自动装配类Gat…

数据结构漫游记:初识vector

​ 嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的…

go-zero负载均衡实现原理

1. 什么是负载均衡 关于微服务分布式及集群的概念即定义&#xff0c;在业界中这些往往会同时在同一个项目中&#xff0c;而集群在微服务中主要为服务的运行保障高可用。 比如&#xff1a;在当前的项目情况下&#xff0c;我们可能针对用户服务部署两台服务以保障用户服务的高可用…

【Rust自学】4.4. 引用与借用

4.4.0 写在正文之前 这一节的内容其实就相当于C的智能指针移动语义在编译器层面做了一些约束。Rust中引用的写法通过编译器的约束写成了C中最理想、最规范的指针写法。所以学过C的人对这一章肯定会非常熟悉。 喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文…

Apache Solr RCE(CVE-2017-12629)--vulhub

Apache Solr 远程命令执行漏洞&#xff08;CVE-2017-12629&#xff09; Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发&#xff0c;主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个…

OpenGL ES 01 渲染一个四边形

项目架构 着色器封装 vertex #version 300 es // 接收顶点数据 layout (location 0) in vec3 aPos; // 位置变量的属性位置值为0 layout (location 1) in vec4 aColors; // 位置变量的属性位置值为1 out vec4 vertexColor; // 为片段着色器指定一个颜色输出void main() {gl…

游戏渠道假量解决方案

某推广公司在推广过程中被查出“短期内点击量激增”“存在同一地址多次访问”“已注册用户重复注册”等数据作弊行为&#xff0c;法院判罚退还服务费200余万元&#xff0c;并赔偿违约金约350万元。 某公司为提升其游戏在应用商店榜单排名&#xff0c;委托某网络公司进行下载、注…

物联网:全面概述、架构、应用、仿真工具、挑战和未来方向

中文论文标题&#xff1a;物联网&#xff1a;全面概述、架构、应用、仿真工具、挑战和未来方向 英文论文标题&#xff1a;Internet of Things: a comprehensive overview, architectures, applications, simulation tools, challenges and future directions 作者信息&#x…

29、基于springboot的网上购物商城系统研发

本课题是根据用户的需要以及网络的优势建立的一个基于Spring Boot的网上购物商城系统&#xff0c;来满足用户网络购物的需求。 本网上购物商城系统应用Java技术&#xff0c;MYSQL数据库存储数据&#xff0c;基于Spring Boot框架开发。在网站的整个开发过程中&#xff0c;首先对…

Spring Boot--06--整合Swagger

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Swagger一、简介官网&#xff1a;https://swagger.io/ Swagger 的优势 二、基本使用1. 导入相关依赖2. 编写配置文件2.1 配置基本信息2.2 配置接口信息2.3 配置分组…

写SQL太麻烦?免费搭建 Text2SQL 应用,智能写 SQL | OceanBase AI 实践

自OceanBase 4.3.3版本推出以来&#xff0c;向量检索的能力受到了很多客户的关注&#xff0c;也纷纷表达希望OB能拓展更多 多模数据库大模型 的AI应用实践。 在上篇文章 &#x1f449; OceanBase LLM&#xff0c;免费构建你的专属 AI 助手 &#xff0c;我们介绍了如何去搭建一…