最近在研究基于移动端平台上使用视频作动画载体的方案,目前移动端平台使用动画的方案有:gif图、apng、webp、lottie、svga等,各有各的优点,也有相应的劣势,而使用视频作动画的目的,寻求的是完美还原设计师的设计特效外,同时性能达到极致。html
在这个过程当中,也积累了一些视频相关的知识,借此同你们分享下。web
谈到视频,咱们常常会听到视频编解码、H.264
等诸如此类的内容。那么视频编解码是什么意思呢?算法
视频编解码,其实就是对视频数据进行压缩和解压缩的过程,而在讨论到编解码时,又常常同H.264
联系到一块儿,那么H.264
又是什么?windows
H.264
是一种视频压缩标准,简称AVG
,一种被普遍使用的高精度视频的录制、压缩和发布格式。该标准引入了一系列新的可以大大提升压缩性能的技术,并可以同时在高码率端和低码率端大大超越之前的诸标准,能够说是一种压缩算法,但又不只仅止步于此。markdown
H.264
是H.26X
系列中的一种,目前最新是H.265
,简称HEVC
,在一样的画面质量下,后者的压缩率是前者两倍(比特率减小50%),是将来发展趋势,iOS上的Video ToolBox
目前可支持H.265
的编解码。网络
视频编码还有其余的标准,好比AMV
、AVS
等等,但主流基本是H.26X
系列。ide
H.264
是视频的原始码流,分为两层,分别是视频编码层(VCL)和网络提取层(NAL),前者是H.264
编码/压缩的核心,主要负责将视频数据编码/压缩,再切分,后者负责格式化VCL数据并提供头信息,以保证数据适合各类信道和存储介质的传输,基本单位是NALU
。svg
经过上图能够看到,一个视频帧包含了一个或多个NALU
,开头通常是SPS
和PPS
,这两个主要是用于初始化解码器所须要的参数信息,也是解码的关键,接下去就是I/P/B帧等NALU数据,而NALU
细分下去还有切片、宏等单位,这里因为篇幅缘由就不在展开述论。工具
在视频的编解码中,常常会讨论到几个很关键的名词,如I
帧、P
帧、B
帧等。接下来从编码和解码角度来理解它们。oop
从编码角度上来讲:
I
帧:帧内编码帧, I帧一般是每一个GOP
(MPEG所使用的一种视频压缩技术)的第一个帧,通过适度地压缩,做为随机访问的参考点,能够当成静态图像,I
帧压缩掉视频的空间冗余信息;P
帧:前向预测编码帧,经过将图像序列中前面已编码帧的时间冗余信息充分去除来压缩传输数据量的编码图像;B
帧:双向预测内插编码帧,既考虑源图像序列前面的已编码帧,又顾及源图像序列后面的已编码帧之间的时间冗余信息,来压缩传输数据量的编码图像。从解码角度上来讲:
I
帧自身能够经过视频解压算法解压成一张单独的完整视频画面,因此I
帧去掉的是视频帧在空间维度上的冗余信息;P
帧须要参考其前面的一个I
帧或者P
帧来解码成一张完整的视频画面;B
帧则须要参考其前一个I
帧或者P
帧及其后面的一个P帧来生成一张完整的视频画面,因此P
帧与B
帧去掉的是视频帧在时间维度上的冗余信息。除次以外,还有PTS
、DTS
、GOP
。
PTS
是用来描述视频解码阶段的帧输出顺序,DTS
用来描述视频解码阶段的帧解码顺序,在无B
帧的状况下,PTS
等于DTS
,在有B
帧的状况下,输出顺序须要参考PTS
。
而GOP
,描述的是两个I
帧之间造成的一组图片。
MP4
是咱们常见的视频资源,但MP4的本质又是什么呢?和H.264
有什么不可告人的秘密呢?
MP4也叫MPEG-4,是一种多媒体容器格式,后缀是.mp4,其容器格式借鉴了Apple
的QuickTime
的组织方式,即以一系列BOX
为基本单位。
MP4文件由若干个box
组成,box
的示意图如上图所示:
box
由header
和body
组成,header
指明了box
的size
和type
;size
包含了box
的header
和body
整个大小;若是size
为1,表示box
的长度须要用更多的bits位来描述,能够经过一个64bits位的largesize来描述box
的长度,若是size
为0,表示该box
为文件的最后一个box
;type
,一般使用4个ASCII码的字符如"ftyp"、"moov"等表示,这些box type
是已经预约义好的,表示固定的含义,若是是"uuid",表示该box
为用户自定义拓展的类型,若是box type
是未定义的,应将其忽略;box
中能够包含box
,这种box
叫作container box
;box
分为两种,Box
和Fullbox
,FullBox
是Box
的拓展,header
中增长了8位的version
和24位的flags
字段。mp4box.js
:一个在线解析mp4的工具。bento4
:包含mp4dump、mp4edit、mp4encrypt等工具。MP4Box
:相似于bento4,包含很全面的工具。mp4info.exe
: windows平台图形界面展现mp4基本信息的工具。咱们使用mp4box.js
,能够看到MP4文件由许多box组成,每一个box包含不一样的信息,以树形的方式组织,主要的box以下:
经过上表,咱们能够看到有4个树节点:
ftyp
简单的说就是为了标识它的developer是谁,兼容哪些标准等,如“mp42”表示它的major brand是MP4 v2,而“mp42”和“mp41”则表示它的compatible brands是MP4 v2和MP4 v1。
包含了文件媒体的metadata信息,是一个container box,通常在ftyp后面。moov
包含1个mvhd和若干个trak,其中mvhd是header box,做为第一个子box出现,trak包含一个trakc的相关信息,是一个container box。
mvhd
(Movie Header Box),主要存放着视频文件的meta data,其中的time scale和 duration对文件的播放有着重要做用
Media Boxyeshi
也是一个container box,其定义了track媒体类型以及smaple数据,描述sample的信息。 mdia包含:
mdhd
和tkhd内容上大体一致,不过tkhd一般是指定的track设定的相关属性和内容,而mdhd
是针对独立的media来设置的,字段包含
hdlr
解释了媒体的播放过程信息,可获取track
类型信息,主要是有字段handler_type(uint32_t)
区分,具体含义以下:
重要的容器box,存储了解释track媒体数据的handler-specific信息,media handler用这些信息将媒体时间映射到媒体数据并行处理,minf
是一个container box,其实际内容由子box说明。 通常状况下,minf包含了一个header box,一个dinf和一个stbl,其中header box的数据类型有vmhd(视频轨)、smhd(音轨)、hmhd(hint track)、nmhd(null track),dinf为data information box,stbl为sample table box。
stbl
包含了关于track中sample全部时间和位置的信息,以及sample的编解码等信息。利用这个表,能够解释sample的时序、类型、大小以及在各自存储容器中的位置。stbl
是MP4文件中最复杂的一个box了,也是解开MP4文件格式的主干,是一个container box;
stbl
包含:
在mp4文件中,sample是一个媒体流的基本单元,例如视频流的一个sample表明实际的nal数据。chunk是数据存储的基本单位,它是一系列sample数据的集合,一个chunk中能够包含一个或多的sample。
存储了编码类型和初始化解码器须要的信息。 stsd
有多种类型的子box,具体取决于该track是视频或是音频或是其余,对于视频,如果经过使用了H.264
编码的,子box为avc1,avc1的主要字段:
包含一个Sample编码时序表,经过这个表能够从解码时间映射到sample序号,表中的每一项是连续相同的编码时间增量(Decode Delta)的个数和编码时间增量,经过把时间增量累加就能够创建一个完整的time to sample表。
这个box提供了decoding time到composition time的offset的表,用于计算pts。
stts
表可获取;ctts
获取。由此可知,经过stts
和ctts
能够方向推出解码顺序和视频播放顺序,当无B
帧视频时,ctts
不存在,解码顺序和播放顺序一致。
它包含media中的关键帧的sample表,若是此表不存在,则每一帧都是关键帧。
主要字段sample_number:媒体流中同步的sample序号。
包含sample的数量和每一个sample的字节大小,box体积有点大,主要字段有:
meida中的sample被分组成chunk,chunk能够有不一样的大小,chunk内的sample能够有不一样的大小,经过stsc中的sample-chunk映射表能够找到指定的smaple的chunk,从而找到这个sample。结构相同的chunk能够汇集在一块儿造成一个entry,这个entry就是一个stsc映射表的表项。
主要字段说明:
chunk的编号从1开始。
Chunk Offset表存储了每一个thunk在文件中的位置,这样就能够找到媒体数据,而不用解析box了。
感谢您阅读到这里,本次分享的内容只是视频方面的基础,过程有些枯燥,如如有什么描述不对或不得当,欢迎指出。