FFmpeg 视频旋转信息处理:3.4 vs 7.0.2

1. 概述

FFmpeg 在处理视频旋转信息方面经历了重要的架构变化。本文档详细对比了 FFmpeg 3.4 和 7.0.2 在封装(muxing)和解封装(demuxing)视频旋转信息时的差异,并提供兼容性解决方案。文档内容由Claude Sonnet 4辅助撰写,如有疏漏还请斧正。

  • FFmpeg 3.4:支持 metadata 和 side data 双重机制
  • FFmpeg 7.0.2:主要依赖 side data 机制,弱化 metadata 支持

2. 旋转信息存储机制

存储方式FFmpeg 3.4FFmpeg 7.0.2说明
Stream Metadata✅ 读写支持❌ 仅读取(兼容性)stream->metadata["rotate"]
Side Data✅ 读写支持✅ 主要方式AV_PKT_DATA_DISPLAYMATRIX
容器原生格式✅ 支持✅ 支持MP4 tkhd atom 等
// Metadata 格式(字符串)
stream->metadata["rotate"] = "90"  // 90度旋转// Side Data 格式(3x3 变换矩阵)
int32_t displaymatrix[9] = {cos(θ), -sin(θ), 0,sin(θ),  cos(θ), 0,0,       0,      1
};

3. 解封装(Demuxing)对比

3.1 FFmpeg 3.4 解封装行为

// FFmpeg 3.4 读取流程
void ffmpeg34_demux_rotation() {// 1. 从容器读取 displaymatrixuint8_t *displaymatrix = read_container_displaymatrix();// 2. 设置 side dataav_stream_add_side_data(stream, AV_PKT_DATA_DISPLAYMATRIX, displaymatrix, size);// 3. 同时设置 metadata(便于应用程序使用)if (displaymatrix) {double rotation = av_display_rotation_get((int32_t*)displaymatrix);av_dict_set(&stream->metadata, "rotate", av_asprintf("%.0f", -rotation), AV_DICT_DONT_STRDUP_VAL);}
}// 应用程序读取(推荐方式)
int getRotation_v34(AVStream *stream) {// 方式1:从 metadata 读取(简单)AVDictionaryEntry *t = av_dict_get(stream->metadata, "rotate", NULL, 0);if (t) return atoi(t->value);// 方式2:从 side data 读取(精确)uint8_t *displaymatrix = av_stream_get_side_data(stream, AV_PKT_DATA_DISPLAYMATRIX, NULL);if (displaymatrix) {return (int)(-av_display_rotation_get((int32_t*)displaymatrix));}return 0;
}

3.2 FFmpeg 7.0.2 解封装行为

// FFmpeg 7.0.2 读取流程
void ffmpeg70_demux_rotation() {// 1. 从容器读取 displaymatrixuint8_t *displaymatrix = read_container_displaymatrix();// 2. 只设置 side dataav_packet_side_data_add(&stream->codecpar->coded_side_data,&stream->codecpar->nb_coded_side_data,AV_PKT_DATA_DISPLAYMATRIX, displaymatrix, size, 0);// 3. 不再自动设置 metadata// stream->metadata["rotate"] 为空!
}// 应用程序读取(新方式)
int getRotation_v70(AVStream *stream) {// 只能从 side data 读取AVPacketSideData *side_data = av_packet_side_data_get(stream->codecpar->coded_side_data,stream->codecpar->nb_coded_side_data,AV_PKT_DATA_DISPLAYMATRIX);if (side_data && side_data->size >= 9 * sizeof(int32_t)) {double rotation = av_display_rotation_get((int32_t*)side_data->data);return (int)(-rotation);}return 0;
}

4. 封装(Muxing)对比

4.1 FFmpeg 3.4 封装行为

// FFmpeg 3.4 支持多种设置方式// 方式1:通过 metadata 设置(推荐)
int setRotation_v34_metadata(AVStream *stream, int degrees) {char rotation_str[16];snprintf(rotation_str, sizeof(rotation_str), "%d", degrees);// 设置 metadata,muxer 会自动转换为 displaymatrixreturn av_dict_set(&stream->metadata, "rotate", rotation_str, 0);
}// 方式2:直接设置 side data
int setRotation_v34_sidedata(AVStream *stream, int degrees) {uint8_t *displaymatrix = av_stream_new_side_data(stream, AV_PKT_DATA_DISPLAYMATRIX, 9 * sizeof(int32_t));if (!displaymatrix) return -1;av_display_rotation_set((int32_t*)displaymatrix, -(double)degrees);return 0;
}

4.2 FFmpeg 7.0.2 封装行为

// FFmpeg 7.0.2 主要通过 side data 设置int setRotation_v70(AVStream *stream, int degrees) {// metadata 方式可能无效,必须使用 side dataint32_t *displaymatrix = (int32_t*)av_packet_side_data_new(&stream->codecpar->coded_side_data,&stream->codecpar->nb_coded_side_data,AV_PKT_DATA_DISPLAYMATRIX,9 * sizeof(int32_t),0);if (!displaymatrix) return -1;av_display_rotation_set(displaymatrix, -(double)degrees);return 0;
}

5. 总结

FFmpeg 在处理视频旋转信息方面的变化反映了其向更标准化、更精确方向的演进:

  • FFmpeg 3.4:过渡期版本,同时支持 metadata 和 side data
  • FFmpeg 7.0.2:现代化版本,主要依赖标准化的 side data

开发者应该:

  1. 在新项目中优先使用 side data API
  2. 保持对旧版本的兼容性支持
  3. 进行充分的跨版本测试
  4. 关注 FFmpeg 的未来发展趋势

这种变化虽然增加了开发复杂度,但提供了更好的标准兼容性和更精确的旋转信息处理能力。

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

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

相关文章

《Resolving tissue complexity by multimodal spatial omics modeling with MISO》

概念多模态空间组学:简单来说,就是同时研究生物组织里的多种分子信息(比如基因表达、蛋白质、代谢物、表观遗传标记等),而且这些信息还带有空间位置。MISO(MultI-modal Spatial Omics)是这篇论文…

三阶段提交(3PC)协议的全面解析:理论、机制与实践局限性

第一部分:非阻塞提交的起源:从两阶段提交(2PC)的缺陷到三阶段提交(3PC)的构想在分布式计算领域,确保跨多个独立节点执行的事务的完整性是一项至关重要的挑战。这些节点或站点可能在地理上分散&a…

衰减器的计算

pi型衰减器,如下图所示。 它适用于输入输出阻抗匹配的情况下,还能进行衰减。 不过当输入输出阻抗不匹配时,2个R1也会不相等。 已知特性阻抗Z0,衰减比AVin/Vout,怎么计算R1、R2? 1、电阻分压。 Vout Vi…

Day02 员工管理,分类管理

新增员工需求分析和设计产品原型:接口设计:本项目约定:管理端发出的请求,统一使用 /admin 作为前缀用户端发出的请求,统一使用 /user 作为前缀数据库表设计:代码开发根据新增员工接口设计对应的 DTO&#x…

[SC]SystemC 常见的编译/语法错误与解法(三)

SystemC 常见的编译/语法错误与解法(三) 摘要:下面按“现象/编译信息 → 成因 → 解决方案”的结构,归纳 SystemC 建模在 SoC 验证中常见的“编译期/语法层面”问题,并补充如何根据编译信息快速定位与如何在流程上避免这些问题。 一、SystemC 常见的编译/语法错误与…

06-docker容器常用命令

文章目录一.docker容器相关指令概述二.生产环境中常用的 docker容器相关指令1.创建容器(create)2.查看已创建的容器(ps,ls,list)3.运行一个已创建的容器(start)4.停止一个正在运行的容器(stop)5.重启容器(restart)6.创建并启动一个容器(run,等…

Xiphos Q8 摄像头板 高性能图像处理板

我们的高性能图像处理板设计用于与具有两个 Camera Link 接口(2x Base 或 1x Medium)的 Q8 混合处理器卡配合使用。接口: 2个Camera Link接口 4个SpaceWire接口 4个USB 2.0主端口 串行接口和 GPIO 多个 Vcc 输出(5.0、3.3 和 1.8V…

Rocky Linux 10 搭建 NFS 服务详细步骤

1.NFS描述 NFS,全称为Network File System,即网络文件系统,是一种分布式文件系统协议,允许一个系统在网络上与他人共享目录和文件。通过NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。以下是NFS的一些主…

Android MediaMetadataRetriever取视频封面,Kotlin(1)

Android MediaMetadataRetriever取视频封面&#xff0c;Kotlin&#xff08;1&#xff09; <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE&qu…

qt的元对象系统详解

Qt 的元对象系统&#xff08;Meta-Object System&#xff09;&#xff0c;这是 Qt 框架最核心、最强大的特性之一。 1.什么是 Qt 的元对象系统&#xff1f; Qt 的元对象系统&#xff08;Meta-Object System&#xff09;是 Qt 在标准 C 基础上扩展的一套机制&#xff0c;它为 C …

Nginx 性能优化与动态内容处理

一、压缩功能 实验目的&#xff1a;通过启用 Nginx 的 Gzip 压缩功能&#xff0c;对传输的文件&#xff08;如 HTML、日志等&#xff09;进行压缩&#xff0c;减少网络传输数据量&#xff0c;提升用户访问速度&#xff08;尤其适用于带宽有限的场景&#xff09;&#xff0c;同…

ComfyUI——舒服地让大模型为我所用

主页&#xff1a;ComfyUI | 用AI生成视频、图像、音频 https://github.com/comfyanonymous/ComfyUI 安装环境 我的环境是mac&#xff0c;芯片为M4pro。首先从github中下载工程&#xff0c;clone失败就直接下载zip压缩包。在model文件夹中&#xff0c;可以看到很多大名鼎鼎的…

【Visual Studio】使用VS调试(Debug)

确保在Debug模式下而不是Release 打断点(break point) 直接在有代码的行前单击&#xff0c;会出现红色的点(再次单击会取消)&#xff1b;或者光标停留在某行&#xff0c;按F9 这意味着程序当执行到这一行时会终止 在打完断点后点击”本地Windows调试器“或者按F5 往下翻会有代码…

B2.0:对硬件学习的一些个人心得感悟

对于硬件学习&#xff0c;所有人都会迷茫的找不到学习的路径和方向&#xff0c;都是自我摸索或者老师带领或者其他情况&#xff0c;而我倒是没有机会接触到现实的老师带我领进这个门&#xff0c;自然走的弯路比较多&#xff0c;所以引申出这篇文章&#xff0c;来聊聊硬件学习的…

Cursor设置

一&#xff1a;设置 Port: 7890TUN Mode&#xff1a;开启二&#xff1a;Editor Settings值为http://127.0.0.1:7890三&#xff1a;Cursor 测试一下

Windows下使用PyInstaller打包PyQt项目

在 Windows 环境下&#xff0c;使用 PyQt 开发的项目可以通过多种工具打包成 可执行文件&#xff08;.exe&#xff09;&#xff0c;以下是几种常见的方法及详细步骤&#xff1a;1. 使用 PyInstallerPyInstaller 是最常用的 Python 打包工具&#xff0c;支持 PyQt5/PyQt6/PySide…

AI大语言模型在生活场景中的应用日益广泛,主要包括四大类需求:文本处理、信息获取、决策支持和创意生成。

一、AI大语言模型生活应用全景图&#xff08;Mermaid流程图&#xff09;graph TDA[生活小事需求] --> B{需求分类}B --> C[文本处理类]B --> D[信息获取类]B --> E[决策支持类]B --> F[创意生成类]C --> C1[邮件写作]C --> C2[内容润色]C --> C3[文档总…

物奇路由器Wi-Fi芯片荣膺2025中国创新IC-强芯领航奖,并亮相第五届RISC-V中国峰会

近日&#xff0c;第五届中国集成电路设计创新大会在苏州举办&#xff0c;物奇携多款高性能网络通信与终端人工智能芯片亮相展会&#xff0c;其中首颗路由器Wi-Fi6芯片WQ9301凭借独特的架构创新和领先的性能优势&#xff0c;在国产IC强芯评选中脱颖而出&#xff0c;荣膺2025中国…

【已解决】npm install报错

~/autodl-tmp/App/magic_conch_frontend# npm install报错内容&#xff1a;WARN EBADENGINE Unsupported engine { npm WARN EBADENGINE package: vitejs/plugin-vue5.1.4, npm WARN EBADENGINE required: { node: ^18.0.0 || >20.0.0 }, npm WARN EBADENGINE current: { no…

IPC总结

IPC 是 Inter-Process Communication&#xff08;进程间通信&#xff09;的缩写&#xff0c;指的是操作系统中不同进程之间传递数据、交换信息或同步行为的机制。由于进程在内存中拥有独立的地址空间&#xff0c;无法直接访问彼此的内存&#xff0c;因此需要通过操作系统提供的…