吃透mp4格式系列——(二)

本文详细介绍了MP4文件格式的基本概念、结构组成及各部分的功能。MP4文件由多个Box构成,包括描述文件版本和兼容性的ftyp Box、包含媒体数据宏观描述信息的moov Box、视频分片描述信息的moof Box、实际媒体数据的mdat Box以及媒体索引文件mfrabox。文章还列举了所有必选或可选的Box类型。


http://blog.youkuaiyun.com/pirateleo/article/details/7061452


MP4文件格式详解——结构概述

原创  2011年12月11日 17:23:25

MP4文件格式详解(ISO-14496-12/14)

Author:Pirate Leo

Email:codeevoship@gmail.com

一、基本概念

1、 文件,由许多Box和FullBox组成。

2、 Box,每个Box由Header和Data组成。

3、 FullBox,是Box的扩展,Box结构的基础上在Header中增加8bits version和24bits flags。

4、 Header,包含了整个Box的长度size和类型type。当size==0时,代表这是文件中最后一个Box;当size==1时,意味着Box长度需要更多bits来描述,在后面会定义一个64bits的largesize描述Box的长度;当type是uuid时,代表Box中的数据是用户自定义扩展类型。

5、 Data,是Box的实际数据,可以是纯数据也可以是更多的子Boxes。

6、 当一个Box的Data中是一系列子Box时,这个Box又可成为Container Box。

Box的结构用伪代码表示如下:

[cpp]  view plain  copy
  1. aligned(8) class Box (unsigned int(32) boxtype,optional unsigned int(8)[16] extended_type)   
  2. {   
  3.     unsigned int(32) size;   
  4.     unsigned int(32) type = boxtype;   
  5.     if (size==1)   
  6.     {   
  7.         unsigned int(64) largesize;   
  8.     }   
  9.     else if (size==0)   
  10.     {   
  11.         // box extends to end of file   
  12.     }   
  13.     if (boxtype==‘uuid’)   
  14.     {   
  15.         unsigned int(8)[16] usertype = extended_type;   
  16.     }   

结构如下图:

 

                                                                                             文件基本结构描述图

二、MP4文件格式(ISO-14496-12/14)

MP4文件概述

MP4文件就是由各式各样的Box组成的,下表中列出了所有必选或可选的Box类型,√代表Box必选。


具体列表:

ftyp

 

 

 

 

 

√ 

file type and compatibility

pdin

 

 

 

 

 

 

progressive download information

moov

 

 

 

 

 

√ 

container for all the metadata

 

mvhd

 

 

 

 

√ 

movie header, overall declarations

 

trak

 

 

 

 

√ 

container for an individual track or stream

 

 

tkhd

 

 

 

√ 

track header, overall information about the track

 

 

tref

 

 

 

 

track reference container

 

 

edts

 

 

 

 

edit list container

 

 

 

elst

 

 

 

an edit list

 

 

mdia

 

 

 

√ 

container for the media information in a track

 

 

 

mdhd

 

 

√ 

media header, overall information about the media

 

 

 

hdlr

 

 

√ 

handler, declares the media (handler) type

 

 

 

minf

 

 

√ 

media information container

 

 

 

 

vmhd

 

 

video media header, overall information (video track only)

 

 

 

 

smhd

 

 

sound media header, overall information (sound track only)

 

 

 

 

hmhd

 

 

hint media header, overall information (hint track only)

 

 

 

 

nmhd

 

 

Null media header, overall information (some tracks only)

 

 

 

 

dinf

 

√ 

data information box, container

 

 

 

 

 

dref

√ 

data reference box, declares source(s) of media data in track

 

 

 

 

stbl

 

√ 

sample table box, container for the time/space map

 

 

 

 

 

stsd

√ 

sample descriptions (codec types, initialization etc.)

 

 

 

 

 

stts

√  

(decoding) time-to-sample

 

 

 

 

 

ctts

 

(composition) time to sample

 

 

 

 

 

stsc

√ 

sample-to-chunk, partial data-offset

information

 

 

 

 

 

stsz

 

sample sizes (framing)

 

 

 

 

 

stz2

 

compact sample sizes (framing)

 

 

 

 

 

stco

√ 

chunk offset, partial data-offset information

 

 

 

 

 

co64

 

64-bit chunk offset

 

 

 

 

 

stss

 

sync sample table (random access points)

 

 

 

 

 

stsh

 

shadow sync sample table

 

 

 

 

 

padb

 

sample padding bits

 

 

 

 

 

stdp

 

sample degradation priority

 

 

 

 

 

sdtp

 

independent and disposable samples

 

 

 

 

 

sbgp

 

sample-to-group

 

 

 

 

 

sgpd

 

sample group description

 

 

 

 

 

subs

 

sub-sample information

 

mvex

 

 

 

 

 

movie extends box

 

 

mehd

 

 

 

 

movie extends header box

 

 

trex

 

 

 

√ 

track extends defaults

 

ipmc

 

 

 

 

 

IPMP Control Box

moof

 

 

 

 

 

 

movie fragment

 

mfhd

 

 

 

 

√ 

movie fragment header

 

traf

 

 

 

 

 

track fragment

 

 

tfhd

 

 

 

√ 

track fragment header

 

 

trun

 

 

 

 

track fragment run

 

 

sdtp

 

 

 

 

independent and disposable samples

 

 

sbgp

 

 

 

 

sample-to-group

 

 

subs

 

 

 

 

sub-sample information

mfra

 

 

 

 

 

 

movie fragment random access

 

tfra

 

 

 

 

 

track fragment random access

 

mfro

 

 

 

 

√ 

movie fragment random access offset

mdat

 

 

 

 

 

 

media data container

free

 

 

 

 

 

 

free space

skip

 

 

 

 

 

 

free space

 

udta

 

 

 

 

 

user-data

 

 

cprt

 

 

 

 

copyright etc.

meta

 

 

 

 

 

 

metadata

 

hdlr

 

 

 

 

√ 

handler, declares the metadata (handler) type

 

dinf

 

 

 

 

 

data information box, container

 

 

dref

 

 

 

 

data reference box, declares source(s) of metadata items

 

ipmc

 

 

 

 

 

IPMP Control Box

 

iloc

 

 

 

 

 

item location

 

ipro

 

 

 

 

 

item protection

 

 

sinf

 

 

 

 

protection scheme information box

 

 

 

frma

 

 

 

original format box

 

 

 

imif

 

 

 

IPMP Information box

 

 

 

schm

 

 

 

scheme type box

 

 

 

schi

 

 

 

scheme information box

 

iinf

 

 

 

 

 

item information

 

xml

 

 

 

 

 

XML container

 

bxml

 

 

 

 

 

binary XML container

 

pitm

 

 

 

 

 

primary item reference

 

fiin

 

 

 

 

 

file delivery item information

 

 

paen

 

 

 

 

partition entry

 

 

 

fpar

 

 

 

file partition

 

 

 

fecr

 

 

 

FEC reservoir

 

 

segr

 

 

 

 

file delivery session group

 

 

gitn

 

 

 

 

group id to name

 

 

tsel

 

 

 

 

track selection

meco

 

 

 

 

 

 

additional metadata container

 

mere

 

 

 

 

 

metabox relation

正式开始前先对文件的几个重要部分宏观介绍一下,以便诸位在后续学习时心中有数:

1、  ftypbox,在文件的开始位置,描述的文件的版本、兼容协议等;

2、  moovbox,这个box中不包含具体媒体数据,但包含本文件中所有媒体数据的宏观描述信息,moov box下有mvhd和trak box。

        >>mvhd中记录了创建时间、修改时间、时间度量标尺、可播放时长等信息。

        >>trak中的一系列子box描述了每个媒体轨道的具体信息。

3、  moofbox,这个box是视频分片的描述信息。并不是MP4文件必须的部分,但在我们常见的可在线播放的MP4格式文件中(例如Silverlight Smooth Streaming中的ismv文件)确是重中之重。

4、  mdatbox,实际媒体数据。我们最终解码播放的数据都在这里面。

5、  mfrabox,一般在文件末尾,媒体的索引文件,可通过查询直接定位所需时间点的媒体数据。


附:Smooth Streaming中ismv文件结构,文件分为了多个Fragments,每个Fragment中包含moof和mdat。这样的结构符合渐进式播放需求。(mdat及其描述信息逐步传输,收齐一个Fragment便可播放其中的mdat)。



<think> 嗯,用户明确询问如何吃透Java项目的方法,这已经是第次提问了(之前系统提示过参考站内引用),看来用户对技术深度掌握有强烈需求。从用户身份推测大概率是中级Java开发者——既熟悉基础语法但缺乏复杂项目实战经验,可能正面临跳槽或接手重要项目。 注意到用户引用的资料强调“真实业务场景”和“技术栈全面性”,这提示我需要避开理论空谈。引用[2]提供了完整步骤框架,但用户可能更需要可落地的实操技巧。特别要突出三点:如何避免陷入代码海洋的陷阱、怎样验证是否真“吃透”了、企业级项目的特殊考量。 上次回复时已经拆解过技术栈和调试方法,这次应该升级维度:重点补充引用[4]提到的“架构设计责任”视角和“主干分支切割法”。用户引用中rocketMQ案例值得展开,但需注意平衡深度与普适性——用消息队列举例时得同步说明通用方法论。 用户焦虑点可能在时间效率,“几个月才能吃透”这种话绝不能出现。要把“里程碑验证法”(如七天能画架构图)和“渐进式目标”设计得更清晰。另外所有引用都未提及团队协作层面的吃透技巧,这恰好是实际开发的关键,需要补充。 </think> 以下是基于技术实践总结的**吃透Java项目方法论**,结合核心步骤与关键技巧,帮助深度掌握项目全貌: --- ### **一、系统化拆解步骤** 1. **理解业务背景与目标** - 明确项目解决的**核心问题**(如电商平台的秒杀场景、支付对账系统) - 梳理关键业务流程(用流程图/UML梳理订单创建→支付→履约的主干) - 定位项目在技术架构中的**层级角色**(如属于中台服务/网关层/数据聚合层)[^4] 2. **解剖项目结构** ```bash ├── src/main/java │ ├── controller # API入口 │ ├── service # 业务逻辑 │ ├── dao # 数据访问层 │ └── config # 配置类(Spring Boot) ├── resources │ ├── application.yml # 主配置 │ └── mapper # MyBatis XML └── test # 单元测试 ``` - 重点:**依赖关系分析**(利用`mvn dependency:tree`或IDE插件生成依赖图) 3. **技术栈深度掌握** | 技术类型 | 关键学习点 | 实践验证方式 | |----------------|-----------------------------------|--------------------------------| | **核心框架** | Spring IOC/AOP、事务管理机制 | 修改事务传播级别观察回滚效果 | | **中间件** | Redis缓存击穿解决方案、MQ消息幂等 | 模拟高并发测试消息重复消费 | | **数据库** | 分库分表策略、索引优化方案 | 用Explain分析慢SQL | 4. **代码研读技巧** - **从入口切入**:找到`SpringBootApplication`启动类,追踪请求链路(如HTTP请求→Controller→Service) - **断点调试黄金法则**: ```java // 关键位置设断点 + 条件触发(IDEA技巧) if(orderId > 10000) { // 设置条件断点 logger.debug("大订单处理逻辑"); } ``` - **逆向推导**:通过单元测试(`@Test`)反推模块功能 --- ### **、进阶实践策略** 1. **数据流全景分析** - 绘制**数据流转图**: ```mermaid graph LR A[用户请求] --> B(网关鉴权) B --> C[服务A处理] C --> D[(DB读写)] D --> E[消息队列通知] E --> F[服务B消费] ``` 2. **深度改造验证** - 示例挑战: - 将单点登录改造为OAuth2.0协议 - 将同步扣库存改为Redis+Lua分布式锁 3. **性能压测反推架构** - 用`JMeter`模拟并发场景,观察: - 线程池配置是否合理(拒绝策略触发条件) - 数据库连接池瓶颈(如Druid监控页) - 缓存命中率波动(Redis监控工具) --- ### **三、避坑指南** 1. **文档缺失时的应对** - 通过`git blame`追溯历史提交记录,还原代码演进逻辑 - 用Arthas在线诊断:`watch com.example.Service * '{params,returnObj}'` 观察方法入出参 2. **复杂技术栈速攻法** - 优先掌握**20%核心功能**(如Spring Cloud只深挖Gateway/Nacos) - 对照官方文档验证项目中的定制化修改(如RocketMQ消息重试机制被覆写)[^4] > **关键衡量标准**:能准确回答—— > - 项目的**技术选型权衡**(为什么用Kafka而非RabbitMQ?) > - **极端场景处理方案**(数据库挂掉时降级策略是什么?) > - **扩展性设计缺陷**(百万人同时抢券系统如何改造?) --- **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值