【读书会第13期】+第二章 视频文件的封装格式
【摘要】 今天主要学习内容知识点回顾:FFmpeg 支持很多封装格式,包括 MP4、FLV、MKV、TS 等视频封装格式、MP3、AAC、WMA 等音频封装格式以及 RTMP、RTSP、HLS 等网络协议封装格式。封装就是把编码器生成的多媒体文件,如视频,音频,字幕按照一定的标准混合封装在一起。今日重点MP4 视频封装格式(封装格式、格式标准、MP4 ftyp Box、moov容器、mdat Box)...
今天主要学习内容知识点回顾:
- FFmpeg 支持很多封装格式,包括 MP4、FLV、MKV、TS 等视频封装格式、MP3、AAC、WMA 等音频封装格式以及 RTMP、RTSP、HLS 等网络协议封装格式。
- 封装就是把编码器生成的多媒体文件,如视频,音频,字幕按照一定的标准混合封装在一起。
- 今日重点MP4 视频封装格式(封装格式、格式标准、MP4 ftyp Box、moov容器、mdat Box)
1.MP4 封装格式
封装格式比较
- RMVB:封闭,只能用来封装Real video格式的视频
- MKV:最开放,但是体积太大了
- AVI:老旧,不太适应最新的媒体文件
- MOV:苹果公司制定的,支持透明的视频
- MP4:是当前最主流的视频格式,各种软硬件也都支持的
MP4 封装格式基本上可以认为是日常生活和工作中最常见的视频文件格式,主要是由于其广泛的适用性,不仅在PC端(windows、mac、linux)支持的非常好,而且在移动端(Android、iOS)也能流畅播放。
例如:用ffmpeg把input.mov转换成output.mp4
ffmpeg -i input.mov outout.mp4
2.MP4 格式标准
MP4文件由一系列的box对象组成,所有的数据都包含在这些box中,除此以外,文件中再无其它数据。此外,所有的Mp4文件中,首先有且仅有一个File Type 类型的Box。
MP4 格式标准为 ISO-14496 Part 12 和 ISO-14496 Part 14,具体特征如下:
- MP4 文件由许多 Box(由唯一的标志符和长度限定的面向对象的结构块,在某些规格中被称为atom,一个Box中可以包含另一个Box) 和 FullBox。
- FullBox 是 Box 的扩展,在 Header 中增加了8位version信息和24位的flags信息。
- 每个 Box 由 Header(box header:box的元数据,比如box type、box size) 和 Data(box的数据部分,实际存储的内容跟box类型有关,比如mdat中body部分存储的媒体数据) 两部分组成。
- Header 中包含了整个 Box 的长度大小(size)和类型(type),只有type、size是必选字段。当size==0时,存在largesize字段。
- Data 中包含了实际的数据,可以是纯数据,也可以是子 Box。当 Box 中的 Data 是一系列子Box 时,这个 Box 又被称为 Container(当MP4中Box的Data是一系列子Box时,该Box被称容器)。
3.MP4 ftyp Box
ftyp Box(File Type Box,描述文件遵从的MP4规范与版本),一般位于文件开始位置,其中包含了 MP4 视频文件的类型、版本、兼容协议等信息。
定义如下:
aligned(8) class FileTypeBox extends Box(‘ftyp’) {
unsigned int(32) major_brand;
unsigned int(32) minor_version;
unsigned int(32) compatible_brands[]; // to end of the box
}
4.MP4 moov容器
- moov 容器中包含了 MP4 视频文件的媒体数据信息,内部又包含两个子容器:mvhd(Movie Header Box,mp4文件的整体信息,跟具体的视频流、音频流无关,比如创建时间、文件时长等)和trak(Track Box,一个mp4可以包含一个或多个轨道(比如视频轨道、音频轨道),轨道相关的信息就在trak里。trak是container box,至少包含两个box,tkhd、mdia;),前者定义了文件头信息,后者定义了媒体文件中的track信息。
- mvhd针对整个影片,tkhd针对单个track,mdhd针对媒体,vmhd针对视频,smhd针对音频,前者一般是从后者推导出来的。
- moov 容器一般默认会生成在 MP4 文件结尾,在线播放时需要加载完整个文件才能正常打开,为了能够快速打开视频,需要把 moov 容器放在 MP4 文件的前面。
- Movie Box,存储 mp4 的 metadata,一般位于mp4文件的开头。
aligned(8) class MovieBox extends Box(‘moov’){ }
5.MP4 mdat Box
- mdat Box(Media Data Box,存放实际的媒体数据,一般有多个),用来存放媒体文件的实际数据内容。
- box header size=0一般只有装载媒体数据的mdat box会用到largesize。
- box header size=1当前box为文件的最后一个box,通常包含在mdat box中。
aligned(8) class MediaDataBox extends Box(‘mdat’) {
bit(8) data[];
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)