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
英文地址,請注明出處:http://en.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;因此需要通過操作系統提供的…