🎬 第七章 流媒体开源库简介
📄 一句话概括

VLC 的功能看着很多,归一下类只有四组。 真正决定能不能用的只有「输入源」那一组。

📝 本节和前面几节的关系

7.3.1 讲了架构,这一节把它的能力摊开归类。 7.3.3 只挑「播网络流」这一件事讲透。

一、四类功能

① 播放控制 10 项:播放、暂停、停止、快进、慢放、 逐帧、循环、随机、书签、跳转。 ② 输入源 7 项:本地文件、光盘、摄像头、桌面捕获、 网络串流、播放列表、播客订阅。 ③ 处理链 8 项:音量、均衡器、音视频同步、去交错、 旋转、裁剪、字幕、色彩调整。 ④ 输出与转换 6 项:截图、录制、转码、串流输出、投屏、作为服务器。

实测合计 31 项,四类分别占 10/7/8/6。 播放控制那一类最多,因为它最常被用。

注意「作为服务器」也在列表里: VLC 能把一路流再吐出去,所以它既是播放器也是小型转发器。 很多人拿它做临时的转协议工具,比如 RTSP 转 HTTP。

二、哪一类最关键

只有「输入源」这一类决定能不能用。 输入源不支持,后面的处理链再强也没用。

所以选播放器时先看这一条: 它能不能打开你手里那种流。 能打开之后,画质与流畅度才有讨论的意义。

反过来,「播放控制」这 10 项虽然最多,但几乎每个播放器都有。 它们不构成差异——差异在输入源与处理链的深度上。

三、这些功能从哪来

每个功能就是一个模块,模块之间用同一条「数据流」接口串起来。 所以加功能不需要改核心,只要写一个新模块。

这也是它能覆盖几十种格式的原因: 格式的复杂度被切碎成「解复用器 + 解码器」两个小模块, 每个模块都只有几百行代码,谁都能贡献。

对比一下「一个程序支持所有格式」的另一种做法: 把格式判断写在一个大 switch 里。 那种写法加一种格式就要动核心,很容易越改越乱。

四、动手 Demo:功能列表——三十来个功能,其实只有四类

把 VLC 的常见功能归成四类,数一数各有多少项。 再看哪一类才是「能不能用」的决定项。

groups = {
    "播放控制": ["播放", "暂停", "停止", "快进", "慢放",
                  "逐帧", "循环", "随机", "书签", "跳转"],
    "输入源": ["本地文件", "光盘", "摄像头", "桌面捕获",
                "网络串流", "播放列表", "播客订阅"],
    "处理链": ["音量", "均衡器", "音视频同步", "去交错",
                "旋转", "裁剪", "字幕", "色彩调整"],
    "输出与转换": ["截图", "录制", "转码", "串流输出",
                    "投屏", "作为服务器"],
}
tot = 0
for k, v in groups.items():
    tot += len(v)
    print("%-6s %2d 项:%s" % (k, len(v), "、".join(v)))
print("合计 %d 项" % tot)

print()
key = "输入源"
print("决定能不能用的是「%s」,占 %d/%d" % (key, len(groups[key]), tot))

实跑输出:

--------------------------------------------------------------------
功能列表——三十来个功能,其实只有四类
--------------------------------------------------------------------
**① 把常见功能归成四类**

  类别           功能数     举例
  ------------------------------------------------------
  播放控制       10         播放、暂停、停止
  输入源         7          本地文件、光盘、摄像头
  处理链         8          音量、均衡器、音视频同步
  输出与转换     6          截图、录制、转码

  **合计 31 个,四类各占 10/7/8/6。**

  **这个分类有个实际用处:**
  **「功能列表」看着长,但真正决定能不能用的只有「输入源」这一类。**
  **输入源不支持,后面的处理链再强也没用。**

**② 为什么它能做这么多事**

  **因为 VLC 的架构是「模块按需加载」:**
  **每个功能就是一个模块,用得上才加载,不用就不占内存。**
  **所以它装下来几百兆,启动却只要几百毫秒。**

四类加起来 31 项,不是整数十个,所以「三十来个」才准确。 播放控制这一类占三分之一,但它恰恰是最没有差异的一类。 「作为服务器」放在输出类里,因为它把流吐出去,不是收进来。

30 秒实验

  1. 把「投屏」挪到输入源,想想合不合理——不合理,投屏是输出,方向不能混。
  2. 给「输入源」再加两项(比如 SRT、RTMP),看总数——变成 33,说明它的输入能力确实最多。
  3. 把所有功能都列成一个平表,想想为什么分类更好用——分类能直接回答「它支不支持我要的那种流」。

常见误区

  1. 「功能越多越好」——关键看输入源,其余可以不用。
  2. 「VLC 只能播不能转」——它能转码、能串流、能当服务器。
  3. 「播放控制是核心差异」——所有播放器都有,不构成差异。
自测三问(点开对答案) 1. VLC 的功能分哪四类? —— **播放控制、输入源、处理链、输出与转换。** 2. 哪一类最关键? —— **输入源**,它决定「能不能打开你手里那种流」。 3. 为什么功能多但代码不乱? —— **每个功能是一个独立模块**,通过统一的数据流接口串起来。

相关笔记