您的位置:首页 > 其它

H264文件封装MP4文件

2017-04-28 17:39 92 查看
推荐一篇优秀的博文.对于MP4的初学者很有用:http://blog.csdn.net/chenchong_219/article/details/44263691

对于这篇博文最后 Sample Table Box部分我想做一些补充,如有不足之处请大家指出.

这篇文章以h264的数据封装到MP4为例子.

“stbl”包含了关于track中sample所有时间和位置的信息,以及sample的编解码等信息。利用这个表,可以解释sample的时序、类型、大小以及在各自存储容器中的位置。“stbl”是一个container box,其子box包括:sample description box(stsd)、time
to sample box(stts)、sample size box(stsz或stz2)、sample to chunk box(stsc)、chunk offset box(stco或co64)、composition time to sample box(ctts)、sync sample box(stss)等。

1.stsd

这个box中包含的音频的采样率,声道,样本,视频的sps,pps等信息,这些信息的结构可以看官方文档ISO-14496-N
(N对应具体格式,AVC对应ISO-14496-15 )
结构如下:



这里我封装的是h264裸流数据 ,对应的是avcc的格式

 



这里面的信息对应的需要提取裸流数据里面的sps和pps,(可以查看一下NALU提取和解析方面的文章).

2.stts

这个box是以chunk为单位对应chunk占用的时间.
Sample count描述的是:当前相同占用的时间的chunk的数量.
Sample delta描述的是:当前chunk占用的时间

如果每个chunk的占用时间是一样的,那么这个box里面只要记录一行数据就够了
比如

List
No.Sample countSample delta
16123(一共6123个chunk,这里应该是一个chunk就是一个Sample)1000
(比如:Time scale为90000,一个chunk用了300个单位,那么占用的时间就是就是半秒).

3.stss

记录了关键帧的序号位置,比如h264数据里面i帧的序号位置.

4.stsc

这个box记录和chunk和stsd里面的对应关系.
First chunk:这个记录了第一个相同对应关系的chunk序号

Samples per chunk:记录了当前chunk下面帧的数量

Samples description index:记录了这一组chunk对应的stsd里面数据的序号.一般情况stsd里面只有一个数据,所以这里是一.



5.stsz

这个box简单记录了每个Sample(帧)的长度(比如我封装到mdat里面的每个帧前面都带有4个字节表示后续数据的大小),这里指的是包括这4个字节长度,数据长度+4.

6.stco

这个记录的是每个chunk在当前MP4文件中的起始偏移位置,这个偏移是从文件的开始(0x0000000)算起的.

我的mdat里面每个数据前面带4个字节记录数据的长度(这个长度不包括本身的4个字节).封装的数据是要把sps和pps都去掉的.比如我的I帧去掉sps,pps以及65前面的0x000001 ,从65开始封装.

这里推荐一个分析MP4文件的工具:MP4 Reader 非常的好用,百度下载就可以了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  h264 视频 box 存储 MP4