Streaming Media相关技术点(一)HLS\DASH\VOD\视频格式

1. 流媒体关键问题

如何在提供高性能和通用访问的同时流式传输视频?

  • 复杂的媒体生态系统:不同类型的网络、播放器、竞争流媒体技术
  • 文件格式、编码解码器(无法播放、RealPlayer和Windows Media流媒体格式。网站上的竞争格式要求每个用户下载相应的流媒体应用程序,并导致许多用户必须在他们的计算机上拥有所有三个应用程序以实现一般兼容性。)
  • 视频分发、成本
  • 高视频传输质量(卡顿)

2. 视频格式

当我们谈论视频时,我们通常认为它是一个整体的东西。实际上是两种或多种不同类型的信息(图片、音频、文字),它们串联呈现给观众。

音频和视频的时间性质是共享的,但用于有效传输它们的技术是非常不同的,并且在视频文件格式中需要很多复杂性。将这些(至少)两个流捆绑到一个包中是由于需要序列化视频数据而引入的许多问题中的第一个,并且通过称为容器的元格式来解决。

我们听说过MP4,MOV和WMV,所有这些都是容器格式,容器格式可能是视频组件中最容易识别的,因为它们有幸确定文件扩展名。

容器指定如何将音频,视频和元数据流序列化为连续的一系列位以及如何解压缩它们以进行解码。容器基本上是一个可以保存视频信息和定时媒体数据的盒子:

  • MPEG2-TS :MPEG2-TS传输串流(MPEG-2 Transport Stream;又称MPEG-TS、MTS、TS)是一种传输和储存包含视讯、音讯与通讯协定各种资料的标准格式
  • H.264:视频编码标准,H.264,又称为MPEG-4第10部分,高级视频编码(英语:MPEG-4 Part 10, Advanced Video Coding,缩写为MPEG-4 AVC)是一种面向块,基于运动补偿的视频编码标准 。H.264因其是蓝光盘的其中一种编解码标准而著名,所有蓝光盘播放器都必须能解码H.264。
  • ACC:音频编码标准

小结,三个概念比较重要:

  • 视频文件格式(容器格式,如flv、wmv、mov、mp4、ts、avi等)
  • 视频编解码器(视频编码格式,如h.264、h.265、vp8/vp9、ogg、mpeg-4 avc)
  • 音频编解码器(音频编码格式,如acc、mp3)

3. 视频涉及技术内容点

  • 内容编码、压缩、多路复用
    • 视频编码格式:
      • 包括H.264,HEVC,VP8或VP9
    • 视频压缩格式:
      • MP3,Vorbis,AAC或Opus
    • 编码的音频和视频流汇集在容器“ 比特流 ”中(MUX和DEMUX)
      • MP4,FLV,WebM,ASF或ISMA
  • 视频传输协议:
    • Adobe的RTMP或RTP之类的,将比特流从流服务器传送到流传输客户端
    • 2010年代,Apple的HLS,微软的Smooth Streaming,Adobe的HDS以及MPEG-DASH等非专有格式等技术已经出现,可以通过HTTP实现自适应比特率流,作为使用专有传输协议的替代方案。
  • MUX和DEMUX
    • muxing(多路复用),可以将视频流、音频流甚至是字幕流捆绑到一个单独的文件中
    • demuxing(多路分发/解复合) 将里面的视频、音频或字幕分解出来各自进行解码和播放
  • 协议挑战
    • 基于TCP传输协议:实时流协议(RTSP)(播放、暂停),推流
    • 基于UDP传输协议:实时传输协议(RTP)和实时传输控制协议(RTCP)专门用于通过网络传输媒体。(电话、通信等)
    • HTTP自适应比特率流:(HLS),拉流,纯粹由客户端驱动的,NAT类支出较好、持久连接减少、CDN支出好(CDN从其源服务器的源接收流,然后将其复制到其许多或所有Edge缓存服务器)
      • HTTP动态流是通过在回放期间在不同质量和大小的不同流之间动态切换来有效地向用户传送流视频的过程。这为用户提供了带宽和本地计算机硬件(CPU)可以支持的最佳观看体验。动态流的主要目标是使这个过程顺利无缝地与用户保持一致,因此如果需要扩大或缩小流的质量,那么这是一个平滑且几乎无法察觉的切换,而不会中断连续播放
      • HLS它的工作原理是将流或视频资源分解为几个不同比特率的MPEG2-TS文件(视频块),并使用流或文件分段器设置持续时间。Apple提供了一种这样的分段实现方式。[29]分段器还负责生成M3U8格式的一组索引文件,该文件充当视频块的播放列表文件。每个播放列表都属于给定的比特率级别,并包含具有相关比特率的块的相对或绝对URL。然后,客户端负责根据可用带宽请求适当的播放列表。
  • 内容存储
    • 流媒体存储大小=据流媒体带宽*媒体长度(s)*流媒体数量计算
    • 1小时、以300kbit/s(窗口320×240像素)大小 =(3600s ( 300100bit/s))/(810241024) = 128M
    • 使用单播协议同时由1,000个人查看该流,则要求是300 kbit / s×1,000 = 300,000 kbit / s = 300 Mbit / s带宽。这相当于每小时135 GB左右。
  • 内容分发(网络传输)
    • 标清:2Mbit/s
    • 高清:5Mbit/s
    • 超高清:9Mbit/s
  • 内容播放:“播放”包含了更多我们看不到的步骤。这个步骤是这样的:
    • 播放器打开视频源文件
    • 播放器调用分离器将视频文件分解为单独的音频流和视频流(Demux)
    • 播放器调用音频解码器对音频流进行解码,同时调用视频解码器对视频流进行解码(VideoDecode、Audio Decode)
    • 播放器依据同样的时间线将解码后的音频流和视频流输出到播放窗口并使之保持同步。
  • 内容安全(版权问题)

4. DASH vs HLS

HLS和DASH 根本就不会涉及到视频本身的解码问题。它的存在只是为了确保你的视频能够及时,快速,正确的播放。

  • 使用HLS传递:
    • HLS将播放使用H.264或HEVC/H.265编解码器编码的视频。
    • HLS不是一次性传送视频文件,而是将其分成更小的段。它们包含在MPEG-2传输流中。每个段通常持续2~10秒,并具有扩展名.ts,视频段相关信息链接在.m3u8清单中。
    • HLS必须使用H264作视频编解码器。
    • 由于HLS是由Apple开发的,因此它是iOS(iPad,iPhone)目前支持的唯一视频流方法,并且在Mac Safari浏览器中也支持本地。
  • 使用DASH传递:
    • 由.mp4片段(或单独的音频/视频片段)组成,链接在.mpd清单中
    • 与HLS不同,DASH已被采纳为国际标准
    • 短于HLS,持续时间为2到4秒
    • 与HLS不同,DASH不需要特定的编解码器。视频可以使用H264进行编码,但VP9和H265也很受欢迎。
    • DASH和HLS之间的另一个关键区别在于它对DRM的支持。
    # 通知播放器可用视频的不同质量级别以及如何在每个级别处理各个视频片段
    #EXTM3U
    #EXT-X-VERSION:6
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2855600,CODECS="avc1.4d001f,mp4a.40.2",RESOLUTION=960x540
    live/medium.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=5605600,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=1280x720
    live/high.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1755600,CODECS="avc1.42001f,mp4a.40.2",RESOLUTION=640x360
    live/low.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=545600,CODECS="avc1.42001e,mp4a.40.2",RESOLUTION=416x234
    live/cellular.m3u8

5. 直播 or 点播VOD

  1. HLS流可以以两种不同的模式传送:
  • 可以从任何点播放的视频的“静态”模式,通常称为视频点播(VOD);
  • 或“实时”模式,随着时间的推移,视频的后续部分可用。实时模式可以通过两种方式之一工作。
    • 对于真实直播活动,最常见的配置是每个媒体播放列表仅包括最新视频片段和少量连续的先前片段。在这种模式下,玩家可以在视频中向后搜索一小段时间,但可能不会一直回到开头。
    • 在其他实时配置中,新视频片段可以附加到媒体播放列表,但不会删除旧片段。该配置允许播放器在广播期间的任何时间寻回到流的开头,并在事件结束时无缝转换到静态流类型。
  1. 播放列表,media playlist 还分为三种 list:
  • live playlist: 动态列表,里面的 ts 文件会实时更新,并且过期的 ts 索引会被删除
  • event playlist: 静态列表。它和动态列表主要区别就是,原来的 ts 文件索引不会被删除,该列表是不断更新,而且文件大小会逐渐增大。它会在文件中,直接添加 #EXT-X-PLAYLIST-TYPE:EVENT 作为标识。
  • VOD playlist: 全量列表。它就是将所有的 ts 文件都列在 list 当中。如果,使用该列表,就和播放一整个视频没有啥区别了。它是使用 #EXT-X-ENDLIST 表示文件结尾。

6. 视频自适应播放

考虑到可用的带宽和编码,HLS技术尝试确保最高质量的观看体验,这并不总是意味着使用可用的最高比特率。

如果播放器是300px×150px,下载4k流将是一个很大的带宽浪费。默认情况下,播放器尝试加载小于最近检测到的段带宽的最高比特率变体,但有一个条件:如果有多个维度大于当前播放器大小的变体,它只会切换一个更大的大小比当前的球员大小。

通过生成多份不同分辨率的视频文件,结合客户端的网络实际情况,进行对应的视频清晰度的选择播放。

7. EG组织(MPEG、JPEG)

MPEG正式审核程序是Moving Picture Experts Group的简称。这个名字本来的含义是指一个研究视频和音频编码标准的“动态图像专家组”组织,成立于1988年,致力开发视频、音频的压缩编码技术

JPEG,联合图像专家小组(英语:Joint Photographic Experts Group,缩写:JPEG)是一种针对照片影像而广泛使用的有损压缩标准方法。这个名称代表。此团队创立于1986年,1992年发布了JPEG的标准而在1994年获得了ISO 10918-1的认定。JPEG与视频音频压缩标准的MPEG(Moving Picture Experts Group)很容易混淆,但两者是不同的组织及标准。

8. 客户端 VHS

8.1. video.js:

  • 一款基于js实现的视频播放软件
  • 参考:https://docs.videojs.com/tutorial-faq.html#q-what-is-videojs

8.2. videojs-http-streaming (VHS)

  • 使用video.js播放HLS,DASH和未来的HTTP流媒体协议,即使它们不是本机支持的。
  • vhs项目有三个主要职责:
    1. 下载并解析播放列表文件
    2. 实现HTMLVideoElement接口
    3. 通过下载和传输视频片段将内容位提供给SourceBuffer
  • 参考:https://github.com/videojs/http-streaming

9. 参考