6

因为业务需要,这段时间一直在准备做一个新的HTML5播放器,涉及到一些底层的视频知识,这段时间到处搜索了解了一些相关信息,这里先做一个阶段性总结。

MPEG

MPEG(Moving Picture Experts Group,动态图像专家组)是ISO(International Standardization Organization,国际标准化组织)与IEC(International Electrotechnical Commission,国际电工委员会)于1988年成立的专门针对运动图像和语音压缩制定国际标准的组织。

这一段我是直接从百度百科上粘下来的官方解释,总结下来就是这是一个专门制定视音频通用标准的一个组织,因为要让播放器能正确识别播放各种视频,所以需要一份视音频格式的业界标准。我也同找到了一个解答很清晰简单的回答。通常来讲,每一次制定一个版本的白皮书就是一次技术的革新。

  • 比如最开始MPEG1就是针对VCD制定的音频压缩标准(其中我们所熟知及最近正在被渐渐废弃的mp3格式就是指MPEG-1 audio layer 3)

  • MPEG2开始针对DVD制定视频+音频的压缩标准,视频其实可以看作是图片帧序列,比如一张经过压缩的jpg图片的大小是100KB,对于一个每秒24帧的1分钟的视频来说,一个视频可能就有100KB * 24 * 60 ≈ 14G的大小,这样肯定不行。MPEG2协议中就定义了一些业界的视频压缩标准。

  • MPEG3其实和mp3不同,本来MPEG3是针对HDTV广播视频而制定的协议,但是由于MPEG-2的出色性能表现,已能适用于HDTV,使得原打算为HDTV设计的MPEG-3,还没出世就被抛弃了。

  • 后来随着手机的出现,因为手机的存储量有限,就要求更高的压缩率,比如原来一张DVD的存储量有4GB,而手机只有1G,这时候通过一些算法大牛们的努力,慢慢就有了MPEG4的协议制定。MPEG4协议中用了更高级的压缩算法,会比MPEG2有更高的压缩比。

Container

container就是指视频的格式,包括.mp4, .mov, .wmv, .m3u8, .flv等等,container作为容器主要包含了video数据、audio数据、metadata(用于检索视频payload格式等信息)。

Codec

COmpress and DECompress,是指视音频的压缩方式,包括H.265/MPEG-H HEVC, H.264/MPEG-4 AVC, H.263/MPEG-4 Part 2, H.262/MPEG-2等等。可以分为intraframe codec和interframe codec。其中H.264/AVC,也称为MPEG-4 高级视频编码(Advanced Video Coding,AVC),并且它将成为MPEG-4标准的第10部分(MPEG协议有很多部分,压缩方式是其中的一部分,还有一些部分定义了视频文件结构标准等)。就是现在工业界普遍在用的视频压缩方式。

MediaSource Extension

浏览器新提供的通过JavaScript生成媒体流来播放的API,通过window.URL.createObjectURL(MediaSource)接口可以在浏览器端生成一个可播放的blob链接,并设置给video标签

HLS vs. RTMP

这个基本可以链接我上一篇文章了,是当前比较通用的两个直播传输协议。其中HLS协议的直播视频格式是m3u8,RTMP的是flv。

m3u8文件

图片描述图片描述

上面2张图片,左图是一个普通的m3u8文件打开的内容,其实m3u8文件是一个纯文本,可以用记事本直接打开的,是一个视频描述文件,里面描述了一个个.ts文件片段的地址(或相对地址)、时长及hls协议版本信息等。右图是一个可以有多码率自适应的m3u8描述文件,可以根据不同带宽选择不同的m3u8地址。其中ts文件才是真正的视频数据。

ts文件

410527-20160723143430029-744220516.jpg

上图是我找的网上关于ts文件的详细文件结构,一个ts文件在传输过程中是以188byte大小的包传输的,每一个包包括一个header和payload。header中又有不同的字段,用来描述视频信息及payload所在的位置,payload即是有效负载,就是视频信息,是一个在通信领域的专用名词。具体的文件结构解析,打算在下一篇m3u8文件详细的文章中描述。

fragmented mp4

Center

也就是fmp4,是适应于现代浏览器的一种流媒体格式。和mp4格式不同的是,以往的mp4格式化也分为header信息和payload信息,一个大的mp4就会有一个很大的头信息,不适合与现在的网络环境。所以新的fmp4格式就出现了,fmp4格式有一个带了metadata的头片段,及后面一序列的fragment,每个fragment都有各自的header信息,这样就把header信息也分成了一个个小的片段,更适合现在的应用场景。所以fmp4格式也就是用于MediaSource对象的SourceBuffer的格式,通过一个initSegment和一序列的segment塞给MediaSource对象来播放。


九瑶
139 声望26 粉丝

前阿里前端,在淘宝直播、鹿班短视频、iTAG智能AI标注平台打过杂。