我们有必要了解一下MP4的基本格式信息 ,方便我们封装裸流信息; MP4中封装了视频或者音频裸流信息 ,通常以.mp4为后缀,其实它是由一个一个的“BOX”组成的,大BOX中嵌套小BOX,逐级嵌套而形成的...图中颜色加深的标识是MP4中核心的BOX信息; 这张图非常清晰的表达了MP4的BOX封装特性,我们需要掌握MP4的每个BOX是什么意思; ftyp(File Type Box) 该Box有且只有1个,...moov(Movie Box) 该box包含了文件媒体的metadata信息,“moov”是一个container box,具体内容信息由子box诠释。...moov定义了一个MP4文件中的数据信息,类型是moov,是一个容器Atom,其至少必须包含三种Atom中的一种:mvhd标签、cmov标签、rmra标签。...3.注意 学习了MP4的BOX信息,我们要知道,moov一般都在mdat之前,如果moov在mdat之后,在做边下边播的时候是无法播放的,因为moov是文件媒体的metadata信息,如果没有这个metadata
8.3 mp4info mp4info也是一个不错的mp4分析工具,而且是可视化的工具,可以将mp4文件中的各box接触出来,并将其中的数据展现出来,分析mp4内容时使用mp4info将会更方便:...dash 兼容DASH格式的mp4分片 frag_discont 分片不连续式设置discontinuous信号 delay_moov 延迟写入moov信息,直到第一个分片切出来,或者第一片被刷掉...global_sidx 在文件的开头设置公共的sidx索引 write_colr 写colr容器 write_gama 写被弃用的gama容器 moov_size 正整数 设置moov容器的最大大小...可以看到上图中moov容器是在mdat的下边,如果使用参数faststart就会在生成完上边结构之后将moov移动到mdat前面: ffmpeg –i input.flv –c copy –f mp4...–movflags faststart output.mp4然后使用mp4info查看mp4的容器顺序,可以看到moov被移动到了mdat前面。
经过视频编码后的帧数据,需要放到视频容器里,才能成为一个常规的视频文件。我们以mp4容器为例子,聊一聊代码层面上帧数据如何放到mp4容器里。...一个友好的mp4视频结构,如下图,ftyp是基本信息,moov是头部信息,mdat是帧数据。moov在mdat前面,支持流媒体边下边播。 ?...开源代码库mp4v2,作为mp4容器操作工具,是如何实现帧数据的容器打包的呢? 下面是mp4标准定义的box结构。 ? ? 在mp4v2里,用MP4Atom对象定义一个box。...至此,moov调整到了mdat前面,一个友好的mp4结构就打包完成了。 回头思考一下,既然moov需要在mdat前面,那么为什么mp4v2打包的过程,要反过来把moov写在mdat之后呢?...因为在mdat写完之前,moov的长度是不确定的。所以为了不影响往文件里写mdat,就把moov挪到了mdat后面,等mdat写完之后,再写入moov。
实战解析案例: moov 和 MP4 视频的秒开:moov Box 位置对 MP4 秒开的影响。...moov Box 可以说是 MP4 文件中最重要的 Box,一般播放器的实现都需要读取到 moov 的数据才能开始播放流程。...另外,值得注意的是 mdat Box 在一个 MP4 文件中不是必须的,可以没有。因为 MP4 是支持将媒体数据放在其他文件中,并通过 moov 中的信息来索引。...、moov 和 MP4 视频的秒开 了解了 MP4 的文件结构后,我们知道了 moov 这个 Box 包含着对视频来说非常重要的索引信息,所以一般播放器需要拿到这些信息才能完成解码器的初始化,开启播放流程...当然,我们也可以自己写一段代码,单纯地针对 MP4 文件来完成 moov 前置的操作。
1m; # mp4 moov元数据缓存的默认空间大小 mp4_max_buffer_size 10m; # mp4 moov元数据缓存的最大空间 } 通过以上配置,就可以通过 curl...start=100&end=200" 这里需要强调的是,对于一些特别大的mp4文件,可能moov元数据的大小就超过了mp4_max_buffer_size,会导致nginx报错的情况,但是如果设置太大...: 3.2 MP4文件的处理 3.2.1 MP4的处理框架 MP4的处理过程一言以蔽之,就是读取MP4文件头ftyp atom,以及moov atom,然后根据用户请求的start起始时间位置,对...moov头中的stbl的各个子 atom进行调整(包括裁减和索引调整),生成新的moov放在ngx_http_mp4_file_t结构体中,最后交由nginx文件异步发送逻辑将mp4发送给客户端。...那么对于当前是moov atom的情况下,我们可以这么来调用: ngx_http_mp4_read_atom(mp4, ngx_http_mp4_moov_atoms, atom_data_size);
一个在线检测 mp4 文件是否已经 fragmented 的工具 http://nickdesaulniers.github.io/mp4info/ 把一个 non-fragment MP4 转换成 fragment...MP4,可以使用 FFmpeg 的 -movflags 来转换。...对于原始文件为非 MP4 文件 ffmpeg -i trailer_1080p.mov -c:v copy -c:a copy -movflags frag_keyframe+empty_moov bunny_fragmented.mp4...对于原始文件已经是 MP4 文件 ffmpeg -i non_fragmented.mp4 -movflags frag_keyframe+empty_moov fragmented.mp4 修正:...ffmpeg -i non_fragmented.mp4 -strict -2 -movflags frag_keyframe+empty_moov fragmented.mp4 要强制输出文件的帧速率为
MP4是个非常通用的文件格式。直播一般用FLV的多,譬如录制成FLV。录制成MP4会比较麻烦些。SRS已经支持了MP4解析,下一步就是录制MP4,以及FMP4,还有MPEG-DASH的支持。...总结的说来,MP4是一个个的BOX,从高层看,MP4有三种组织方式: 普通MP4,General MP4,box模式为ftyp-mdat-moov。...头在后面,FFMPEG默认出的就是这种,写入比较简单。读取时需要seek;所以有些浏览器会需要完全下载后才能开始播放,有些应该可以用HTTP RANGE跳过mdat读取moov。...SRS录制MP4文件可以用这种模式。 快速MP4,Faststart MP4,box模式为ftyp-moov-mdat。头在前面,FFMEPG需要指定参数,生成MP4后,再过一遍文件才能支持。...切片MP4,Fragmented MP4,或FMP4,box模式为ftyp-moov-moof-mdat。分段模式,浏览器H5直接播放时,有些能播,有些不行。
图1 图2 2.1 MP4文件格式架构 从MP4文件的顶层来看,一般如下图3或者下图4所示,包括ftype、free、moov、mdat...其中mdat和moov box的顺序可以颠倒,而free box则不是必须的。...3.3 mdat box* mdat box包含的就是音视频数据,而要访问mdat中的音视频数据,又必须通过moov box中记录的帧的偏移和大小来,才能读取该帧在mdat中音视频帧的数据。...mdat box需要根据需求对帧数据进行裁剪,重新组织出一个裁剪后的新的mdat box。 3.4 moov box* moov box本身是一个容器,它包括其他子box。...如下图9: 图9 moov box本身很简单,需要关注的是它的子box,而且由于它的子box可能会被裁剪而改变原始的大小,所以moov box本身的大小在裁剪后也需要跟着调整。
目录 服务端 MP4 精确切片 Hacking Swimming upstream 服务端 MP4 精确切片 服务端 MP4 切片功能在于按需、无损地提供视频的小切片。...具体实现上,首先解析和重写 mp4 的头信息(moov atom),包括改变表大小,以及更新音视频包的偏移。之后将这些 mp4 片段发送到浏览器。 那么为什么需要服务端 MP4 切片功能呢?...对于一小时的 2Mbps 码率的 HD 电视节目,头信息中就有 4MB 的 moov atom。如果只想播放两小时节目的一帧,则需要先下载 8MB 的头信息。...在之后的示例中,多余的前两秒以 30,000fps 的速度播放。 Hacking 为实现这个功能,需要修改一些 STTS 和 STSS moov atom 。...Swimming upstream ATOMS 是头信息的子件,它被包裹在更大的 moov atom 里面。
虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的。 当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。...支持和视频帧绑定的内容交互。比如,直播答题在播放端的弹窗等。 6)什么是 MP4 的 moov Box?我们在封装 MP4 时通常怎么处理它?为什么?...moov Box 即 Movie Box,MP4 中存储所有媒体数据的索引信息的 Box。...moov Box 可以说是 MP4 文件中最重要的 Box,一般播放器的实现都需要读取到 moov 的数据才能开始播放流程。 对于通过网络播放 MP4 视频的场景,都建议将视频处理为 moov 前置。...因为 moov 前置后,从网络读取和播放 MP4 文件时,就可以较快获取到 moov 的数据并开始播放。 - 完 -
MP4 ---- MP4(MPEG-4 Part 14)是一种常见的多媒体容器格式(也可以理解为视频的封装格式,对应H264/H265/VP9等视频编码格式而言),对应的标准为ISO/IEC 14496.../mp4" 普通MP4 由索引文件头文件moov box和媒体数据mdat box组成,MP4基本的box为: MP4 -> ftyp box moov...: fMP4 不需要一个 moov Box 来进行 initialization,fMP4 的 moov Box 只包含了一些 track 信息。...之前理解MP4文件不支持流式播放,这种理解是错误的,MP4的格式本身是支持边下载边播放的,并不需要下载完整的MP4文件,但需要长时间缓冲MP4头部数据,而fMP4区别于MP4最大的一点,则是更好的适应流式播的需求...完整的fMP4视频可以描述为如下形式: moov + (moof + mdat) * N 其中moof box是分片(fragment)的标识, mdat box存放的是当前分片的媒体数据
MP4文件起播慢原因 我们在做录制的时候,会遇到这样的问题,有的开发者会把直播录制的mp4文件,用来做点播之用,这时候,会发现需要文件下载下来,才可以正常播放,也就我们常说的起播比较慢。...这个问题产生的原因,是因为源视频的moov(音视频数据索引)在mdat(音视频数据)之后造成的,为什么会出现这种情况呢?因为直播流,一般是最后些moov信息。 如何处理MP4文件?...可以通过转码源视频将moov移到mdat之前,以加快播放解析: ffmpeg -i in.mp4 -movflags faststart out.mp4 如何查看moov和mdat?...以大牛直播SDK的Windows RTSP|RTMP播放器(SmartPlayer)为例,页面点击“录像”按钮后,开始录像和一个文件录制完成,我们都会有录像事件回调上来,如果需要将moov移到mdat之前...,如果录制下来的文件,需要做在线点播,这块非常必要,有问题或感兴趣的开发者,可以单独跟我沟通探讨。
MP4大文件虚拟HLS分片技术,避免点播服务器的文件碎片 本文主要介绍了通过虚拟分片技术,把MP4文件,映射为HLS协议中的一个个小的TS分片文件,实现了在不实际切分MP4文件的情况下,通过HLS协议播放...MP4文件,从而避免了对MP4进行点播,尤其是大的MP4文件,需要长时间缓冲MP4头部数据的问题,同时可以解决对MP4文件进行切分,会在服务器制造出大量的文件碎片的不利情况。...对于大家经常见到和使用到的普通MP4来说,作为电影、电视文件的存储容器,是很好的,不过对于流媒体点播来说,最大的缺点就是它的媒体信息和关键帧索引都集中存放在moov box中,而导致越大的文件,moov...box越大,对播放器来说,获取不到moov box,根本无从解码,所以就导致MP4文件点播,需要缓冲很久,加载头部数据。...设计方案 根据之前分析的描述分片逻辑,就可以根据moov box中罗列的音频和视频帧索引,把整个mp4文件,根据关键帧为界限,进行虚拟分片的划分,每个分段就对应一个ts文件,并把这种对应关系写入到索引文件
视频文件转MP4 在互联网中常见的格式中,跨平台最好的,应该是MP4文件,因为MP4文件既可以在PC平台的Flashplayer中播放,又可以在移动平台的Android,IOS等平台中进行播放...,而且是默认播放,那么就可以理解为MP4为最常见的多媒体文件格式,所以重点介绍MP4封装,说到MP4封装,下面简单介绍一下MP4封装的基本格式. 3.1.1 MP4格式标准介绍 MP4格式标准为ISO...文件中显示的排版方式与上面表格描述基本无差别,当然,因为MP4的标准中描述的moov与mdat的存放位置前后并没有进行强制要求,所以有些时候moov这个Container在mdat的后面,有些时候moov...被存放在mdat的前面,在互联网的视频点播中,如果希望MP4文件被快速的打开时,则需要moov Container存放在mdat的前面,如果放在后面,需要将MP4文件下载完成后才可以进行播放。...解析mp4多媒体文件时,需要一些关键的信息,下面介绍一下主要的信息; 1. moov 容器,前面表格中已经介绍过,这个容器是定义了一个mp4文件中的数据信息,类型是moov,是一个容器atom,至少必须包含三种
将编码后的音视频数据”打包“封装成不同的封装格式。这里就是我们通常所看到的.ts/.mp4/.flv/.mkv等视频文件。这些文件里封装着M路编码的视频流和N路编码的音频流。...我们对生产环境及直播链路进行梳理后发现,视频的数据封装格式基本只有MP4/FLV/TS三种。而此三种封装格式里,除MP4封装稍复杂外,FLV/TS的封装相对容易分析处理。..., src.MOOV.MVHD.Flags) copy(dst.MOOV.MVHD.Reserved, src.MOOV.MVHD.Reserved) copy(dst.MOOV.MVHD.Matrix..., src.MOOV.MVHD.Matrix) copy(dst.MOOV.MVHD.PreDefined, src.MOOV.MVHD.PreDefined) for i :=...首先,就是适配的视频封装格式单一的问题。因为我们的数据源比较单一,基本是MP4封装格式,所以在初期,切割程序只需要解析MP4封装格式相关定义字段即可。
box类型有很多,下面是3个比较重要的顶层box: ftyp:File Type Box,描述文件遵从的MP4规范与版本; moov:Movie Box,媒体的metadata信息,有且仅有一个。...moov(Movie Box) Movie Box,存储 mp4 的 metadata,一般位于mp4文件的开头。...chunk_offset 指的是在文件本身中的 offset,而不是某个box内部的偏移。 在构建mp4文件的时候,需要特别注意 moov 所处的位置,它对于chunk_offset 的值是有影响的。...有一些MP4文件的 moov 在文件末尾,为了优化首帧速度,需要将 moov 移到文件前面,此时,需要对 chunk_offset 进行改写。...fMP4 时长、内容通常不固定,可以边生成边播放; 普通mp4完整的metadata都在moov里,需要加载完moov box后,才能对mdat中的媒体数据进行解码渲染; fMP4中,媒体数据的metadata
在之前文章中已经介绍过了 MP4 标准的来源以及它的格式定义,基本上就是由一个个 Box 组成的,大致的结构如下: ftyp moov mvhd trak tkhd...认识 MP4 视频(下) 接下来我们就要去手动解析 MP4 文件,注意这可不是用 FFmpeg 来解封装,而是从 MP4 文件中一个一个字节读取信息并解析它的含义获得想要的内容。...平常一看到后缀是 .mp4 的文件,脑海里一想到的就是视频,但其实不管后缀如何,它也还是一个二进制文件,可以按照二进制的方式进行读取和写入。...类型,另外也还有 moov 和 tkhd 这些 Box 类型。...以上只是个简单例子,说明完全可以去手动解析 MP4 文件获取它的格式信息。
Box,描述文件遵从的MP4规范与版本; moov:Movie Box,媒体的metadata信息,有且仅有一个。...moov(Movie Box) Movie Box,存储 mp4 的 metadata,一般位于mp4文件的开头。...chunk_offset 指的是在文件本身中的 offset,而不是某个box内部的偏移。 在构建mp4文件的时候,需要特别注意 moov 所处的位置,它对于chunk_offset 的值是有影响的。...有一些MP4文件的 moov 在文件末尾,为了优化首帧速度,需要将 moov 移到文件前面,此时,需要对 chunk_offset 进行改写。...fMP4 时长、内容通常不固定,可以边生成边播放; 普通mp4完整的metadata都在moov里,需要加载完moov box后,才能对mdat中的媒体数据进行解码渲染; fMP4中,媒体数据的metadata
这个索引告诉我们所有媒体数据位于文件的哪里,对于progressive MP4,索引位于Moov,对于fragmented MP4,索引位于Mfra或Sidx。它们一般位于文件的开头或者结尾。...对于分散的资源,ftyp可以用来查询轨迹,moov可以获取轨迹的元数据,sidx或mfra可以读取索引,moof和mdat可以获取分块的元数据和内容。...它像是实时打包器和远程资源的中间人。值得注意的是一个dref MP4文件非常小,如果你看一个几个G的电影,dref MP4可能只有几十M。...最后介绍了三个应用场景:碎片化的MP4即时转换为渐进式的MP4;即时内容合并;定时元数据的即时交织。...这个MP4不包含媒体数据,只是使用MP4的 "dref "框引用源内容。这个'dref MP4'确实包含的是原始轨道的索引信息(样本表),存储在'moov'框中。
这个Box又可以成为 Container Box MP4中Box的组成 (书 P61-63) 主要信息: Note:尺寸、类型、版本、标志 这四个字段都有 (1)moov:一级 音视频数据的metadata...信息 mdat :一级 media数据容器 moov与mdat的存放位置没有强制要求; 互联网视频点播中,moov在前时,文件可以被快速打开; moov在后时,需要将MP4文件下载完成后才可以进行播放...(2)moov容器 moov容器定义了一个MP4文件中的数据信息,类型是moov,是一个容器Atom,其至少必须包含以下三种Atom中的一种: mvhd标签,Movie Header Atom,存放未压缩过的影片信息的头容器...中的Muxer (参数 书P80) 1.faststart参数 正常情况下ffmpeg生成moov是在mdat写完成之后再写入,可以通过faststart将moov容器移动值mdat的前面(如前文所说,...moov在前面,视频可以边下边播) ffmpeg -i input.flv -c copy -f mp4 -movflags faststart output.mp4 2.dash参数 知识点:DASH
领取专属 10元无门槛券
手把手带您无忧上云