🎬 第二章 音视频入门
📄 一句话概括

容器是盒子、编码是里面的东西:同一个 MP4 里可能是 H.264 也可能是 H.265,要看的是【里面装了什么】。

📝 本节和前面几节的关系

2.2.3 讲了怎么把数据压小,这一节讲压缩后的码流怎么被装进一个文件。

一、容器是什么

一条视频其实有两条流:视频流和音频流。 它们各自被编码压缩,然后需要装进同一个文件里一起传输、一起播放。 这个【装】的格式就是容器,也叫封装格式——MP4、FLV、MKV、TS 都是容器。

二、容器里装了什么

容器不只是打包,它还存了播放需要的元信息: 每条流用什么编码、分辨率和帧率是多少; 音频的采样率和声道数; 时间戳——有了它,音视频才能对齐。 所以把流从容器里【拆出来】再【装进去】(封装转换)通常很快,因为内容没有被重新编码。

三、常见容器的使用场景

MP4:兼容性最好,点播、短视频、本地文件都用它。 FLV:早期网页直播的主力,延迟低、实现简单。 MKV:能装多音轨多字幕,本地高清片源最常用。 TS:电视广播和 HLS 切片的基础,抗丢包能力强。 选容器看场景:要兼容选 MP4,要广播选 TS,要直播低延迟可选 FLV。

四、两个概念别混

【换容器】和【换编码】是完全不同量级的两件事: 换容器:把流拆出来重新打包,快,几乎不损画质。 换编码:把流解码再按新标准编码,慢,会有画质损失。 日常说的【转格式】多半指后者——这才是真正耗 CPU 的那一步。

五、动手 Demo:容器是盒子,编码是里面的东西

一条视频其实由两条流(视频、音频)打包而成。 容器决定【怎么装】,编码决定【里面是什么】。

boxes = [
    ("MP4",  "H.264 / H.265", "AAC",      "点播、短视频"),
    ("FLV",  "H.264",         "AAC / MP3", "网页直播"),
    ("MKV",  "H.264 / H.265", "AAC / AC-3", "本地高清片源"),
    ("TS",   "H.264 / H.265", "AAC",      "电视广播、HLS"),
]
for box, v, a, scene in boxes:
    print("%-4s 视频:%-14s 音频:%-12s %s" % (box, v, a, scene))

实跑输出:

--------------------------------------------------------------------
容器是盒子,编码是里面的东西
--------------------------------------------------------------------

一条视频其实由两条流(视频、音频)打包而成。
容器决定【怎么装】,编码决定【里面是什么】。

  容器     常用视频编码      常用音频编码     典型场景
  ----------------------------------------------------------
  MP4      H.264 / H.265     AAC              点播、短视频
  FLV      H.264             AAC / MP3        网页直播
  MKV      H.264 / H.265     AAC / AC-3       本地高清片源
  TS       H.264 / H.265     AAC              电视广播、HLS

  记一句话:**容器可以换,编码也可以换,两件事分开看。**
  同一个 MP4 里可能是 H.264,也可能是 H.265——要看的是【里面装了什么】。

同一个 MP4 里可能是 H.264,也可能是 H.265——要看的永远是【里面装了什么】。 换容器(封装转换)很快,换编码(转码)很慢——这是两件完全不同的事。

30 秒实验

  1. 随便找一个 MP4,用系统属性或媒体信息工具看它的容器、视频编码、音频编码三项。
  2. 再找一个 MKV 对比,看同一套内容可以有多少种装法。

常见误区

  1. 把 MP4 当成一种编码。它是容器,不是编码。
  2. 以为【转格式】只是改后缀。改后缀什么都不会变,还会让文件打不开。
自测三问(点开对答案) 1. 容器的作用是什么? —— 把编码后的视频流和音频流装进一个文件,并保存播放所需的元信息。 2. 换容器和换编码有什么区别? —— 换容器只是重新打包,快且几乎无损;换编码要重新编,慢且有损。 3. 直播常用哪个容器,为什么? —— FLV 或 TS——实现简单、延迟低,TS 还抗丢包。

相关笔记