MP4 文件格式详解


MP4 MP4 MP4 MP4 文 件格式 综述 关 键概 念 MP4 文件格式中,所有的内容存在一个称为 movie movie movie movie 的容器中。一个 movie movie movie movie 可以由多 个 tracktracktracktracks组成。每个 track track track track 就是一个随时间变化的媒体序列,例如,视频帧序列。 track track track track 里的每个时 间单位是一个 samplesamplesamplesample,它可以是一帧视频,或者音频。 sample sample sample sample 按照时间顺序排列。注意,一帧 音频可以分解成多个音频 samplesamplesamplesample,所以音频一般用 sample sample sample sample 作为单位,而不用帧。 MP4 文件格式 的定义里面,用 sample sample sample sample 这个单词表示一个时间帧或者数据单元。每个 track track track track 会有一个或者多 个 samplesamplesamplesample descriptiondescriptiondescriptiondescriptions。track track track track 里面的每个 sample sample sample sample 通过引用关联到一个 samplesamplesamplesample descriptiondescriptiondescriptiondescription。这 个samplesamplesamplesample descriptiondescriptiondescriptiondescriptions定义了怎样解码这个 samplesamplesamplesample,例如使用的压缩算法。 与其他的多媒体文件格式不同的是, MP4 文件格式经常使用几个不同的概念,理解其不同 是理解这个文件格式的关键。 这个文件的物理格式没有限定媒体本身的格式。例如,许多文件格式将媒体数据分成帧, 头部或者其他数据紧紧跟随每一帧视频,!!! TODO(例如 MPEG2)。而 MP4 文件格式不是如 此。 文件的物理格式和媒体数据的排列都不受媒体的时间顺序的限制。视频帧不需要在文件按 时间顺序排列。这就意味着如果文件中真的存在这样的一些帧,那么就有一些文件结构来描述媒体 的排列和对应的时间信息。 MP4 文件中所有的数据都封装在一些 box box box box 中(以前叫 atomatomatomatom)。所有的 metadata(媒体描 述元数据 ),包括定义媒体的排列和时间信息的数据都包含在这样的一些结构 box box box box 中。 MP4 文件格 式定义了这些这些 boxboxboxbox的格式。 Metadata 对媒体数据(例如,视频帧)引用说明。媒体数据可以 包含在同一个的一个或多个 boxboxboxbox里,也可以在其他文件中, metadata 允许使用 URLs 来引用其他 的文件,而媒体数据在这些引用文件中的排列关系全部在第一个主文件中的 metadata 描述。其他 的文件不一定是 MP4 文件格式,例如,可能就没有一个 box。 有很多种类的 tracktracktracktrack,其中有三个最重要, videovideovideovideo track track track track 包含了视频 samplesamplesamplesample;audioaudioaudioaudio tractractractrackkkk 包含了 audio samplesamplesamplesample;hinthinthinthint track track track track 稍有不同,它描述了一个流媒体服务器如何把文件中的媒体数据 组成符合流媒体协议的数据包。 如果文件只是本地播放,可以忽略 hinthinthinthint tracktracktracktrack,他们只与流媒体有 关系。 媒 体文 件的 物理 结构 Box Box Box Box 定义了如何在 sample table 中找到媒体数据的排列。这包括 data reference(数据引 用), the sample size table, the sample to chunk table, and the chunk offset table. 这些表就可以找 到track 中每个 sample 在文件中的位置和大小。 datadatadatadata reference reference reference reference 允许在第二个媒体文件中找到媒体的位置。这样,一部电影就可以由一个 媒体数据库中的多个不同文件组成,而且不用把它们全部拷贝到另一个新文件中。例如,对视频编 辑就很有帮助。 为了节约空间,这些表都很紧凑。另外, interleave 不是 sample by sample,而是把单 个 track 的几个 samples 组合到一起,然后另外几个 sample 又进行新的组合,等等。一个 track 的连 续几个 sample 组成的单元就被称为 chunkchunkchunkchunk。每个 chunk 在文件中有一个偏移量,这个偏移量是从 文件开头算起的,在这个 chunk 内, sample 是连续存储的。 这样,如果一个 chunk 包含两个 sample,第二个 sample 的位置就是 chunk 的偏移量加上 第一个 sample 的大小。 chunk offset table 说明了每个 chunk 的偏移量, sample to chunk table 说 明了 sample 序号和 chunk 序号的映射关系。 注意 chunk 之间可能会有死区,没有任何媒体数据引用到这部分区域,但是 chunk 内部不 会有这样的死区。这样,如果在节目编辑的时候,不需要一些媒体数据,就可以简单的留在那里, 而不用引用,这样就不用删除它们了。类似的,如果媒体存放在第二个文件中,但是格式不同 于 MP4 文件格式,这个陌生文件的头部或者其他文件格式都可以简单忽略掉。 TemporalTemporalTemporalTemporal structurestructurestructurestructure ofofofof thethethethe mediamediamediamedia 文件中的时间可以理解为一些结构。电影以及每个 track 都有一个 timescaletimescaletimescaletimescale。它定义了一 个时间轴来说明每秒钟有多少个 ticks。合理的选择这个数目,就可以实现准确的计时。一般来 说,对于 audio track,就是 audio 的sampling rate。对于 video track,情况稍微复杂,需要合理 选择。例如,如果一个 media TimeScale 是30000,media sample durations 是1001,就准确的 定义了 NTSC video 的时间格式(虽然不准确,但一般就是 29.97),and provide 19.9 hours of time in 32 bits. Track 的时间结构受一个 editediteditedit list list list list 影响,有两个用途:全部电影中的一个 track 的一部分时 间片断变化(有可能是重用);空白时间的插入,也就是空的 edits。特别注意的是如果一个 track 不是从节目开头部分开始, edit list 的第一个 edit 就一定是空的 edit。 每个 track 的全部 duration 定义在文件头部,这就是对 track 的总结,每个 sample 有一个 规定的 durationdurationdurationduration。一个 sample 的准确描述时间,也就是他的时间戳 (time-stamp)就是以前 的 sample 的duration 之和。 InterleaveInterleaveInterleaveInterleave 文件的时间和物理结构可以是对齐的,这表明媒体数据在容器中的物理顺序就是时间顺 序。另外,如果多个 track 的媒体数据包含在同一个文件中,这个媒体数据可以是 interleaved。一 般来说,为了方便读取一个 track 的媒体数据,同时保证每个表紧凑,以一个合适的时间间隔(例 如1秒)做一次 interleave,而不是 sample by sample。这样就可以减少 chunk 的数据,减 小 chunk offset table 的大小。 CompositionCompositionCompositionComposition 如果多个 audio track 包含在同一个文件中,他们有可能被混合在一起进行播放,并且由一 个总 track volume volume volume volume 和左 /右balance balance balance balance 控制。 类似的, video track 也可以根据各自的层次序列号(从后向前)和合成模式进行混合。另 外,每个 track 可以用一个 matrix 进行变换,也可以全部电影用一个 matrix 进行变换。这样既可以 进行简单操作(例如放大图像,校正 90º 旋转),也可以做更复杂的操作(例如 shearing, arbitrary rotation)。这个混合方法只是非常简单,是一个缺省的方法, MPEG4 的另一份文档会定 义更强有力的方法(例如 MPEG-4 BIFS)。 mp4 mp4 mp4 mp4 文件例子 Darwin Streaming Server 里面有一些很好的工具,可以帮助分析 mp4 文件格 式。 但是如果可以自己逐字节的 parse 文件,可以更好的了解 mp4 文件格式。这里我就 逐字节的分析文件结构。文件例子是 DSS 里面包含的 sample_100kbit.mp4 MovieMovieMovieMovie AtomAtomAtomAtom ----MOOVMOOVMOOVMOOV Movie atom 定义了一部电影的数据信息。 它的类型是 'moov',是一个容器 atom,至少必须包 含三种 atom 中的一种 —movie header atom('mvhd'), compressed movie atom('cmov')和reference movie atom ('rmra')。没有压缩的 movie header atom 必须至少包含 movie header atom 和reference movie atom 中的一种。也可以包含其他的 atom,例如一个 clipping atom ('clip'),一个或几个 track atoms ('trak'), 一个 color table atom ('ctab'),和一个 user data atom ('udta')。其中 movie header atom 定义了整部电影 的time scale,duration 信息以及 display characteristics。track atom 定义了电影中一个 track 的信息。 Track 就是电影中可以独立操作的媒体单位,例如一个声道就是一个 track。 Compressed movie atoms 和reference movie atoms 不太使用,不在本文讨论范围内。本文主要讨 论 uncompressed movie atoms。 字段 长度 (字节 ) 描述 尺寸 4 这个 movie header atom 的字节数 类型 4 moov 以下是实际的 sample_100kbit.mp4 的部分字节,可以看到结果是 主要包含四个子 atom,movie header atom(mvhd), 一个 audio track atom(trak),一 个 video track atom(trak)。 MovieMovieMovieMovie HeaderHeaderHeaderHeader AtomsAtomsAtomsAtoms ----MVHDMVHDMVHDMVHD Movie header atom 定义了整个 movie 的特性,例如 time scale 和duration,它的 atom 类型是 'mvhd'。 字段 长度 (字节 ) 描述 尺寸 4 这个 movie header atom 的字节数 类型 4 Mvhd 版本 1 这个 movie header atom 的版本 标志 3 扩展的 movie header 标志,这里为 0 生成时间 4 Movie atom 的起始时间。基准时间是 1904-1-1 0:00 AM 修订时间 4 Movie atom 的修订时间。基准时间是 1904-1-1 0:00 AM Time scale 4 A time value that indicates the time scale for this movie—that is, the number of time units that pass per second in its time coordinate system. A time coordinate system that measures time in sixtieths of a second, for example, has a time scale of 60. Duration 4 A time value that indicates the duration of the movie in time scale units.Note that this property is derived from the movie’s tracks. The value of this field corresponds to the duration of the longest track in the movie. 播放速度 4 播放此 movie 的速度。 1.0为正常播放速度 播放音量 2 播放此 movie 的音量。 1.0为最大音量 保留 10 这里为 0 矩阵结构 36 该矩阵定义了此 movie 中两个坐标空间的映射关系 预览时间 4 开始预览此 movie 的时间 预览 duration 4 以movie 的time scale 为单位, 预览的 duration Poster time 4 The time value of the time of the movie poster. Selection time 4 The time value for the start time of the current selection. Selection duration 4 The duration of the current selection in movie time scale units. 当前时间 4 当前时间 下一 个 track ID 4 下一个待添加 track 的ID值。 0不是一个有效的 ID值。 TrackTrackTrackTrack AtomsAtomsAtomsAtoms ----TRAKTRAKTRAKTRAK 一个 Track atom定义了 movie 中的一个 track。一部 movie 可以包含一个或多个 tracks,它 们之间相互独立,各自有各自的时间和空间信息。每个 track atom 都有与之关联的 media atom。 Track 主要用于以下目的: • 包含媒体数据引用和描述 (media tracks) • 包含 modifier tracks (tweens 等) • 对于流媒体协议的打包信息 (hint tracks)。Hint tracks 可以引用或者复制对应的媒体 sample data。 Hint tracks 和modifier tracks 必须保证完整性,同时和至少一个 media track 一起存在。换句 话说,即使 hint tracks 复制了对应的媒体 sample data,media tracks 也不能从一部 hinted movie 中删 除。 Track atoms 的atom 类型是 'trak'. Track atom 要求必须有一个 track header atom ('tkhd') 和一 个 media atom ('mdia')。其他的 track clipping atom ('clip'),track matte atom ('matt'),edit atom ('edts'), track reference atom ('tref'),track load settings atom ('load'),a track input map atom ('imap')以及 user data atom ('udta')都是可选的。 Track atoms 是一个容器 atom,本身没有特别的字段,需要子 atom 来进一步说明有效的内 容。 字段 长度 (字节 ) 描述 尺寸 4 这个 atom 的字节数 类型 4 Edts Audio track 的值 Video track 的值 每个 trak 都包含了一个 track header atom TrackTrackTrackTrack HeaderHeaderHeaderHeader AtomsAtomsAtomsAtoms ----TKHDTKHDTKHDTKHD 每个 trak 都包含了一个 track header atom. The track header atom 定义了一个 track 的 特性,例如时间,空间和音量信息,它的类型是 ('tkhd'). 字段 长度 (字节 ) 描述 尺寸 4 这个 atom 的字节数 类型 4 tkhd 版本 1 这个 atom 的版本 标志 3 有效的标志是 • 0x0001 - the track is enabled • 0x0002 - the track is used in the movie • 0x0004 - the track is used in the movie’s preview • 0x0008 - the track is used in the movie’s poster 生成时间 4 Movie atom 的起始时间。基准时间是 1904-1-1 0:00 AM 修订时间 4 Movie atom 的修订时间。基准时间是 1904-1-1 0:00 AM Track ID 4 唯一标志该 track 的一个非零值。 保留 4 这里为 0 Duration 4 The duration of this track (in the movie’s time coordinate system). Note that this property is derived from the track’s edits. The value of this field is equal to the sum of the durations of all of the track’s edits. If there is no edit list, then the duration is the sum of the sample durations, converted into the movie timescale. 保留 8 这里为 0 Layer 2 The track’s spatial priority in its movie. The QuickTime Movie Toolbox uses this value to determine how tracks overlay one another. Tracks with lower layer values are displayed in front of tracks with higher layer values. Alternate group 2 A collection of movie tracks that contain alternate data for one another. QuickTime chooses one track from the group to be used when the movie is played. The choice may be based on such considerations as playback quality, language, or the capabilities of the computer. 音量 2 播放此 track 的音量。 1.0为正常音量 保留 2 这里为 0 矩阵结构 36 该矩阵定义了此 track 中两个坐标空间的映射关系 宽度 4 如果该 track 是video track,此值为图像的宽度 高度 4 如果该 track 是video track,此值为图像的高度 Audio track 的值 Video track 的值 EditEditEditEdit AtomsAtomsAtomsAtoms ----EDTSEDTSEDTSEDTS Edit atoms 定义了创建 movie 中一个 track 的一部分媒体。所有的 edit都在一个表里面,包 括每一部分的时间偏移量和长度。 Edit atoms 的类型是 'edts'。如果没有该表,则此 track 会被立即播放。 一个空的 edit用来偏移 track 的起始时间。 如果没有 edit atom 或edit list atom,则此 track 使用全部媒体。 Edit atoms 是一个容器 atom,本身没有特别的字段,需要子 atom 来进一步说明有效的内容。 字段 长度 (字节 ) 描述 尺寸 4 这个 atom 的字节数 类型 4 Edts Audio track 的值 Video track 的值 EditEditEditEdit ListListListList AtomsAtomsAtomsAtoms ----ELSTELSTELSTELST 1. Edit list atom 用来映射 movie 的时间到此 track media 的时间。所有信息在一个 edit list 表 中,见下图。 Edit list atoms 的类型是 'elst'. 字段 长度 (字节 ) 描述 尺寸 4 这个 atom 的字节数 类型 4 elst 版本 1 这个 atom 的版本 标志 3 这里为 0 条目数目 4 后面的 edit list 表中的条目数目 edit list 表可变 每一个条目包含 3项,见下图和下表 字段 长度 (字节 ) 描述 Track duration 4 duration of this edit segment in units of the movie’s time scale. 时间 4 starting time within the media of this edit segment (in media timescale units)。值为 -1 表示是空 edit。Track 中的最后一个 edit永远不 能为空。 Any difference between the movie’s duration and the track’s duration is expressed as an implicit empty edit. 速度 4 relative rate at which to play the media corresponding to this edit segment。 不能是 0或负数。 Audio track 的值 Video track 的值 Track Reference Atoms -TREF Track reference atoms define relationships between tracks. Track reference atoms allow one track to specify how it is related to other tracks. For example, if a movie has three video tracks and three sound tracks, track references allow you to identify the related sound and video tracks. Track reference atoms have an atom type value of 'tref'. Track references are uni-directional and point from the recipient track to the source track. For example, a video track may reference a time code track to indicate where its time code is stored, but the time code track would not reference the video track. The time code track is the source of time information for the video track. A single track may reference multiple tracks. For example, a video track could reference a sound track to indicate that the two are synchronized and a time code track to indicate where its time code is stored. A single track may also be referenced by multiple tracks. For example, both a sound and video track could reference the same time code track if they share the same timing information. If this atom is not present, the track is not referencing any other track in any way. Note that the array of track reference type atoms is sized to fill the track reference atom. Track references with a reference index of 0 are permitted. This indicates no reference. Each track reference atom defines relationships with tracks of a specific type. The reference type implies a track type. Following table shows the track reference types and their descriptions. Table: Track reference types Reference type Description tmcd Time code. Usually references a time code track. chap Chapter or scene list. Usually references a text track. sync Synchronization. Usually between a video and sound track. Indicates that the two tracks are synchronized. The reference can be from either track to the other, or there may be two references. scpt Transcript. Usually references a text track. ssrc Nonprimary source. Indicates that the referenced track should send its data to this track, rather than presenting it. The referencing track will use the data to modify how it presents its data. See “Track Input Map Atoms”(page 51) for more information. hint The referenced tracks contain the original media for this hint track. Each track reference type atom contains the following data elements. Size A 32-bit integer that specifies the number of bytes in this track reference type atom. Type A 32-bit integer that identifies the atom type; this field must be set to one of the values shown in above table. Track IDs A list of track ID values (32-bit integers) specifying the related tracks. Note that this is one case where track ID values can be set to 0. Unused entries in the atom may have a track ID value of 0. Setting the track ID to 0 may be more convenient than deleting the reference. You can determine the number of track references stored in a track reference type atom by subtracting its header size from its overall size and then dividing by the size, in bytes, of a track ID. MediaMediaMediaMedia AtomsAtomsAtomsAtoms ----MDIAMDIAMDIAMDIA Media atoms 定义了 track 的媒体类型和 sample 数据,例如音频或视频,描述 sample 数据 的 media handler component,media timescale and track duration 以及 media-and-track-specific 信息,例如 音量和图形模式。它也可以包含一个引用,指明媒体数据存储在另一个文件中。也可以包含一 个 sample table atoms,指明 sample description, duration, and byte offset from the data reference for each media sample. Media atom 的类型是 'mdia'。它是一个容器 atom,必须包含一个 media header atom ('mdhd'),一 个handler reference ('hdlr'),一个媒体信息引用 ('minf')和用户数据 atom('udta'). 字段 长度 (字节 ) 描述 尺寸 4 这个 atom 的字节数 类型 4 Edts Audio track 的值 Video track 的值 MediaMediaMediaMedia HeaderHeaderHeaderHeader AtomsAtomsAtomsAtoms ----MDHDMDHDMDHDMDHD Media header atom 定义了媒体的特性,例如 time scale 和duration。它的类型是 'mdhd'. 字段 长度 (字节 ) 描述 尺寸 4 这个 atom 的字节数 类型 4 mdhd 版本 1 这个 atom 的版本 标志 3 这里为 0 生成时间 4 Movie atom 的起始时间。基准时间是 1904-1-1 0:00 AM 修订时间 4 Movie atom 的修订时间。基准时间是 1904-1-1 0:00 AM Time scale 4 A time value that indicates the time scale for this media—that is, the number of time units that pass per second in its time coordinate system. Duration 4 The duration of this media in units of its time scale. 语言 2 媒体的语言码 质量 2 媒体的回放质量???怎样生成此质量,什么是参照点 Audio track 的值 Video track 的值 HandlerHandlerHandlerHandler ReferenceReferenceReferenceReference AtomsAtomsAtomsAtoms ----HDLRHDLRHDLRHDLR Handler reference atom 定义了描述此媒体数据的 media handler component,类型是 'hdlr'。在 过去, handler reference atom 也可以用来数据引用,但是现在,已经不允许这样使用了。一个 media atom 内的 handler atom 解释了媒体流的播放过程。例如,一个视频 handler 处理一个 video track。 字段 长度 (字节 ) 描述 尺寸 4 这个 atom的字节数 类型 4 hdlr 版本 1 这个 atom的版本 标志 3 这里为 0 Component type 4 handler 的类型。当前只有两种类型 •'mhlr':media handlers •'dhlr':data handlers Component subtype 4 media handler or data handler 的类型。 如果 component type 是mhlr,这个字段定义了数据的类型,例如, 'vide'是video 数据, 'soun'是sound 数据 如果 component type 是dhlr,这个字段定义了数据引用的类型,例 如, 'alis'是文件的别名 Component manufacturer 4 保留字段,缺省为 0 Component flags 4 保留字段,缺省为 0 Component flags mask 4 保留字段,缺省为 0 Component name 可变 这个 component 的名字,也就是生成此 media 的media handler。该字 段的长度可以为 0 Audio track 的值 Video track 的值 MediaMediaMediaMedia InformationInformationInformationInformation AtomsAtomsAtomsAtoms ----MINFMINFMINFMINF Media information atoms 的类型是 'minf',存储了解释该 track 的媒体数据的 handler-specific 的信 息。 media handler 用这些信息将媒体时间映射到媒体数据,并进行处理。它是一个容器 atom,包含 其他的子 atom。 这些信息是与媒体定义的数据类型特别对应的,而且 media information atoms 的格式和内容 也是与解释此媒体数据流的 media handler 密切相关的。其他的 media handler 不知道如何解释这些 信息。 字段 长度 (字节 ) 描述 尺寸 4 这个 atom 的字节数 类型 4 minf Audio track 的值 Video track 的值 VideoVideoVideoVideo MediaMediaMediaMedia InformationInformationInformationInformation AtomsAtomsAtomsAtoms Video media information atoms 是视频媒体的第一层 atoms,包含其他的定义视频媒体数据的 特性。 SoundSoundSoundSound MediaMediaMediaMedia InformationInformationInformationInformation AtomsAtomsAtomsAtoms Sound media information atoms 是音频媒体的第一层 atoms,包含其他的定义音频媒体数据的特性。 VideoVideoVideoVideo MediaMediaMediaMedia InformationInformationInformationInformation HeaderHeaderHeaderHeader AtomsAtomsAtomsAtoms Video media information header atoms 定义颜色和图形模式信息。 字段 长度 (字节 ) 描述 尺寸 4 这个 atom 的字节数 类型 4 vmhd 版本 1 这个 atom 的版本 标志 3 这里总是 0x000001 图形模式 2 The transfer mode. The transfer mode specifies which Boolean operation QuickDrawshould performwhen drawing or transferring an image fromone location to another. Opcolor 6 Three 16-bit values that specify the red, green, and blue colors for the transfer mode operation indicated in the graphics mode field. [mp4 文件格式 ]17 - Sound Media Information Header Atoms -SMHD wqyuwss 发表 于2007-5-1 4:06:00 The sound media information header atom定义了声音媒体的控制信息,例如均衡。 字段 长度 (字节 ) 描述 尺寸 4 这个 atom 的字节数 类型 4 smhd 版本 1 这个 atom 的版本 标志 3 这里为 0 均衡 2 音频的均衡是用来控制计算机的两个扬声器的声音混合效果,一般 是 0。一般值是 0。 保留 2 保留字段,缺省为 0 DataDataDataData InformationInformationInformationInformation AtomsAtomsAtomsAtoms ----DINFDINFDINFDINF handler reference 定义 data handler component 如何获取媒体数据, data handler 用这些数据信 息来解释媒体数据。 Data information atoms 的类型是 'dinf'。它是一个容器 atom,包含其他的 子 atom。 Audio track 的值 Video track 的值 Data Reference Atoms -DREF Data reference atoms 包含列表数据, data handler component 可以用这些数据获取媒体数据。 字段 长度 (字节 ) 描述 尺寸 4 这个 atom 的字节数 类型 4 dref 版本 1 这个 atom 的版本 标志 3 这里为 0 条目数目 4 data references 的数目 Data references 每个 data reference 就像 atom 的格式一样,包含以下的数据成员 尺寸 4 这个 atom 的字节数 类型 4 见下表 版本 1 这个 data reference 的版本 标志 3 目前只有一个标志: Self reference This flag indicates that the media’s data is in the same file as the movie atom. On the Macintosh, and other file systems with multifork files, set this flag to 1 even if the data resides in a different fork from the movie atom. This flag’s value is 0x0001. 数据 可变 data reference 信息 Following Table shows the currently defined data reference types that may be stored in a header atom. 表: Data reference 类型 类型 描述 alis Data reference 是一个 Macintosh alias。一个 alias 包含文件信息,例如全路径 名。 rsrc Data reference 是一个 Macintosh alias。Alias 末尾是文件使用的资源类型( 32bit 整数)和 ID(16bit 带符号的整数) url 一个 C类型的字符串,表示一个 URL。字符串后可以有其他的数据。 Audio track 的值 Video track 的值 [mp4 文件格式 ]mp4 文件格式系列 20 - Sample Atoms wqyuwss 发表于 2007-5-1 4:13:00 存储媒体数据的单位是 samples。一个 sample 是一系列按时间顺序排列的数据的一个 element。 Samples 存储在 media 中的 chunk 内,可以有不同的 durations。Chunk 存储一个或者多个 samples, 是数据存取的基本单位,可以有不同的长度,一个 chunk 内的每个 sample 也可以有不同的长度。例 如如下图, chunk 2和3不同的长度, chunk 2内的 sample 5和6的长度一样,但是 sample 4和5,6 的长度不同。 sample table atom描述 sample 的所有信息以及一些不同类型的 atoms,media handler 可以用这些信 息正确的按顺序解析所有的 samples,而不需要强迫这些数据按 movie 的时间顺序存放到实际数据 流中。 • 如何得到 chunk 的数目和每个 chunk 包含多少个 sample,每个 chunk 的description 是如何 解析 stsc - Sample-to-Chunk table。这个表类似于行程编码,第一个 first chunk 减去第二个 first chunk 就是一共有多少个 trunk 包含相同的 sample 数目,这样通过不断的叠加,就可以得到一共有 280个 trunk,每个 trunk 包含多少个 sample,以及每个 trunk 对应的 description。 • 如何计算每个 sample 的duration • 如何计算每个 sample 的长度 解析 stsz - Sample Size table。这个表包含了每个 sample 的长度,找到 sample 的序号,就可以找到 对应 sample 的长度了。 Sample Table Atoms -STBL sample table atom包含转化媒体时间到实际的 sample 的信息,他也说明了解释 sample 的信 息,例如,视频数据是否需要解压缩,解压缩算法是什么?它的类型是 'stbl',是一个容器 atom,包 含 sample description atom, time-to-sample atom, sync sample atom, sample-to-chunk atom, sample size atom, chunk offset atom 和shadow sync atom. sample table atom 包含 track 中media sample 的所有时间和数据索引,利用这个表,就可以 定位 sample 到媒体时间,决定其类型,大小,以及如何在其他容器中找到紧邻的 sample。 如果 sample table atom 所在的 track 没有引用任何数据,那么它就不是一个有用的 media track,不需 要包含任何子 atom。 如果 sample table atom 所在的 track 引用了数据,那么必须包含以下的子 atom:sample description, sample size, sample to chunk 和chunk offset。所有的子表有相同的 sample 数目。 sample description atom 是必不可少的一个 atom,而且必须包含至少一个条目,因为它包含 了数据引用 atom检索 media sample 的目录信息。没有 sample description,就不可能计算出 media sample 存储的位置。 sync sample atom 是可选的,如果没有,表明所有的 samples 都是 sync samples。 Audio track 的值 Video track 的值 SampleSampleSampleSample DescriptionDescriptionDescriptionDescription AtomsAtomsAtomsAtoms ----STSDSTSDSTSDSTSD 利用 sample description atom 存储的信息可以正确的解码 media sample。不同的媒体类型存储不同 的 sample description,例如,视频媒体, sample description 就是图像的结构。第四章解释了不同媒体 类型对应的 sample description 信息。 sample description atom 的类型是 'stsd',包含了一个 sample description 表。根据不同的编码方案和存储 数据的文件数目,每个 media 可以有一个到多个 sample description。sample-to-chunk atom 通过这个 索引表,找到合适 medai 中每个 sample 的description。 字段 长度 (字节 ) 描述 尺寸 4 这个 atom 的字节数 类型 4 stsd 版本 1 这个 atom 的版本 标志 3 这里为 0 条目数目 4 sample descriptions 的数目 Sample description 不同的媒体类型有不同的sample description ,但是每个sample description 的前四个字段是相同的,包含以下的数据成员 尺寸 4 这个 sample description 的字节数 数据格式 4 存储数据的格式。 保留 6 数据引用 索引 2 利用这个索引可以检索与当前 sample description 关联的数据。数据引 用存储在 data reference atoms。 Audio track 的值 可以看出这个 sample 只有一个 description,对应得的数据格式是 'mp4a',14496-12 定义了这种结 构, mp4 解码器会识别此 description。XXX Video track 的值 可以看出这个 sample 只有一个 description,对应得的数据格式是 'mp4v',14496-12 定义了这种结 构, mp4 解码器会识别此 description。XXX Time-to-SampleTime-to-SampleTime-to-SampleTime-to-Sample AtomsAtomsAtomsAtoms ----STTSSTTSSTTSSTTS Time-to-sample atoms 存储了 media sample 的duration 信息,提供了时间对具体 data sample 的映射方法,通过这个 atom,你可以找到任何时间的 sample,类型是 'stts'。 这个 atom可以包含一个压缩的表来映射时间和 sample 序号,用其他的表来提供每 个 sample 的长度和指针。表中每个条目提供了在同一个时间偏移量里面连续的 sample 序号, 以及 samples 的偏移量。递增这些偏移量,就可以建立一个完整的 time-to-sample 表,计算公式如下 DT(n+1) = DT(n) + STTS(n) 其中 STTS(n)是没有压缩的 STTS 第n项信息, DT 是第 n个sample 的显示时间。 Sample 的排列是按 照时间戳的顺序,这样偏移量永远是非负的。 DT 一般以 0开始,如果不为 0,edit list atom 设定初始的 DT 值。 DT计算公式如 下 DT(i) = SUM(for j=0 to i-1 of delta(j)) 所有偏移量的和就是 track 中media 的长度,这个长度不包括 media 的time scale,也不包括 任何 edit list。 字段 长度 (字节 ) 描述 尺寸 4 这个 atom 的字节数 类型 4 stts 版本 1 这个 atom 的版本 标志 3 这里为 0 条目数目 4 time-to-sample 的数目 time-to- sample Media 中每个 sample 的duration。包含如下结构 Sample count 4 有相同 duration 的连续 sample 的数目 Sample duration 4 每个 sample 的duration 如果多个 sample 有相同的 duration,可以只用一项描述所有这些 samples,数量字段说 明 sample 的个数。例如,如果一个视频媒体的帧率保持不变,整个表可以只有一项,数量就是全部的 帧数。 Audio track 的值 可以看出这个 mp4a类型的音频 track 只有一项 time-to-sample,一共有 547个sample,每 个 sample 的duration 是1024。 Video track 的值 可以看出这个 mp4v 类型的 video track 只有一项 time-to-sample,一共有 1050 个sample,每 个sample 的duration 是40。 Sync Sample Atoms -STSS sync sample atom 确定 media 中的关键帧。对于压缩的媒体,关键帧是一系列压缩序列的开 始帧,它的解压缩是不依赖于以前的帧。后续帧的解压缩依赖于这个关键帧。 sync sample atom 可以非常紧凑的标记媒体内的随机存取点。它包含一个 sample 序号表, 表内的每一项严格按照 sample 的序号排列,说明了媒体中的哪一个 sample 是关键帧。如果此表不 存在,说明每一个 sample 都是一个关键帧,是一个随机存取点。 Sync sample atoms 的类型是 'stss'。 字段 长度 (字节 ) 描述 尺寸 4 这个 atom 的字节数 类型 4 stss 版本 1 这个 atom 的版本 标志 3 这里为 0 条目数目 4 sync sample 的数目 sync sample sync sample 表的 结构 Sample 序 号 4 是关键帧的 sample 序号 Video track 的值 可以看出这个 video 片断共有 35个关键帧。 Sample-to-ChunkSample-to-ChunkSample-to-ChunkSample-to-Chunk AtomsAtomsAtomsAtoms ----STSCSTSCSTSCSTSC 当添加 samples 到media 时,用 chunks 组织这些 sample,这样可以方便优化数据获取。一 个trunk 包含一个或多个 sample,chunk 的长度可以不同, chunk 内的 sample 的长度也可以不同。 sample-to-chunk atom 存储 sample 与chunk 的映射关系。 Sample-to-chunk atoms 的类型是 'stsc'。它也有一个表来映射 sample 和trunk 之间的关系,查看这张 表,就可以找到包含指定 sample 的trunk,从而找到这个 sample。 字段 长度 (字节 ) 描述 尺寸 4 这个 atom 的字节数 类型 4 stsc 版本 1 这个 atom 的版本 标志 3 这里为 0 条目数目 4 sample-to-chunk 的数目 sample-to- chunk sample-to-chunk 表的 结构 First chunk 4 这个 table 使用的第一个 chunk 序号 Samples per chunk 4 当前 trunk 内的 sample 数目 Sample description ID 4 与这些 sample 关联的 sample description 的序号 Audio track 的值 可以建立这个 sample-to-chunk 表,共有 33项。 Video track 的值 可以建立这个 sample-to-chunk 表,共有 140 项。 First chunk Samples per chunk Sample description ID 1 4 1 4 3 1 5 4 1 8 3 1 9 4 1 12 3 1 13 4 1 16 3 1 17 4 1 20 3 1 21 4 1 可以建立 Video track 的sample-to-chunk 表,共有 140 项。 First chunk Samples per chunk Sample description ID 1 4 1 4 3 1 5 4 1 8 3 1 9 4 1 12 3 1 13 4 1 16 3 1 17 4 1 20 3 1 21 4 1 ……… 277 4 1 280 3 1 这个表类似于行程编码,第一个 first chunk 减去第二个 first chunk 就是一共有多少个 trunk 包含相同的 sample 数目,这样通过不断的叠加,就可以得到一共有 280个trunk,每个 trunk 包含多 少个 sample,以及每个 trunk 对应的 description。 SampleSampleSampleSample SizeSizeSizeSize AtomsAtomsAtomsAtoms ----STSZSTSZSTSZSTSZ sample size atoms 定义了每个 sample 的大小,它的类型是 'stsz',包含了媒体中全部 sample 的数目和一张给出每个 sample 大小的表。这样,媒体数据自身就可以没有边框的限制。 字段 长度 (字节 ) 描述 尺寸 4 这个 atom 的字节数 类型 4 stsz 版本 1 这个 atom 的版本 标志 3 这里为 0 Sample size 4 全部 sample 的数目。如果所有的 sample 有相同的长度,这个字段就是 这个值。否则,这个字段的值就是 0。那些长度存在 sample size 表中 条目数目 4 sample size 的数目 sample size sample size 表的结构。这个表根据sample number 索引,第一项就是第 一个 sample,第二项就是第二个 sample 大小 4 每个 sample 的大小 Audio track 的值 这个表是最大的一个表,可以看到这个 audio track 的sample 的长度都不一样,一共有 547项。 Video track 的值 这个表包含了每个 sample 的长度,找到 sample 的序号,就可以找到对应 sample 的长度 了。可以看到 video track 共有 1050 个sample。 ChunkChunkChunkChunk OffsetOffsetOffsetOffset AtomsAtomsAtomsAtoms ----STCOSTCOSTCOSTCO Chunk offset atoms 定义了每个 trunk 在媒体流中的位置,它的类型是 'stco'。位置有两种可 能, 32位的和 64位的,后者对非常大的电影很有用。在一个表中只会有一种可能,这个位置是在 整个文件中的,而不是在任何 atom 中的,这样做就可以直接在文件中找到媒体数据,而不用解 释 atom。需要注意的是一旦前面的 atom 有了任何改变,这张表都要重新建立,因为位置信息已经改 变了。 字段 长度 (字节 ) 描述 尺寸 4 这个 atom 的字节数 类型 4 stco 版本 1 这个 atom 的版本 标志 3 这里为 0 条目数目 4 chunk offset 的数目 chunk offset 字 节偏移量从文件开始到当前 chunk。这 个表根据 chunk number 索 引, 第一项就是第一个 trunk,第二项就是第二个 trunk 大小 4 每个 sample 的大小 Audio track 的值 Video track 的值 [mp4 文件格式 ]获取 mp4 文件信息 1 - 计算电影长度 wqyuwss 发表于 2007-5-1 4:42:00 方法 1 从mvhd - movie header atom 中找到 time scale 和duration,duration 除以 time scale 即是整部电影的 长度。 time scale 相当于定义了标准的 1秒在这部电影里面的刻度是多少。 例如 audio track 的time scale = 8000, duration = 560128,所以总长度是 70.016,video track 的time scale = 600, duration = 42000,所以总长度是 70 方法 2 首先计算出共有多少个帧,也就是 sample(从 sample size atoms 中得到),然后 整部电影的 duration = 每个帧的 duration 之和(从 Time-to-sample atoms 中得出) 例如 audio track 共有 547个sample,每个 sample 的长度是 1024,则总 duration 是560128,电影长 度是 70.016;video track 共有 1050 个sample,每个 sample 的长度是 40,则总 duration 是42000, 电影长度是 70 [mp4 文件格式 ]获取 mp4 文件信息 2 - 计算电影图像宽度和高度 wqyuwss 发表于 2007-5-1 4:44:00 从tkhd – track header atom 中找到宽度和高度即是 。 [mp4 文件格式 ]获取 mp4 文件信息 3 - 计算电影声音采样频率 wqyuwss 发表于 2007-5-1 4:44:00 从tkhd – track header atom 中找出 audio track 的time scale 即是声音的采样频率。 [mp4 文件格式 ]获取 mp4 文件信息 4 - 计算视频帧率 wqyuwss 发表于 2007-5-1 4:45:00 首先计算出整部电影的 duration,和帧的数目然后 帧率 = 整部电影的 duration / 帧的数目 [mp4 文件格式 ]获取 mp4 文件信息 5 - 计算电影的比特率 wqyuwss 发表于 2007-5-1 4:46:00 整部电影的尺寸除以长度,即是比特率,此电影的比特率为 846623/70 = 12094 bps [mp4 文件格式 ]获取 mp4 文件信息 6 - 查找 sample wqyuwss 发表于 2007-5-1 4:47:00 当播放一部电影或者一个 track 的时候,对应的 media handler 必须能够正确的解析数据流,对一定 的时间获取对应的媒体数据。如果是视频媒体, media handler 可能会解析多个 atom,才能找到给 定时间的 sample 的大小和位置。具体步骤如下: 1.确定时间,相对于媒体时间坐标系统 2.检查 time-to-sample atom 来确定给定时间的 sample 序号。 3.检查 sample-to-chunk atom 来发现对应该 sample 的chunk。 4.从 chunk offset atom 中提取该 trunk 的偏移量。 5.利用 sample size atom找到 sample 在trunk 内的偏移量和 sample 的大小。 例如,如果要找第 1秒的视频数据,过程如下: 1.第1秒的视频数据相对于此电影的时间为 600 2.检查 time-to-sample atom,得出每个 sample 的duration 是40,从而得出需要寻找第 600/40 = 15 + 1 = 16个sample 3.检查 sample-to-chunk atom,得到该 sample 属于第 5个chunk 的第一个 sample,该 chunk 共 有4个sample 4.检查 chunk offset atom找到第 5个trunk 的偏移量是 20472 5.由于第 16个sample 是第 5个trunk 的第一个 sample,所以不用检查 sample size atom, trunk 的偏移量即是该 sample 的偏移量 20472。如果是这个 trunk 的第二个 sample,则 从 sample size atom 中找到该 trunk 的前一个 sample 的大小,然后加上偏移量即可得到实际位 置。 6.得到位置后,即可取出相应数据进行解码,播 放 [mp4 文件格式 ]获取 mp4 文件信息 7 - 查找关键帧 wqyuwss 发表于 2007-5-1 4:48:00 查找过程与查找 sample 的过程非常类似,只是需要利用 sync sample atom来确定 key frame 的 sample 序号 1. 确定给定时间的 sample 序号 2. 检查 sync sample atom 来发现这个 sample 序号之后的 key frame 3. 检查 sample-to-chunk atom 来发现对应该 sample 的chunk 4. 从chunk offset atom 中提取该 trunk 的偏移量 5. 利用 sample size atom找到 sample 在trunk 内的偏移量和 sample 的大小 [mp4 文件格式 ]获取 mp4 文件信息 8 - Random access wqyuwss 发表于 2007-5-1 5:04:00 Seeking 主要是利用 sample table box 里面包含的子 box 来实现的,还需要考虑 edit list 的影响。 可以按照以下步骤 seek 某一个 track 到某个时间 T,注意这个 T是以 movie header box 里定义 的 time scale 为单位的: 1. 如果 track 有一个 edit list,遍历所有的 edit,找到 T落在哪个 edit 里面。将 Edit 的开始时 间变换为以 movie time scale 为单位,得到 EST,T减去 EST,得到 T',就是在这个 edit 里面的 duration,注意此时 T'是以 movie 的time scale 为单位的。然后将 T'转化成 track 媒体的 time scale,得到 T''。T''与Edit 的开始时间相加得到以 track 媒体的 time scale 为 单位的时间点 T'''。 2. 这个 track 的time-to-sample 表说明了该 track 中每个 sample 对应的时间信息,利用这个 表就可以得到 T'''对应的 sample NT。 3. sample NT可能不是一个 random access point,这样就需要其他表的帮助来找到最近 的 random access point。一个表是 sync sample 表,定义哪些 sample 是random access point。使用这个表就可以找到指定时间点最近的 sync sample。如果没有这个表,就说明 所有的 sample 都是 synchronization points,问题就变得更容易了。另一个 shadow sync box 可以帮助内容作者定义一些特殊的 samples,它们不用在网络中传输,但是可以作为 额外的 random access point。这就改进了 random access,同时不会影响正常的传输比特 率。这个表指出了非 random access point 和random access point 之间的关系。如果要寻 找指定 sample 之前最近的 shadow sync sample,就需要查询这个表。总之,利用 sync sample 和shadow sync 表,就可以 seek 到NT之前的最近的 access point sample Nap。 4. 找到用于 access point 的sample Nap 之后,利用 sample-to-chunk 表来确定 sample 位于 哪个 chunk 内。 5. 找到 chunk 后,使用 chunk offset 找到这个 chunk 的开始位置。 6. 使用 sample-to-chunk 表和 sample size 表中的数据,找到 Nap 在此 chunk 内的位置,再加 上此 chunk 的开始位置,就找到了 Nap 在文件中的位置。
还剩39页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

li_weijun

贡献于2012-07-31

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf