admin管理员组

文章数量:829155

为什么录像都是用.avi而不是.mp4?

一. MP4格式介绍
    
    .html
    
    ● MP4文件由许多个Box组成(如:ftyp、moov、mdat等),实际上box分为box和fullbox两种。;
    ● 每个Box由Header和Data两部分组成
    ● FullBox则是Box的扩展,Box结构的基础上在Header中增加8bit位 version标志和24bit位的flags标志
    ● Header包含了整个Box的长度的大小(Size)和类型(Type),当size等于0时,代表这个Box是文件的最后一个Box;   当size等于0时说明Box长度需要更多的bits位来描述,在后面会定义一个64bits位的largesize用来描述Box的长度;当Type为uuid时,说明这个Box中的数据是用户自定义扩展类型;
    ● Data为Box的实际数据,可以是纯数据也可以是更多的子Box;
    ● 当一个Box中Data是一系列的子Box时,这个Box又可以称作为Container Box。

其中:
    ftyp:有且只有1个,在文件层,而不能被其他box包含。该box应该被放在文件的最开始,指示该 MP4 文件应用的相关信息。
    moov:包含了文件媒体的metadata信息,“moov”是一个container box,具体内容信息由子 box 诠释。
    mdat:实际媒体数据,我们最终解码播放的音视频数据都在这里面。

注意:         
    ● moov与mdat的存放位置前后并没有进行强制要求,所以moov可放在mdat前面,也可以后面。
       在互联网的视频点播中,如果希望MP4文件边下边播,则需要moov存放在mdat的前面,如果放在后面,需要将MP4文件下载完成后才可以进行播放。
    ● ffmpeg默认将mp4的moov放在mdat后面,如果最后没有调av_write_trailer, MP4文件将无法播放。
    ● 一个连续的H264裸流,只需要提供一次SPS,PPS即可(moov会记录SPS, PPS所携带的信息)
    
    
二. AVI格式介绍
    略。。。

 

三. 为什么录像都是用.avi而不是.mp4?
    如果还在往封装里写数据, 突然断电,由于没调用av_write_trailer
    MP4直接丢失moov,导致损坏的时候无法解析。
    而AVI不同,照样可以播放, 因为AVI的每个gop的IDR帧前都有SPS和PPS, 每一个gop都可以独立解析,不依赖其他gop的帧
    
    对于海思裸流输入:  SPS, PPS, SEI, I, P, P, ... P, P,  SPS, PPS, SEI, I, P, P, ... P, P
    AVI封装数据流:        SPS, PPS, SEI, I, P, P, ... P, P,  SPS, PPS, SEI, I, P, P, ... P, P
    MP4封装数据流:        SPS, PPS, SEI, I, P, P, ... P, P, I, P, P, ..., P, P, P, I, P, P, P

本文标签: 为什么录像都是用avi而不是mp4