关于直播几个视频格式的概念总结

发布于 2020-06-20  282 次阅读


原文地址 segmentfault.com

因为业务需要,这段时间一直在准备做一个新的 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 文件

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

fragmented mp4

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


或许明日太阳西下倦鸟已归时