🎬 第五章 视频基础
📄 一句话概括

VLC 把所有能力都拆成模块:access 取数据、demux 拆流、decode 解码、filter 处理、output 输出——任何一环都能单独换,这就是它【什么都能放】的工程原因。

📝 本节和前面几节的关系

5.4.2 看了 FFmpeg 的做法,这一节看 VLC 的模块化思路。

一、五个模块

access:把数据取进来——本地文件、网络流都归它。 demux:解封装,分离出各路流。 decode:解码成原始帧。 filter:画面前处理——缩放、去隔行、色彩调整。 output:送到显示与音频设备。

二、模块化的好处

每一环都是可插拔的:换一个解码器就是换一个 decode 模块。 这带来两个直接结果:格式支持能不断叠加,且某个模块坏了不影响别的。 所以 VLC 的兼容性不是【一个巨人】,而是一堆小模块堆出来的。

三、filter 这一环容易被忽略

filter 在解码之后、输出之前,负责把画面变成【能显示的样子】。 比如去隔行——老电视素材是隔行扫描的,直接显示会有梳齿。 再比如缩放——源是 1080p,窗口只有 720p,必须缩一次。 所以它和 5.4.2 里 FFmpeg 的【格式转换】是同一个位置。

四、和 FFmpeg 的分工

FFmpeg 是一套库,适合写进自己的程序、批量跑。 VLC 是一个成品程序,适合手工验证与教学演示。 两者的内部结构高度相似——VLC 自己也用了 FFmpeg 的解码库。 所以【先用 VLC 摸清概念,再用 FFmpeg 写进流程】是第 3.1.4 节就给过的建议。

五、动手 Demo:VLC 的模块化播放架构

VLC 把所有能力都拆成【模块】,需要哪块就加载哪块。

rows = [("access", "把数据取进来(文件、网络)"),
        ("demux", "解封装,分离出各路流"),
        ("decode", "解码成原始帧"),
        ("filter", "画面处理(缩放、去隔行)"),
        ("output", "送到显示与音频设备")]
for a, b in rows:
    print("%-8s %s" % (a, b))

实跑输出:

--------------------------------------------------------------------
VLC 的模块化播放架构
--------------------------------------------------------------------

VLC 把所有能力都拆成【模块】,需要哪块就加载哪块。

  模块       职责
  --------------------------------------
  access     把数据取进来(文件、网络)
  demux      解封装,分离出各路流
  decode     解码成原始帧
  filter     画面处理(缩放、去隔行)
  output     送到显示与音频设备

  模块化的好处:**任何一环都能单独换**。
  这就是 VLC【什么都能放】的工程原因——**它认的模块足够多。**

模块化的好处:任何一环都能单独换。 这就是 VLC【什么都能放】的工程原因——它认的模块足够多。

30 秒实验

  1. 在 VLC 里打开【工具 → 插件与扩展】,看它加载了多少个模块。
  2. 找出其中与 demux 相关的那些。

常见误区

  1. 以为 VLC 是【自己实现了所有解码器】。它大量复用了开源库。
  2. 忽略 filter 这一环。去隔行、缩放都发生在这里。
自测三问(点开对答案) 1. VLC 的五个模块分别是什么? —— access、demux、decode、filter、output。 2. 模块化架构带来什么好处? —— 任何一环都能单独替换,格式支持可以不断叠加。 3. filter 模块负责什么? —— 解码之后的画面处理,比如缩放、去隔行、色彩调整。

相关笔记