admin 管理员组

文章数量: 1087139


2024年1月10日发(作者:oracle调用存储过程语法)

MP4文件格式

综述关键概念MP4文件格式中,所有的内容存在一个称为movie的容器中。一个movie可以由多个tracks组成。每个track就是一个随时间变化的媒体序列,例如,视频帧序列。track里的每个时间单位是一个sample,它可以是一帧视频,或者音频。sample按照时间顺序排列。注意,一帧音频可以分解成多个音频sample,所以音频一般用sample作为单位,而不用帧。MP4文件格式的定义里面,用sample这个单词表示一个时间帧或者数据单元。每个track会有一个或者多个sampledescriptions。track里面的每个sample通过引用关联到一个sampledescription。这个sampledescriptions定义了怎样解码这个sample,例如使用的压缩算法。与其他的多媒体文件格式不同的是,MP4文件格式经常使用几个不同的概念,理解其不同是理解这个文件格式的关键。这个文件的物理格式没有限定媒体本身的格式。例如,许多文件格式将媒体数据分成帧,头部或者其他数据紧紧跟随每一帧视频,!!!TODO(例如MPEG2)。而MP4文件格式不是如此。文件的物理格式和媒体数据的排列都不受媒体的时间顺序的限制。视频帧不需要在文件按时间顺序排列。这就意味着如果文件中真的存在这样的一些帧,那么就有一些文件结构来描述媒体的排列和对应的时间信息。MP4文件中所有的数据都封装在一些box中(以前叫atom)。所有的metadata(媒体描述元数据),包括定义媒体的排列和时间信息的数据都包含在这样的一些结构box中。MP4文件格式定义了这些这些box的格式。Metadata对媒体数据(例如,视频帧)引用说明。媒体数据可以包含在同一个的一个或多个box里,也可以在其他文件中,metadata允许使用URLs来引用其他的文件,而媒体数据在这些引用文件中的排列关系全部在第一个主文件中的metadata描述。其他的文件不一定是MP4文件格式,例如,可能就没有一个box。k有很多种类的track,其中有三个最重要,videotrack包含了视频sample;audiotractrack包含了audiosample;hinttrack稍有不同,它描述了一个流媒体服务器如何把文件中的媒体数据组成符合流媒体协议的数据包。如果文件只是本地播放,可以忽略hinttrack,他们只与流媒体有关系。媒体文件的物理结构Box定义了如何在sampletable中找到媒体数据的排列。这包括datareference(数据引用),thesamplesizetable,thesampletochunktable,andthechunkoffsettable.这些表就可以找到track中每个sample在文件中的位置和大小。datareference允许在第二个媒体文件中找到媒体的位置。这样,一部电影就可以由一个媒体数据库中的多个不同文件组成,而且不用把它们全部拷贝到另一个新文件中。例如,对视频编辑就很有帮助。为了节约空间,这些表都很紧凑。另外,interleave不是samplebysample,而是把单个track的几个samples组合到一起,然后另外几个sample又进行新的组合,等等。一个track的连续几个sample组成的单元就被称为chunk。每个chunk在文件中有一个偏移量,这个偏移量是从文件开头算起的,在这个chunk内,sample是连续存储的。

这样,如果一个chunk包含两个sample,第二个sample的位置就是chunk的偏移量加上第一个sample的大小。chunkoffsettable说明了每个chunk的偏移量,sampletochunktable说明了sample序号和chunk序号的映射关系。注意chunk之间可能会有死区,没有任何媒体数据引用到这部分区域,但是chunk内部不会有这样的死区。这样,如果在节目编辑的时候,不需要一些媒体数据,就可以简单的留在那里,而不用引用,这样就不用删除它们了。类似的,如果媒体存放在第二个文件中,但是格式不同于MP4文件格式,这个陌生文件的头部或者其他文件格式都可以简单忽略掉。Temporalstructureofthemedia文件中的时间可以理解为一些结构。电影以及每个track都有一个timescale。它定义了一个时间轴来说明每秒钟有多少个ticks。合理的选择这个数目,就可以实现准确的计时。一般来说,对于audiotrack,就是audio的samplingrate。对于videotrack,情况稍微复杂,需要合理选择。例如,如果一个mediaTimeScale是30000,mediasampledurations是1001,就准确的定义了NTSCvideo的时间格式(虽然不准确,但一般就是29.97),的时间结构受一个editlist影响,有两个用途:全部电影中的一个track的一部分时间片断变化(有可能是重用);空白时间的插入,也就是空的edits。特别注意的是如果一个track不是从节目开头部分开始,editlist的第一个edit就一定是空的edit。每个track的全部duration定义在文件头部,这就是对track的总结,每个sample有一个规定的duration。一个sample的准确描述时间,也就是他的时间戳(time-stamp)就是以前的sample的duration之和。Interleave文件的时间和物理结构可以是对齐的,这表明媒体数据在容器中的物理顺序就是时间顺序。另外,如果多个track的媒体数据包含在同一个文件中,这个媒体数据可以是interleaved。一般来说,为了方便读取一个track的媒体数据,同时保证每个表紧凑,以一个合适的时间间隔(例如1秒)做一次interleave,而不是samplebysample。这样就可以减少chunk的数据,减小chunkoffsettable的大小。Composition如果多个audiotrack包含在同一个文件中,他们有可能被混合在一起进行播放,并且由一个总trackvolume和左/右balance控制。类似的,videotrack也可以根据各自的层次序列号(从后向前)和合成模式进行混合。另外,每个track可以用一个matrix进行变换,也可以全部电影用一个matrix进行变换。这样既可以进行简单操作(例如放大图像,校正90º旋转),也可以做更复杂的操作(例如shearing,arbitraryrotation)。这个混合方法只是非常简单,是一个缺省的方法,MPEG4的另一份文档会定义更强有力的方法(例如MPEG-4BIFS)。

mp4文件例子DarwinStreamingServer里面有一些很好的工具,可以帮助分析mp4文件格式。但是如果可以自己逐字节的parse文件,可以更好的了解mp4文件格式。这里我就逐字节的分析文件结构。文件例子是DSS里面包含的sample_4MovieAtom-MOOVMovieatom定义了一部电影的数据信息。它的类型是'moov',是一个容器atom,至少必须包含三种atom中的一种—movieheaderatom('mvhd'),compressedmovieatom('cmov')和referencemovieatom('rmra')。没有压缩的movieheaderatom必须至少包含movieheaderatom和referencemovieatom中的一种。也可以包含其他的atom,例如一个clippingatom('clip'),一个或几个trackatoms('trak'),一个colortableatom('ctab'),和一个userdataatom('udta')。其中movieheaderatom定义了整部电影的timescale,duration信息以及displaycharacteristics。trackatom定义了电影中一个track的信息。Track就是电影中可以独立操作的媒体单位,例如一个声道就是一个track。Compressedmovieatoms和referencemovieatoms不太使用,不在本文讨论范围内。本文主要讨论uncompressedmovieatoms。字段尺寸类型长度(字节)44描述这个movieheaderatom的字节数moov以下是实际的sample_4的部分字节,可以看到结果是

主要包含四个子atom,movieheaderatom(mvhd),一个audiotrackatom(trak),一个videotrackatom(trak)。MovieHeaderAtoms-MVHDMovieheaderatom定义了整个movie的特性,例如timescale和duration,它的atom类型是'mvhd'。

字段尺寸类型版本标志生成时间修订时间Timescale长度(字节)4413444描述这个movieheaderatom的字节数Mvhd这个movieheaderatom的版本扩展的movieheader标志,这里为0Movieatom的起始时间。基准时间是1904-1-10:00AMMovieatom的修订时间。基准时间是1904-1-10:00AMAtimevaluethatindicatesthetimescaleforthismovie—thatis,oordinatesystemthatmeasurestimeinsixtiethsofasecond,forexample,

atthispropertyisderivedfromthemovie’ueofthisfieldcorrespondstothedurationofthelongesttrackinthemovie.播放此movie的速度。1.0为正常播放速度播放此movie的音量。1.0为最大音量这里为0该矩阵定义了此movie中两个坐标空间的映射关系开始预览此movie的时间以movie的timescale为单位,预览的ationofthecurrentselectioninmovietimescaleunits.当前时间下一个待添加track的ID值。0不是一个有效的ID值。播放速度播放音量保留矩阵结构预览时间预览durationPostertimeSelectiontimeSelectionduration当前时间下一个trackID421TrackAtoms-TRAK一个Trackatom定义了movie中的一个track。一部movie可以包含一个或多个tracks,它们之间相互独立,各自有各自的时间和空间信息。每个trackatom都有与之关联的mediaatom。Track主要用于以下目的:对于流媒体协议的打包信息(hinttracks)。Hinttracks可以引用或者复制对应的媒体sampledata。Hinttracks和modifiertracks必须保证完整性,同时和至少一个mediatrack一起存在。换句话说,即使hinttracks复制了对应的媒体sampledata,mediatracks也不能从一部hintedmovie中删除。Trackatoms的atom类型是'trak'.Trackatom要求必须有一个trackheaderatom('tkhd')和一个mediaatom('mdia')。其他的trackclippingatom('clip'),trackmatteatom('matt'),editatom('edts'),trackreferenceatom('tref'),trackloadsettingsatom('load'),atrackinputmapatom('imap')以及userdataatom('udta')都是可选的。•••包含媒体数据引用和描述(mediatracks)包含modifiertracks(tweens等)

Trackatoms是一个容器atom,本身没有特别的字段,需要子atom来进一步说明有效的内容。字段长度(字节)4尺寸4类型Audiotrack的值描述这个atom的字节数EdtsVideotrack的值

每个trak都包含了一个trackheaderatomTrackHeaderAtoms-TKHD每个trak都包含了一个ckheaderatom定义了一个track的特性,例如时间,空间和音量信息,它的类型是('tkhd').

字段尺寸类型版本标志长度(字节)4413生成时间修订时间TrackID444描述这个atom的字节数tkhd这个atom的版本有效的标志是•0x0001-thetrackisenabled•0x0002-thetrackisusedinthemovie•0x0004-thetrackisusedinthemovie’spreview•0x0008-thetrackisusedinthemovie’sposterMovieatom的起始时间。基准时间是1904-1-10:00AMMovieatom的修订时间。基准时间是1904-1-10:00AM唯一标志该track的一个非零值。

保留Duration44这里为0Thedurationofthistrack(inthemovie’stimecoordinatesystem).Notethatthispropertyisderivedfromthetrack’ueofthisfieldisequaltothesumofthedurationsofallofthetrack’eisnoeditlist,thenthedurationisthesumofthesampledurations,convertedintothemovietimescale.这里为0Thetrack’ckTimwithlicemaybebasedonsuchconsiderationsasplaybackquality,language,orthecapabilitiesofthecomputer.播放此track的音量。1.0为正常音量这里为0该矩阵定义了此track中两个坐标空间的映射关系如果该track是videotrack,此值为图像的宽度如果该track是videotrack,此值为图像的高度保留LayerAlternategroup8222音量2保留36矩阵结构4宽度4高度Audiotrack的值Videotrack的值

EditAtoms-EDTSEditatoms定义了创建movie中一个track的一部分媒体。所有的edit都在一个表里面,包括每一部分的时间偏移量和长度。Editatoms的类型是'edts'。如果没有该表,则此track会被立即播放。一个空的edit用来偏移track的起始时间。如果没有editatom或editlistatom,则此track使用全部媒体。Editatoms是一个容器atom,本身没有特别的字段,需要子atom来进一步说明有效的内容。字段长度(字节)4尺寸4类型Audiotrack的值描述这个atom的字节数EdtsVideotrack的值

statom用来映射movie的时间到此trackmedia的时间。所有信息在一个editlist表中,见下图。Editlistatoms的类型是'elst'.字段尺寸类型版本标志条目数目editlist表长度(字节)44134可变描述这个atom的字节数elst这个atom的版本这里为0后面的editlist表中的条目数目每一个条目包含3项,见下图和下表字段Trackduration时间长度(字节)44速度4描述durationofthiseditsegmentinunitsofthemovie’ngtimewithinthemediaofthiseditsegment(inmediatimescaleunits)。值为-1表示是空edit。Track中的最后一个edit永远不能为空。Anydifferencebetweenthemovie’sdurationandthetrack’verateatwhichtoplaythemediacorrespondingtothiseditsegment。不能是0或负数。Audiotrack的值

Videotrack的值TrackReferenmple,ifamoviehasthreevideotracksandthreesoundtracks,eferenceatomshaveanatomtypevalueof'tref'.Trackreferencesmple,avideotrackmayreferenceatimecodetracktoindicatewhereitstimecodeisstored,mple,avideotrackcouldreferenceasoundtracktoindicatethatthetwoaremple,bothasoundandvideotrackcouldratomisnotpresent,attheadicatesnoreference.

Each:erencecanbefromeithertracktotheother,testhatthereferencedtrackshouldsenditsdatatothistrack,“TrackInputMapAtoms”(page51)ptssr32-biti32-bitintegerthatidentifiestheatomtype;DsAlistoftrackIDvalues(32-bitintegers)determinethenumberoftrackreferencesstoredinatrackreferencetypeatombysubtractingitsheadersizefromitsoverallsizeandthendividingbythesize,inbytes,ofatrackID.

MediaAtoms-MDIAMediaatoms定义了track的媒体类型和sample数据,例如音频或视频,描述sample数据的mediahandlercomponent,mediatimescaleandtrackduration以及media-and-track-specific信息,例如音量和图形模式。它也可以包含一个引用,指明媒体数据存储在另一个文件中。也可以包含一个sampletableatoms,指明sampledescription,duration,tom的类型是'mdia'。它是一个容器atom,必须包含一个mediaheaderatom('mdhd'),一个handlerreference('hdlr'),一个媒体信息引用('minf')和用户数据atom('udta').字段长度(字节)4尺寸4类型Audiotrack的值描述这个atom的字节数EdtsVideotrack的值

MediaHeaderAtoms-MDHDMediaheaderatom定义了媒体的特性,例如timescale和duration。它的类型是'mdhd'.字段尺寸类型版本标志生成时间修订时间TimescaleDuration语言质量长度(字节)4413444422描述这个atom的字节数mdhd这个atom的版本这里为0Movieatom的起始时间。基准时间是1904-1-10:00AMMovieatom的修订时间。基准时间是1904-1-10:00AMAtimevaluethatindicatesthetimescaleforthismedia—thatis,ationofthismediainunitsofitstimescale.媒体的语言码媒体的回放质量???怎样生成此质量,什么是参照点

Audiotrack的值Videotrack的值HandlerReferenceAtoms-HDLRHandlerreferenceatom定义了描述此媒体数据的mediahandlercomponent,类型是'hdlr'。在过去,handlerreferenceatom也可以用来数据引用,但是现在,已经不允许这样使用了。一个mediaatom内的handleratom解释了媒体流的播放过程。例如,一个视频handler处理一个videotrack。

字段尺寸类型版本标志ComponenttypeComponentsubtype长度(字节)441344ComponentmanufacturerComponentflagsComponentflagsmaskComponentname444可变描述这个atom的字节数hdlr这个atom的版本这里为0handler的类型。当前只有两种类型•'mhlr':mediahandlers•'dhlr':datahandlersmediahandlerordatahandler的类型。如果componenttype是mhlr,这个字段定义了数据的类型,例如,'vide'是video数据,'soun'是sound数据如果componenttype是dhlr,这个字段定义了数据引用的类型,例如,'alis'是文件的别名保留字段,缺省为0保留字段,缺省为0保留字段,缺省为0这个component的名字,也就是生成此media的mediahandler。该字段的长度可以为0Audiotrack的值

Videotrack的值MediaInformationAtoms-MINFMediainformationatoms的类型是'minf',存储了解释该track的媒体数据的handler-specific的信息。mediahandler用这些信息将媒体时间映射到媒体数据,并进行处理。它是一个容器atom,包含其他的子atom。这些信息是与媒体定义的数据类型特别对应的,而且mediainformationatoms的格式和内容也是与解释此媒体数据流的mediahandler密切相关的。其他的mediahandler不知道如何解释这些信息。字段长度(字节)描述4尺寸这个atom的字节数4minf类型Audiotrack的值Videotrack的值

VideoMediaInformationAtomsVideomediainformationatoms是视频媒体的第一层atoms,包含其他的定义视频媒体数据的特性。SoundMediaInformationAtomsSoundmediainformationatoms是音频媒体的第一层atoms,包含其他的定义音频媒体数据的特性。

VideoMediaInformationHeaderAtomsVideomediainformationheaderatoms定义颜色和图形模式信息。字段尺寸类型版本标志图形模式Opcolor长度(字节)441326描述这个atom的字节数vmhd这个atom的版本这里总是nsfermodespecifieswhichBooleanoperationQuickDrawshould16-bitvaluesthatspecifythered,green,andbluecolorsforthetransfermodeoperationindicatedinthegraphicsmodefield.[mp4文件格式]17-SoundMediaInformationHeaderAtoms-SMHDwqyuwss发表于2007-5-14:06:00Thesoundmediainformationheaderatom定义了声音媒体的控制信息,例如均衡。

字段尺寸类型版本标志均衡保留长度(字节)441322描述这个atom的字节数smhd这个atom的版本这里为0音频的均衡是用来控制计算机的两个扬声器的声音混合效果,一般是0。一般值是0。保留字段,缺省为0DataInformationAtoms-DINFhandlerreference定义datahandlercomponent如何获取媒体数据,datahandler用这些数据信息来解释媒体数据。Datainformationatoms的类型是'dinf'。它是一个容器atom,包含其他的子atom。

Audiotrack的值

Videotrack的值DataReferenceAtoms-DREFDatareferenceatoms包含列表数据,datahandlercomponent可以用这些数据获取媒体数据。字段长度(字节)描述4尺寸这个atom的字节数4dref类型1版本这个atom的版本3标志这里为04条目数目datareferences的数目Data每个datareference就像atom的格式一样,包含以下的数据成员references4尺寸这个atom的字节数4类型见下表1版本这个datareference的版本3标志目前只有一个标志:SelfreferenceThisflagindicatesthatthemedia’acintosh,andotherfilesystemswithmultiforkfiles,setag’svalueis0x0001.数据可变datareference信息FollowingTableshowsthecurrentlydefineddatareferencetypesthatmaybestoredinaheaderatom.表:Datareference类型类型描述Datareference是一个Macintoshalias。一个alias包含文件信息,例如全路径名。alisDatareference是一个Macintoshalias。Alias末尾是文件使用的资源类型(32bit整数)和ID(16bit带符号的整数)rsrc

一个C类型的字符串,表示一个URL。字符串后可以有其他的数据。urlAudiotrack的值Videotrack的值[mp4文件格式]mp4文件格式系列20-SampleAtomswqyuwss发表于2007-5-14:13:00存储媒体数据的单位是samples。一个sample是一系列按时间顺序排列的数据的一个element。Samples存储在media中的chunk内,可以有不同的durations。Chunk存储一个或者多个samples,是数据存取的基本单位,可以有不同的长度,一个chunk内的每个sample也可以有不同的长度。例如如下图,chunk2和3不同的长度,chunk2内的sample5和6的长度一样,但是sample4和5,6的长度不同。

sampletableatom描述sample的所有信息以及一些不同类型的atoms,mediahandler可以用这些信息正确的按顺序解析所有的samples,而不需要强迫这些数据按movie的时间顺序存放到实际数据流中。•如何得到chunk的数目和每个chunk包含多少个sample,每个chunk的description是如何解析stsc-Sample-to-Chunktable。这个表类似于行程编码,第一个firstchunk减去第二个firstchunk就是一共有多少个trunk包含相同的sample数目,这样通过不断的叠加,就可以得到一共有280个trunk,每个trunk包含多少个sample,以及每个trunk对应的description。•如何计算每个sample的duration•如何计算每个sample的长度解析stsz-SampleSizetable。这个表包含了每个sample的长度,找到sample的序号,就可以找到对应sample的长度了。SampleTableAtoms-STBLsampletableatom包含转化媒体时间到实际的sample的信息,他也说明了解释sample的信息,例如,视频数据是否需要解压缩,解压缩算法是什么?它的类型是'stbl',是一个容器atom,包含sampledescriptionatom,time-to-sampleatom,syncsampleatom,sample-to-chunkatom,samplesizeatom,chunkoffsetatom和tableatom包含track中mediasample的所有时间和数据索引,利用这个表,就可以定位sample到媒体时间,决定其类型,大小,以及如何在其他容器中找到紧邻的sample。如果sampletableatom所在的track没有引用任何数据,那么它就不是一个有用的mediatrack,不需要包含任何子atom。如果sampletableatom所在的track引用了数据,那么必须包含以下的子atom:sampledescription,samplesize,sampletochunk和chunkoffset。所有的子表有相同的sample数目。

sampledescriptionatom是必不可少的一个atom,而且必须包含至少一个条目,因为它包含了数据引用atom检索mediasample的目录信息。没有sampledescription,就不可能计算出mediasample存储的位置。syncsampleatom是可选的,如果没有,表明所有的samples都是syncsamples。Audiotrack的值Videotrack的值

SampleDescriptionAtoms-STSD利用sampledescriptionatom存储的信息可以正确的解码mediasample。不同的媒体类型存储不同的sampledescription,例如,视频媒体,sampledescription就是图像的结构。第四章解释了不同媒体类型对应的sampledescription信息。sampledescriptionatom的类型是'stsd',包含了一个sampledescription表。根据不同的编码方案和存储数据的文件数目,每个media可以有一个到多个sampledescription。sample-to-chunkatom通过这个索引表,找到合适medai中每个sample的description。字段长度(字节)描述4尺寸这个atom的字节数4stsd类型1版本这个atom的版本3标志这里为04条目数目sampledescriptions的数目Sample不同的媒体类型有不同的sampledescription,但是每个sampledescriptiondescription的前四个字段是相同的,包含以下的数据成员4尺寸这个sampledescription的字节数4数据格式存储数据的格式。6保留2数据引用利用这个索引可以检索与当前sampledescription关联的数据。数据引索引用存储在datareferenceatoms。Audiotrack的值

可以看出这个sample只有一个description,对应得的数据格式是'mp4a',14496-12定义了这种结构,mp4解码器会识别此description。XXXVideotrack的值可以看出这个sample只有一个description,对应得的数据格式是'mp4v',14496-12定义了这种结构,mp4解码器会识别此description。XXXTime-to-SampleAtoms-STTSTime-to-sampleatoms存储了mediasample的duration信息,提供了时间对具体datasample的映射方法,通过这个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,editlistatom设定初始的DT值。DT计算公式如下DT(i)=SUM(forj=0toi-1ofdelta(j))所有偏移量的和就是track中media的长度,这个长度不包括media的timescale,也不包括任何editlist。

字段长度(字节)描述4尺寸这个atom的字节数4stts类型1版本这个atom的版本3标志这里为04条目数目time-to-sample的数目time-to-Media中每个sample的duration。包含如下结构sampleSample4有相同duration的连续sample的数目countSample4每个sample的durationduration如果多个sample有相同的duration,可以只用一项描述所有这些samples,数量字段说明sample的个数。例如,如果一个视频媒体的帧率保持不变,整个表可以只有一项,数量就是全部的帧数。Audiotrack的值可以看出这个mp4a类型的音频track只有一项time-to-sample,一共有547个sample,每个sample的duration是1024。Videotrack的值

可以看出这个mp4v类型的videotrack只有一项time-to-sample,一共有1050个sample,每个sample的duration是40。SyncSampleAtoms-STSSsyncsampleatom确定media中的关键帧。对于压缩的媒体,关键帧是一系列压缩序列的开始帧,它的解压缩是不依赖于以前的帧。后续帧的解压缩依赖于这个关键帧。syncsampleatom可以非常紧凑的标记媒体内的随机存取点。它包含一个sample序号表,表内的每一项严格按照sample的序号排列,说明了媒体中的哪一个sample是关键帧。如果此表不存在,说明每一个sample都是一个关键帧,是一个随机存取点。Syncsampleatoms的类型是'stss'。字段长度(字节)4尺寸4类型1版本3标志4条目数目syncsample4Sample序号Videotrack的值描述这个atom的字节数stss这个atom的版本这里为0syncsample的数目syncsample表的结构是关键帧的sample序号

可以看出这个video片断共有35个关键帧。Sample-to-ChunkAtoms-STSC当添加samples到media时,用chunks组织这些sample,这样可以方便优化数据获取。一个trunk包含一个或多个sample,chunk的长度可以不同,chunk内的sample的长度也可以不同。sample-to-chunkatom存储sample与chunk的映射关系。Sample-to-chunkatoms的类型是'stsc'。它也有一个表来映射sample和trunk之间的关系,查看这张表,就可以找到包含指定sample的trunk,从而找到这个sample。字段长度(字节)4尺寸4类型1版本3标志4条目数目sample-to-chunkFirstchunk4Samples4perchunkSample4descriptionIDAudiotrack的值描述这个atom的字节数stsc这个atom的版本这里为0sample-to-chunk的数目sample-to-chunk表的结构这个table使用的第一个chunk序号当前trunk内的sample数目与这些sample关联的sampledescription的序号

可以建立这个sample-to-chunk表,共有33项。Videotrack的值可以建立这个sample-to-chunk表,共有140项。Firstchunk14589Samplesperchunk43434SampledescriptionID11111

4203214可以建立Videotrack的sample-to-chunk表,共有140项。111111FirstchunkSamplesperchunkSampledescriptionID312141………2774128031这个表类似于行程编码,第一个firstchunk减去第二个firstchunk就是一共有多少个trunk包含相同的sample数目,这样通过不断的叠加,就可以得到一共有280个trunk,每个trunk包含多少个sample,以及每个trunk对应的description。SampleSizeAtoms-STSZsamplesizeatoms定义了每个sample的大小,它的类型是'stsz',包含了媒体中全部sample的数目和一张给出每个sample大小的表。这样,媒体数据自身就可以没有边框的限制。字段尺寸长度(字节)4描述这个atom的字节数

类型版本标志Samplesize条目数目samplesize413444大小Audiotrack的值stsz这个atom的版本这里为0全部sample的数目。如果所有的sample有相同的长度,这个字段就是这个值。否则,这个字段的值就是0。那些长度存在samplesize表中samplesize的数目samplesize表的结构。这个表根据samplenumber索引,第一项就是第一个sample,第二项就是第二个sample每个sample的大小这个表是最大的一个表,可以看到这个audiotrack的sample的长度都不一样,一共有547项。Videotrack的值这个表包含了每个sample的长度,找到sample的序号,就可以找到对应sample的长度了。可以看到videotrack共有1050个sample。

ChunkOffsetAtoms-STCOChunkoffsetatoms定义了每个trunk在媒体流中的位置,它的类型是'stco'。位置有两种可能,32位的和64位的,后者对非常大的电影很有用。在一个表中只会有一种可能,这个位置是在整个文件中的,而不是在任何atom中的,这样做就可以直接在文件中找到媒体数据,而不用解释atom。需要注意的是一旦前面的atom有了任何改变,这张表都要重新建立,因为位置信息已经改变了。字段尺寸类型版本标志条目数目chunkoffset长度(字节)441344大小Audiotrack的值描述这个atom的字节数stco这个atom的版本这里为0chunkoffset的数目字节偏移量从文件开始到当前chunk。这个表根据chunknumber索引,第一项就是第一个trunk,第二项就是第二个trunk每个sample的大小Videotrack的值

[mp4文件格式]获取mp4文件信息1-计算电影长度wqyuwss发表于2007-5-14:42:00方法1从mvhd-movieheaderatom中找到timescale和duration,duration除以timescale即是整部电影的长度。timescale相当于定义了标准的1秒在这部电影里面的刻度是多少。例如audiotrack的timescale=8000,duration=560128,所以总长度是70.016,videotrack的timescale=600,duration=42000,所以总长度是70方法2首先计算出共有多少个帧,也就是sample(从samplesizeatoms中得到),然后整部电影的duration=每个帧的duration之和(从Time-to-sampleatoms中得出)例如audiotrack共有547个sample,每个sample的长度是1024,则总duration是560128,电影长度是70.016;videotrack共有1050个sample,每个sample的长度是40,则总duration是42000,电影长度是70[mp4文件格式]获取mp4文件信息2-计算电影图像宽度和高度wqyuwss发表于2007-5-14:44:00从tkhd–trackheaderatom中找到宽度和高度即是。[mp4文件格式]获取mp4文件信息3-计算电影声音采样频率wqyuwss发表于2007-5-14:44:00从tkhd–trackheaderatom中找出audiotrack的timescale即是声音的采样频率。[mp4文件格式]获取mp4文件信息4-计算视频帧率wqyuwss发表于2007-5-14:45:00首先计算出整部电影的duration,和帧的数目然后帧率=整部电影的duration/帧的数目

[mp4文件格式]获取mp4文件信息5-计算电影的比特率wqyuwss发表于2007-5-14:46:00整部电影的尺寸除以长度,即是比特率,此电影的比特率为846623/70=12094bps[mp4文件格式]获取mp4文件信息6-查找samplewqyuwss发表于2007-5-14:47:00当播放一部电影或者一个track的时候,对应的mediahandler必须能够正确的解析数据流,对一定的时间获取对应的媒体数据。如果是视频媒体,mediahandler可能会解析多个atom,才能找到给定时间的sample的大小和位置。具体步骤如下:1.确定时间,相对于媒体时间坐标系统2.检查time-to-sampleatom来确定给定时间的sample序号。3.检查sample-to-chunkatom来发现对应该sample的chunk。4.从chunkoffsetatom中提取该trunk的偏移量。5.利用samplesizeatom找到sample在trunk内的偏移量和sample的大小。例如,如果要找第1秒的视频数据,过程如下:1.第1秒的视频数据相对于此电影的时间为6002.检查time-to-sampleatom,得出每个sample的duration是40,从而得出需要寻找第600/40=15+1=16个sample3.检查sample-to-chunkatom,得到该sample属于第5个chunk的第一个sample,该chunk共有4个sample4.检查chunkoffsetatom找到第5个trunk的偏移量是204725.由于第16个sample是第5个trunk的第一个sample,所以不用检查samplesizeatom,trunk的偏移量即是该sample的偏移量20472。如果是这个trunk的第二个sample,则从samplesizeatom中找到该trunk的前一个sample的大小,然后加上偏移量即可得到实际位置。6.得到位置后,即可取出相应数据进行解码,播放[mp4文件格式]获取mp4文件信息7-查找关键帧wqyuwss发表于2007-5-14:48:00查找过程与查找sample的过程非常类似,只是需要利用syncsampleatom来确定keyframe的sample序号1.确定给定时间的sample序号2.检查syncsampleatom来发现这个sample序号之后的keyframe3.检查sample-to-chunkatom来发现对应该sample的chunk4.从chunkoffsetatom中提取该trunk的偏移量5.利用samplesizeatom找到sample在trunk内的偏移量和sample的大小[mp4文件格式]获取mp4文件信息8-Randomaccesswqyuwss发表于2007-5-15:04:00Seeking主要是利用sampletablebox里面包含的子box来实现的,还需要考虑editlist的影响。可以按照以下步骤seek某一个track到某个时间T,注意这个T是以movieheaderbox里定义的timescale为单位的:1.如果track有一个editlist,遍历所有的edit,找到T落在哪个edit里面。将Edit的开始时间变换为以movietimescale为单位,得到EST,T减去EST,得到T',就是在这个edit里面的duration,注意此时T'是以movie的timescale为单位的。然后将T'转化成track

2.3.4.5.6.媒体的timescale,得到T''。T''与Edit的开始时间相加得到以track媒体的timescale为单位的时间点T'''。这个track的time-to-sample表说明了该track中每个sample对应的时间信息,利用这个表就可以得到T'''对应的sampleNT。sampleNT可能不是一个randomaccesspoint,这样就需要其他表的帮助来找到最近的randomaccesspoint。一个表是syncsample表,定义哪些sample是randomaccesspoint。使用这个表就可以找到指定时间点最近的syncsample。如果没有这个表,就说明所有的sample都是synchronizationpoints,问题就变得更容易了。另一个shadowsyncbox可以帮助内容作者定义一些特殊的samples,它们不用在网络中传输,但是可以作为额外的randomaccesspoint。这就改进了randomaccess,同时不会影响正常的传输比特率。这个表指出了非randomaccesspoint和randomaccesspoint之间的关系。如果要寻找指定sample之前最近的shadowsyncsample,就需要查询这个表。总之,利用syncsample和shadowsync表,就可以seek到NT之前的最近的accesspointsampleNap。找到用于accesspoint的sampleNap之后,利用sample-to-chunk表来确定sample位于哪个chunk内。找到chunk后,使用chunkoffset找到这个chunk的开始位置。使用sample-to-chunk表和samplesize表中的数据,找到Nap在此chunk内的位置,再加上此chunk的开始位置,就找到了Nap在文件中的位置。


本文标签: 时间 媒体 数据 文件 信息