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 秒实验
- 打开你的 VLC 安装目录,看有没有 sdk 子目录。
- 如果有,数一下 include\vlc 下有几个 .h 文件。
- 用任务管理器确认你的 VLC 是 32 位还是 64 位。
常见误区
- 装了 VLC 就以为能开发。 SDK 是可选组件,默认不装,要单独勾或单独下压缩包。
- 把 64 位工程配上 32 位导入库。 链接期就报「计算机类型冲突」。
- 用
--plugin-path时写成裸路径。 它要的是命令行风格的选项,写错了不报错、 只是继续用默认路径。
自测三问(点开对答案)
1. SDK 里哪三样是必需的? —— 头文件(include)、导入库(lib)、插件目录(plugins);再加两个运行库 DLL。 2. 编译链接都过了,运行起来窗口开了但什么都不播,先查什么? —— 查 plugins 目录有没有跟着 exe 走。 3. 怎么确认该配 32 位还是 64 位? —— 看你要用的 libvlc.dll 是哪个位数——用任务管理器看 VLC 进程,或直接看 DLL 文件属性。环境齐了,下一节写第一个能跑的播放器——控制台版,一共二十来行。
- ☐ (本节完,下一节 02.03.05 使用VS控制台开发基于LibVLC的播放器)