音视频学习(三十):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 片段”结构,适用于流式传输,能减少初始加载时间,支持动态码率切换。
| 特性 | 普通 MP4 | FMP4 |
|---|---|---|
| 存储方式 | 完整文件 | 分片存储 |
| 适用场景 | 本地存储、下载 | 直播、点播、流媒体传输 |
| 结构 | 单一 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)
-
存储文件全局信息,包括轨道信息、时长、编解码信息等。
-
主要包含
mvhd、trak、udta等 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→ 片段序号 1tfhd 00000001→ 轨道 ID 1tfdt 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,降低延迟,提高兼容性。
相关文章:
音视频学习(三十):fmp4
FMP4(Fragmented MP4)是 MP4(MPEG-4 Part 14)的扩展版本,它支持流式传输,并被广泛应用于DASH(Dynamic Adaptive Streaming over HTTP)和HLS(HTTP Live Streaming…...
【语料数据爬虫】Python爬虫|批量采集讲话稿数据【范文网】(2)
前言 本文是该专栏的第7篇,后面会持续分享Python爬虫采集各种语料数据的的干货知识,值得关注。 本文,笔者将主要介绍基于Python,来实现批量采集范文网“讲话稿”数据。同时,本文也是采集“讲话稿”数据系列的第2篇。 采集相关数据的具体细节部分以及详细思路逻辑,笔者将…...
Java安全-类的动态加载
类的加载过程 先在方法区找class信息,有的话直接调用,没有的话则使用类加载器加载到方法区(静态成员放在静态区,非静态成功放在非静态区),静态代码块在类加载时自动执行代码,非静态的不执行;先父类后子类,…...
内存取证之windows-Volatility 3
一,Volatility 3下载 1.安装Volatility 3。 要求:python3.7以上的版本,我的是3,11,这里不说python的安装方法 使用 pip 安装 Volatility 3: pip install volatility3 安装完成后,验证安装: v…...
WIFI p2p连接总结
p2p 设备角色 go 为 group owner,类似 ap 的功能,控制 p2p 组,每个 group 只有一个 go gc 是 client,为连接 go 的设备,是组成员 P2P 扫描 p2p discovery 利用 probe request 和 probe response 帧来搜索周围的 p2…...
React Native进阶(六十):webview实现屏蔽所嵌套web页面异常弹窗
文章目录 一、前言二、解决方案三、注意事项四、拓展阅读 一、前言 在React Native项目集成web页面时,webview嵌套方式是常用方式。如果所嵌套的web页面由于某种不可控因素导致出现错误弹窗信息,webview作为web嵌套方式应该对其行为可控。 React Nativ…...
fastapi+playwright爬取google搜索1-3页的关键词返回json
1,playwright无头 2,代理池随机获取代理ip 3,随机浏览行为,随机页面滚动 4,启用stealth模式 5,随机延时搜索 from fastapi import FastAPI, HTTPException from fastapi.responses import JSONResponse import asyncio from concurrent.futures import ThreadPool…...
施磊老师高级c++(五)
文章目录 一、设计模式二、单例模式(创建型模式)- 重点(共三种代码)1.1 饿汉式单例模式 -- 不受欢迎1.2 懒汉式单例模式 -- 受欢迎1.3 线程安全的懒汉式单例模式--锁volatile 三、工厂模式(创建型模式)3.1 简单工厂模式3.2 工厂方…...
鸿蒙相机开发实战:从设备适配到性能调优 —— 我的 ArkTS 录像功能落地手记(API 15)
引言:为什么我要写这份开发指南? 作为一名老技术,最近特别喜欢研究鸿蒙相机功能,而且目前已经更新到API15了,那么咱们更要好好研究一下。而且从手持云台到车载记录仪,每个项目都面临独特挑战:车…...
MySQL中怎么分析性能?
MySQL中主要有4种方式可以分析数据库性能,分别是慢查询日志,profile,Com_xxx和explain。 慢查询日志 先用下面命令查询慢查询日志是否开启, show variables like slow_query_log;# 一般默认都是以下结果 ---------------------…...
阿里云对象存储教程
搜“对象存储->免费试用” 选择你的心仪产品,我使用的是第一个 创建后获得三个实例: 点击右上角自己的账号可以进入到AccessKey管理界面 回到对象存储控制台创建Bucket实例 在以下文件中替换自己Bucket的信息即可美美使用~ package com.kitty.blog…...
【Node.js入门笔记10---http 模块】
Node.js入门笔记10 Node.js---http 模块一、核心功能0.学习http的前提1. 创建 HTTP 服务器2. 处理请求和响应 二、进阶用法1. 路由管理2. 处理 POST 请求3. 中间件模式 三、常见场景四、错误处理与安全五、对比 http 与 Express六、工具库推荐: Node.js—http 模块 …...
深拷贝在 JavaScript 中的几种实现方式对比
深拷贝在 JavaScript 中的几种实现方式对比 1. JSON 序列化法2. 结构化克隆(structuredClone)原理与使用 3. 自定义深拷贝函数原理与使用 性能对比与选择建议性能比较 综合建议:示例代码整合总结 在开发过程中,我们经常需要对对象…...
实验11 机器学习-贝叶斯分类器
实验11 机器学习-贝叶斯分类器 一、实验目的 (1)理解并熟悉贝叶斯分类器的思想和原理; (2)熟悉贝叶斯分类器的数学推导过程; (3)能运用贝叶斯分类器解决实际问题并体会算法的效果&a…...
Delta Lake 解析:架构、数据处理流程与最佳实践
Delta Lake 是一个基于 Apache Spark 的开源存储层,主要解决传统数据湖(Data Lake)缺乏 ACID 事务、数据一致性和性能优化的问题,使大数据处理更加可靠、高效。从本质上讲,它让数据湖具备了数据仓库的结构化管理能力&a…...
OpenHarmony子系统开发 - 电池管理(二)
OpenHarmony子系统开发 - 电池管理(二) 五、充电限流限压定制开发指导 概述 简介 OpenHarmony默认提供了充电限流限压的特性。在对终端设备进行充电时,由于环境影响,可能会导致电池温度过高,因此需要对充电电流或电…...
hive 数据简介
Hive介绍 1)Hive简介 Hive是基于Hadoop的一个数据仓库工具,用于结构化数据的查询、分析和汇总。Hive提供类SQL查询功能,它将SQL转换为MapReduce程序。 Hive不支持OLTP,Hive无法提供实时查询。 2)Hive在大数据生态环境…...
Win32桌面编程:ACLUI.DLL,EditSecurity(IntPtr hwndOwner, ISecurityInformation psi)
在Windows编程中,我们通常需要借助通用对话框的力量,今天我们就聊一下“安全属性表”通用对话框的使用心得。 当我们调用EditSecurity函数时: 1.EditSecurity将调用ISecurityInformation中的GetObjectInformation函数 在编写 ISecurityInf…...
数据分析异步进阶:aiohttp与Asyncio性能提升
一、时间轴呈现方案进程 2023-04-01:需求确认 确定目标:使用aiohttp与Asyncio提升采集性能,目标采集今日头条网站的新闻数据(标题、内容、时间等)。同时要求在程序中加入代理IP、Cookie和UserAgent的设置,…...
《AI大模型趣味实战 》第8集:多端适配 个人新闻头条 基于大模型和RSS聚合打造个人新闻电台(Flask WEB版) 2
《AI大模型趣味实战 》第8集:多端适配 个人新闻头条 基于大模型和RSS聚合打造个人新闻电台(Flask WEB版) 2 摘要 本文末尾介绍了如何实现新闻智能体的方法。在信息爆炸的时代,如何高效获取和筛选感兴趣的新闻内容成为一个现实问题。本文将带领读者通过P…...
低配电脑畅玩《怪物猎人:荒野》,ToDesk云电脑优化从30帧到144帧?
《怪物猎人:荒野(Monster Hunter Wilds)》自2025年正式发售以来已取得相当亮眼的成绩,仅用三天时间便轻松突破800万销量,目前顺利蝉联周榜冠军;凭借着开放世界的宏大场景和丰富的狩猎玩法,该游戏…...
Leetcode刷题笔记1 图论part03
卡码网 101 孤岛总面积 from collections import deque directions [[0, 1], [1, 0], [0, -1], [-1, 0]] count 0def main():global countn, m map(int, input().split())grid []for _ in range(n):grid.append(list(map(int, input().split())))for i in range(n):if gri…...
【模拟面试】计算机考研复试集训(第十一天)
文章目录 前言一、专业面试1、什么是面向对象编程?2、软件工程的主要模型有哪些?3、Cache和寄存器的区别4、卷积层有哪些参数,它们代表什么?5、你有读博的打算吗?6、你的师兄/姐临近毕业,仍做不出成果&…...
查看自己的公有ip
IP 地址 112.3.88.1** 是一个 公有 IP 地址,而不是私有 IP 地址。 公有 IP 地址 vs 私有 IP 地址 公有 IP 地址: 用于在互联网上唯一标识设备。由互联网服务提供商(ISP)分配。可以在全球范围内路由和访问。例如:112.3.88.156、8.8…...
【js逆向入门】图灵爬虫练习平台 第九题
地址:aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvOS8 f12进入了debugger,右击选择一律不在此处暂停, 点击继续执行 查看请求信息 查看载荷,2个加密参数,m和tt 查看启动器,打上断点 进来 往…...
NET6 WebApi第5讲:中间件(源码理解,俄罗斯套娃怎么来的?);Web 服务器 (Nginx / IIS / Kestrel)、WSL、SSL/TSL
一、NET6的启动流程 区别: .NET6 WebApi第1讲:VSCode开发.NET项目、区别.NET5框架【两个框架启动流程详解】_vscode webapi-CSDN博客 2、WebApplicationBuilder:是NET6引入的一个类,是建造者模式的典型应用 1>建造者模式的…...
Nginx及前端部署全流程:初始化配置到生产环境部署(附Nginx常用命令)
nginx&前端从初始化配置到部署(xshell) 前言下载nginx前端打包与创建具体文件夹路径配置nginx.nginx.conf文件配置项内容 配置nginx.service文件配置项内容 启动nginx常用nginx命令 前言 目标:在xshell中部署前端包。 第一步:…...
python 实现一个简单的window 任务管理器
import tkinter as tk from tkinter import ttk import psutil# 运行此代码前,请确保已经安装了 psutil 库,可以使用 pip install psutil 进行安装。 # 由于获取进程信息可能会受到权限限制,某些进程的信息可能无法获取,代码中已经…...
【AI模型】深度解析:DeepSeek的联网搜索的实现原理与认知误区
一、大模型的“联网魔法”:原来你是这样上网的! 在人工智能这个舞台上,大模型们可是妥妥的明星。像DeepSeek、QWen这些大模型,个个都是知识渊博的“学霸”,推理、生成文本那叫一个厉害。不过,要是论起上网…...
【xiaozhi赎回之路-2:语音可以自己配置就是用GPT本地API】
固件作用 打通了网络和硬件的沟通 修改固件实现【改变连接到小智服务器的】 回答逻辑LLM自定义 自定义了Coze(比较高级,自定义程度比较高,包括知识库,虚拟脚色-恋人-雅思老师-娃娃玩具{可能需要使用显卡对开源模型进行微调-产…...
