🎬 第二章 VLC播放器及二次开发应用
📄 一句话概括

LibVLC 开发只需要三样东西:头文件、导入库、插件目录。 但三样都必须版本对齐,缺一样或错一样,症状完全不同。

📝 本节和前面几节的关系

上一节讲完 API,这一节讲环境。 这一节全是「操作步骤」,沙箱里没装 VLC,所以每一步都写成「你该看到什么」的判据, 而不是「我跑给你看」。

一、先分清 VLC 与 VLC SDK

这是第一个坑,也是最常见的一个:装了 VLC 播放器,不等于装了 SDK。

官方安装包在安装时会问你「要不要装 SDK」(有的版本放在「自定义安装」的组件列表里)。 默认是不装的。 所以很多人「明明装了 VLC」却找不到 vlc/libvlc.h。

判断方法很简单:打开 VLC 安装目录,看有没有 sdk 子目录。有 sdk 目录才有头文件与导入库; 只有 plugins 与 vlc.exe 的是纯播放器,不能拿来开发。

还有一条路:官网提供单独的 SDK 压缩包(7z),解压后就是「include + lib + plugins」三件套, 好处是不依赖安装包版本,坏处是要自己对上版本号。

二、三样东西各管什么

要什么 具体文件 用在哪一步 缺了的症状
头文件 include\vlc*.h 编译 找不到 vlc.h
导入库 lib\libvlc.lib 链接 未解析的外部符号
运行库 libvlc.dll 与 libvlccore.dll 运行 找不到 DLL
插件目录 plugins*.dll 运行 没有可用的输入

四行里,前两行是「编译期」,后两行是「运行期」。 这个区分非常重要:编译链接全绿、双击运行就崩,问题一定在后两行。

第三行与第四行的症状还不一样:缺 DLL 是「程序起不来」,系统弹「找不到 libvlc.dll」; 缺插件是「程序起来了、窗口开了、但什么都不播」,而错误信息只有一句「没有可用的输入」。

最后那种情况最耗时,因为报错完全指错了方向——它让你以为是文件坏了,其实是插件目录没跟着走。

三、32 位与 64 位

VLC 有 32 位与 64 位两套,你的工程必须与它一致。 混用在链接期就会报错(「模块计算机类型与目标计算机类型冲突」)。

所以工程配置里要确认三处一致:工程平台(Win32 还是 x64)、导入库的位数、运行时 DLL 的位数。 这三处任意一处不匹配,就是链接错或运行崩。

一个实用的检查办法:用任务管理器看 VLC 进程是 32 位还是 64 位,然后工程就按那个位数配。 别靠猜——同一台机器上装两个版本是很常见的事。

还有一条容易忽略的:Python 侧的 python-vlc 也是靠 libvlc.dll 工作的, 它同样受位数限制——32 位 Python 只能加载 32 位 libvlc,反之亦然。

四、部署:让插件跟着 exe 走

开发机上能跑,不等于客户机上能跑。 原因几乎总是插件目录没有跟着 exe。

VLC 找插件的顺序大致是:先看环境变量 VLC_PLUGIN_PATH, 再看 exe 同级(或上级)的 plugins 目录,最后看安装时写进注册表的路径。

所以部署有三种做法: 把整个 plugins 目录拷到 exe 同级。最省事,也最占空间。 只拷用得到的插件。能省很多体积,但要逐个试——漏一个就是某种格式放不了。 启动时用 libvlc_new 的参数显式指定插件路径。 最灵活,但那个参数是个字符串数组,格式容易写错。

一个必须知道的坑:libvlc_new 的参数是「命令行风格的选项数组」, 指定插件路径要写成 --plugin-path=...,而不是简单的路径字符串。写错了它不会报错, 只是继续用默认路径——表现还是「什么都打不开」。

五、常见报错对照

把这五种症状记住,能省掉大半排查时间:

症状 最可能的原因
编译找不到 vlc.h 没装 SDK,或包含目录没配
链接未解析符号 导入库没加,或位数不匹配
启动弹找不到 DLL libvlc.dll 没拷到 exe 同级
窗口开了什么都不播 plugins 目录缺失或路径错
播一半崩在回调里 事件没 detach 就 release 了对象

最后一行值得多说一句:它看起来像「内存错误」,实际是「生命周期错」。 排查时不要盯着崩溃的那一行代码,要看「谁在这个对象之前被释放了」。

一个通用建议:开发阶段先把整个 plugins 目录带上,等一切跑通了,再考虑裁剪体积。 反过来做(先裁剪)会让你在「是代码错还是缺插件」之间反复怀疑,这种怀疑最耗时间。

六、动手 Demo:装 SDK 要三样,缺一样都白搭

这段在四个常见安装位置里找 VLC,再检查 include/lib/plugins 三个子目录在不在。 沙箱里没有 VLC,所以这张表全是「缺」——这正是最该见到的一课。

roots = [r"C:\Program Files\VideoLAN\VLC",
         r"C:\Program Files (x86)\VideoLAN\VLC",
         r"D:\Program Files\VideoLAN\VLC",
         r"D:\VLC"]
for r in roots:
    if os.path.isdir(r):
        found = r
        break
for name in (u"include", u"lib", u"plugins", u"sdk"):
    T([name, u"在" if os.path.isdir(os.path.join(found, name))
       else u"不在"], [0, 0])

实跑输出:

--------------------------------------------------------------------
装 SDK 要三样,缺一样都白搭
--------------------------------------------------------------------
**LibVLC 开发要的东西只有三样,但三样必须版本对齐。**
**任何一样缺了,症状都是「编译过、链接错」或者「链接过、运行崩」。**

  要什么       典型位置                 缺了会怎样
  --------------------------------------------------------------
  头文件       include\vlc\libvlc.h     编译报找不到头
  导入库       lib\libvlc.lib           链接报未解析符号
  插件目录     plugins\*.dll            运行时报「没有输入」

**本机实际情况,逐条查一遍**:

  检查项                   结果
  -----------------------------------------------
  VLC 安装目录             四个常见位置都没有
  头文件/导入库/插件     全部无从谈起

**沙箱里没装 VLC,所以这三样一个都没有。**
  **这正是本节要讲的那种处境:环境不齐,代码再对也跑不起来。**

**三个最容易踩的细节**:
  装了 VLC 不等于装了 SDK——官方安装包里 SDK 是**可选组件**,要单独勾。
  32 位与 64 位必须跟你的工程一致,**混用在链接期就会报错**。
  **插件目录要在运行时能找到**:要么放在 exe 同级,
  要么用 `libvlc_new` 的参数指定——找不到就是「什么都打不开」。

**最后一条最隐蔽**:编译链接全绿,双击运行,弹出来的窗口里什么也不播。
**这时候八成不是代码的问题,是 plugins 目录没跟着 exe 走。**

这一段的输出全是「不在」,因为沙箱里根本没装 VLC。 这不是失败,是这门课的常态——凡是「必须有实物环境」的步骤,这里只能给你判据,不能给你结果。

所以这一节真正的交付物是「判据表」:你装完之后, 按上面那张表逐条看——include 在不在、lib 在不在、plugins 在不在、位数对不对。 四条都对,才谈得上写代码。

最后那句「编译链接全绿、运行什么都不播」值得再强调一次:它是这一节最典型、也最耗时的故障。 看到这个症状,第一反应查 plugins,不要查代码。

30 秒实验

  1. 打开你的 VLC 安装目录,看有没有 sdk 子目录。
  2. 如果有,数一下 include\vlc 下有几个 .h 文件。
  3. 用任务管理器确认你的 VLC 是 32 位还是 64 位。

常见误区

  1. 装了 VLC 就以为能开发。 SDK 是可选组件,默认不装,要单独勾或单独下压缩包。
  2. 把 64 位工程配上 32 位导入库。 链接期就报「计算机类型冲突」。
  3. 用 --plugin-path 时写成裸路径。 它要的是命令行风格的选项,写错了不报错、 只是继续用默认路径。
自测三问(点开对答案) 1. SDK 里哪三样是必需的? —— 头文件(include)、导入库(lib)、插件目录(plugins);再加两个运行库 DLL。 2. 编译链接都过了,运行起来窗口开了但什么都不播,先查什么? —— 查 plugins 目录有没有跟着 exe 走。 3. 怎么确认该配 32 位还是 64 位? —— 看你要用的 libvlc.dll 是哪个位数——用任务管理器看 VLC 进程,或直接看 DLL 文件属性。

环境齐了,下一节写第一个能跑的播放器——控制台版,一共二十来行。

相关笔记