音視頻學習(三十):fmp4

FMP4(Fragmented MP4)是 MP4(MPEG-4 Part 14)的擴展版本,它支持流式傳輸,并被廣泛應用于DASH(Dynamic Adaptive Streaming over HTTP)HLS(HTTP Live Streaming)等自適應流媒體協議。FMP4 的主要特點是將視頻和音頻數據拆分成片段(Fragment),以更靈活的方式進行傳輸和存儲。

FMP4 與普通 MP4 的區別

普通 MP4 采用“單一 MOOF + MDAT”結構,文件內通常包含完整的媒體元數據(moov)和媒體數據(mdat),適用于本地播放。
而 FMP4 采用“多個 MOOF + MDAT 片段”結構,適用于流式傳輸,能減少初始加載時間,支持動態碼率切換。

特性普通 MP4FMP4
存儲方式完整文件分片存儲
適用場景本地存儲、下載直播、點播、流媒體傳輸
結構單一 moov多個 moof 片段
碼率自適應不支持支持
點播跳轉整個文件解析直接訪問片段

FMP4 結構

FMP4 由文件級、初始化段(Init Segment)和媒體片段(Media Fragment)組成。

文件級

整個 FMP4 文件仍然遵循 ISO BMFF(Base Media File Format)格式,基礎結構包括:

  • ftyp:文件類型(File Type Box)
  • moov:元數據(Movie Box)
  • 多個片段(Fragments):由 moof(Movie Fragment)和 mdat(Media Data)組成的多個片段。

初始化段(Init Segment)

初始化段包含:

  • ftyp:聲明文件類型。
  • moov:存儲編解碼信息、軌道信息(TrackBox)、采樣表(Sample Table)等,不含實際音視頻數據。

作用:初始化播放器,告知解碼器如何解碼后續的片段。

片段(Media Fragment)

每個片段都包含:

  • moof(Movie Fragment Box):表示一個新的片段,包含元數據,如時間戳、幀信息。
  • mdat(Media Data Box):存儲實際的音視頻數據。

多個 moof + mdat 片段可以連續存儲或按需加載,使其適用于直播和點播流媒體。

FMP4 關鍵 Box 解析

ftyp(文件類型 Box)

ftyp├── major_brand(主品牌,如 isom)├── minor_version(次版本)├── compatible_brands(兼容品牌)

示例:

00000018 66747970 69736F6D 00000200 69736F6D 61766331

這里 isom 代表 MP4 文件格式,avc1 代表 H.264 兼容。

moov(Movie Box)

  • 存儲文件全局信息,包括軌道信息、時長、編解碼信息等。

  • 主要包含 mvhdtrakudta 等 Box。

moov├── mvhd(Movie Header Box)├── trak(Track Box,存儲音視頻軌道)│    ├── tkhd(Track Header Box,軌道信息)│    ├── mdia(Media Box,媒體信息)│         ├── mdhd(Media Header Box,媒體頭)│         ├── hdlr(Handler Box,解碼器類型)│         ├── minf(Media Information Box,采樣、壓縮信息)│              ├── stbl(Sample Table Box)├── mvex(Movie Extends Box,用于分片)

作用:播放器解析 moov 后,可知道如何解碼音視頻數據。

moof(Movie Fragment Box)

  • moof 是 FMP4 的核心,它表示一個新的片段,包含時間戳、采樣信息。

  • moof 結構:

moof├── mfhd(Movie Fragment Header Box,片段序號)├── traf(Track Fragment Box,軌道片段信息)├── tfhd(Track Fragment Header Box,軌道 ID)├── tfdt(Track Fragment Decode Time Box,時間戳)├── trun(Track Fragment Run Box,存儲幀偏移量、大小等)

作用:播放器加載 moof 后,知道這個片段的起始時間、軌道 ID,以及解碼順序。

  • moof 解析示例
    • mfhd 00000001 → 片段序號 1
    • tfhd 00000001 → 軌道 ID 1
    • tfdt 00000001 → 時間戳起點 1
0000006C 6D6F6F66 00000010 6D666864 00000001
00000058 74726166 00000014 74666864 00000001
00000010 74666474 00000001 00000000

mdat(Media Data Box)

  • mdat 包含真正的音視頻數據幀,按 moof 指定的時間順序排列。
mdat(Media Data)
  • 示例:
0000017C 6D646174 ... (H.264/HEVC 視頻幀數據)

作用:播放器解碼 mdat 并播放視頻。

解析示例

mp4

在這里插入圖片描述

fmp4

在這里插入圖片描述

FMP4 在流媒體中的應用

在 HLS 中

  • 傳統 HLS 使用 .ts 作為分片格式,但 ts 容量大,時延較高。
  • Apple 推出了 CMAF(Common Media Application Format),支持 fMP4 作為 HLS 的片段格式,提高兼容性和性能。

示例:HLS playlist(m3u8)

#EXTM3U
#EXT-X-VERSION:7
#EXT-X-MAP:URI="init.mp4"
#EXTINF:6.000,
segment1.m4s
#EXTINF:6.000,
segment2.m4s

init.mp4 是初始化段,segment1.m4s 是 FMP4 片段。

在 DASH 中

DASH 直接支持 fMP4 作為流格式,每個片段可獨立請求。

示例:DASH MPD(Media Presentation Description)

<MPD><Period><AdaptationSet><Representation mimeType="video/mp4"><SegmentTemplate media="segment$Number$.m4s" initialization="init.mp4" /></Representation></AdaptationSet></Period>
</MPD>

總結

  • FMP4 適用于流媒體傳輸,支持按片段加載,提高播放靈活性。
  • 主要由 moov(初始化)和 moof + mdat(片段)組成。
  • 廣泛應用于 HLS(CMAF)和 DASH,降低延遲,提高兼容性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73274.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73274.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73274.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

26考研——圖_圖的存儲(6)

408答疑 文章目錄 二、圖的存儲圖的存儲相關概念鄰接矩陣存儲方式鄰接矩陣的定義頂點的度計算鄰接矩陣的特點鄰接矩陣的局限性 應用場景鄰接矩陣的冪次意義&#xff08;了解即可&#xff09; 鄰接表存儲方式鄰接表定義鄰接表結構鄰接表的特點 鄰接矩陣和鄰接表的適用性差異十字…

以高斯(GaussDB) 為例, 在cmd 命令行連接數據,操作數據庫,關閉數據庫的詳細步驟

以下是使用 Windows 命令行&#xff08;cmd&#xff09; 操作 GaussDB&#xff08;以 GaussDB(for openGauss) 社區版為例&#xff09; 的詳細步驟&#xff0c;涵蓋 連接數據庫、基本操作、關閉數據庫 的全流程&#xff1a; 1. 環境準備 前提條件&#xff1a; 安裝 GaussDB&a…

HAL庫定時器配置

定時器的開啟需要手動開啟&#xff0c;例如在driver_capature.c開啟&#xff0c;該文件主要寫了具體的函數實現&#xff0c;與driver_can.c一樣&#xff0c;同時還有回調函數等一些高級的自定義函數。 這段代碼是 STM32 HAL 庫中用于初始化 定時器 2 (TIM2) 的函數 MX_TIM2_In…

使用Python開發自動駕駛技術:車道線檢測模型

友友們好! 我是Echo_Wish,我的的新專欄《Python進階》以及《Python!實戰!》正式啟動啦!這是專為那些渴望提升Python技能的朋友們量身打造的專欄,無論你是已經有一定基礎的開發者,還是希望深入挖掘Python潛力的愛好者,這里都將是你不可錯過的寶藏。 在這個專欄中,你將會…

Modern C++面試題及參考答案

目錄 解釋右值引用的定義及其與左值引用的核心區別 std::move 的實現原理是什么?為什么它本身不執行移動操作? 移動構造函數與拷貝構造函數的調用場景有何不同? 實現一個支持移動語義的類需要遵循哪些原則? 完美轉發(Perfect Forwarding)的實現原理及 std::forward 的…

Thinkphp(TP)框架漏洞攻略

1.環境搭建 vulhub/thinkphp/5-rce docker-compose up -d 2.訪問靶場 遠程命令執行&#xff1a; ? sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1] []whoami 遠程代碼執行&#xff1a; ? s/Index/\think\app/invokefunc…

QT筆記---JSON

QT筆記---JSON JSON1、JSON基本概念1.1、判斷.json文件工具 2、生成.json數據3、解析.json數據 JSON 在現代軟件開發中&#xff0c;數據的交換和存儲格式至關重要。JSON&#xff08;JavaScript Object Notation&#xff09;作為一種輕量級的數據交換格式&#xff0c;以其簡潔易…

Unity 使用 Protobuf(Pb2)二進制數據全流程工具詳解

前言 在Unity游戲開發中&#xff0c;高效、快速、安全地讀取配置數據是一項重要需求。本文介紹一種完整的解決方案——使用Protobuf二進制格式&#xff08;Pb2&#xff09;存儲和讀取游戲數據&#xff0c;并詳細分享實現全流程的Unity工具。 一、技術流程概覽 實現Unity讀取…

MySQL-----視圖與索引

目錄 視圖 1.視圖 2.操作 11.索引 1.定義 2.優缺點: 3.分類 4.索引的設計原則 5.索引的使用 作業 視圖 1.視圖 ?如果需要在原表中隱藏部分字段時&#xff0c;怎么辦&#xff1f; 視圖 &#x1f4d6;視圖: 是一個沒有存儲任何數據的表&#xff0c;可以對其CRUD視圖…

stm32-IIC

i^2c,iiCBus,集成電路總線&#xff0c;同步串行半雙工通信總線方式 sck:時鐘同步信號 SDA:發送數據 GND&#xff1a;接地 通信對象&#xff1a;芯片與芯片 主從應答方式&#xff1a; SDA&#xff1a;數據總線 SCL&#xff1a;時鐘總線 在硬件設計中&#xff1a; 上拉電阻&#…

`chromadb` 是什么

chromadb 是什么 chromadb 是一個開源的向量數據庫,它專門用于存儲、索引和查詢向量數據。在處理自然語言處理(NLP)、計算機視覺等領域的任務時,通常會將文本、圖像等數據轉換為向量表示,而 chromadb 可以高效地管理這些向量,幫助開發者快速找到與查詢向量最相似的向量數…

機器視覺工程師如何看機器視覺展會,有些機器視覺兄弟參加機器視覺展會,真的是參加了?重在參與?

作為機器視覺工程師,參加機器視覺展會不僅是了解行業前沿技術的窗口,也是拓展專業網絡、尋找解決方案的重要機會。以下是結合展會信息和工程師視角的綜合建議: 一、聚焦技術趨勢與創新應用 參與技術論壇與研討會 展會同期的技術論壇是獲取行業洞見的核心渠道。例如: 上海展…

Centos操作系統安裝及優化

Centos操作系統安裝及優化 零、環境概述 主機名 centos版本 cpu 內存 Vmware版本 ip地址 test CentOS Linux release 7.6.1810 (Core) 2C 2G 15.5.1 10.0.0.10 一、介質下載 1、7.6版本下載 CentOS7.6標準版下載鏈接: https://archive.kernel.org/centos-vault/7.6.1810/i…

Edge瀏覽器如何默認啟動某個工作區 / 為工作區添加快捷方式

Edge瀏覽器的工作區確實非常好用&#xff0c;可以多端同步標簽頁。但是打開Edge時默認是沒有在工作區的狀態&#xff0c;這個狀態下的標簽頁可能會丟失。所以我研究了一下&#xff0c;如何點擊快捷方式時自動啟動一個工作區&#xff0c;方法如下&#xff1a; 先找到WorkspaceCa…

mac上安裝nvm及nvm的基本語法使用!!

種一棵樹&#xff0c;最好是十年前&#xff0c;其次是現在&#xff01;想要改變&#xff0c;從此刻開始&#xff0c;一切都不晚&#xff01; 目錄 nvm是什么&#xff1f;前提條件&#xff1a;安裝homebrew如果系統已經有node版本&#xff1a;在mac上安裝nvm&#xff1a;用nvm安…

CPP中的numeric庫中的accumulate求和函數說明

導入 accumulate函數位于numeric庫中&#xff0c;作用是對數組或向量求和 // 設定初始值為0&#xff0c;從dp[0]到dp[n-1]進行累加 accumulate(dp,dpn,0);注意&#xff1a;這里的第二個參數是開區間&#xff0c;所以求和時不包含dp[n]這一位

Qt 高效讀寫JSON文件,玩轉QJsonDocument與QJsonObject

一、前言 JSON作為輕量級的數據交換格式&#xff0c;已成為開發者必備技能。Qt框架為JSON處理提供了完整的解決方案&#xff0c;通過QJsonDocument、QJsonObject和QJsonArray三大核心類&#xff0c;輕松實現數據的序列化與反序列化。 JSON vs INI 特性JSONINI數據結構支持嵌…

Kubernetes(k8s)-Pod親和性(Affinity)和反親和性(Anti-affinity)

作者介紹&#xff1a;簡歷上沒有一個精通的運維工程師。請點擊上方的藍色《運維小路》關注我&#xff0c;下面的思維導圖也是預計更新的內容和當前進度(不定時更新)。 我們上一章介紹了Docker基本情況&#xff0c;目前在規模較大的容器集群基本都是Kubernetes&#xff0c;但是K…

ESP32-C3物聯網方案,智能設備創新升級,無線交互控制通信應用

在物聯網技術迅猛發展的今天&#xff0c;各類智能設備如雨后春筍般涌現&#xff0c;深度融入我們生活與工作的各個角落&#xff0c;物聯網正以一種前所未有的速度改變著我們的世界。 想象一下&#xff0c;清晨&#xff0c;當第一縷陽光灑進房間&#xff0c;智能窗簾自動緩緩拉…

Python自動化測試 之 DrissionPage 的下載、安裝、基本使用詳解

Python自動化測試 之 DrissionPage 使用詳解 &#x1f3e1;前言&#xff1a;一、??DrissionPage的基本概述二、 &#x1f5fa;?環境安裝2.1 ???運行環境2.2 ???一鍵安裝 三、&#x1f5fa;?快速入門3.1 頁面類&#x1f6f0;?ChromiumPage&#x1f6eb; SessionPage&…