|
| 1 | +# 01-安装与工程:vcpkg + CMake + VS(命令行与链接) |
| 2 | + |
| 3 | +目录页:见 [FFmpeg 文档目录](00-目录.md) |
| 4 | + |
| 5 | +## 目标 |
| 6 | + |
| 7 | +- 在 Windows + VS 环境把 FFmpeg 安装到工程里(vcpkg) |
| 8 | +- 能稳定调用 `ffmpeg/ffprobe` 做命令行处理 |
| 9 | +- 能在 CMake 工程里链接 FFmpeg 的库(libav*) |
| 10 | + |
| 11 | +--- |
| 12 | + |
| 13 | +## 1. 用 vcpkg 安装 FFmpeg(推荐) |
| 14 | + |
| 15 | +FFmpeg 在 vcpkg 里的 port 名称就是 `ffmpeg`: |
| 16 | + |
| 17 | +``` |
| 18 | +vcpkg install ffmpeg |
| 19 | +``` |
| 20 | + |
| 21 | +FFmpeg 的能力非常多,vcpkg 里也提供了一堆 feature。初学阶段你可以先接受一个工程口径: |
| 22 | + |
| 23 | +- 先装默认的 `ffmpeg`,把“命令行能用 + 工程能链接 + 运行时 DLL 能找到”跑通 |
| 24 | +- 之后再按需求加 feature(例如字幕、字体渲染、特定编码器、硬件加速等) |
| 25 | + |
| 26 | +如果你已经在 OpenGL 教程里用过 VS + CMake + vcpkg toolchain,这里保持同一套口径即可: |
| 27 | + |
| 28 | +- 固定 triplet(例如 `x64-windows`) |
| 29 | +- CMake 配置时固定 vcpkg toolchain |
| 30 | + |
| 31 | +参考(port 说明与 feature 列表):https://vcpkg.link/ports/ffmpeg |
| 32 | + |
| 33 | +--- |
| 34 | + |
| 35 | +## 2. 命令行可用性:ffmpeg / ffprobe 在哪里 |
| 36 | + |
| 37 | +你可能会遇到“库安装了,但找不到 `ffmpeg.exe`”的情况。原因通常是: |
| 38 | + |
| 39 | +- vcpkg 安装的是库本体;命令行工具是否安装/是否在 PATH 上,取决于 port feature 与你的使用方式 |
| 40 | +- VS 启动调试时 PATH 与终端 PATH 不是一回事 |
| 41 | + |
| 42 | +建议工程化口径是: |
| 43 | + |
| 44 | +- **开发期**:在你自己的工程里固定一个 `tools/` 或 `third_party/tools/`,把 `ffmpeg.exe/ffprobe.exe` 作为外部工具管理 |
| 45 | +- **发布期**:明确把运行时依赖的 DLL 与工具一起打包(避免“只在我电脑能跑”) |
| 46 | + |
| 47 | +如果你是通过 vcpkg 获取命令行工具,通常可以在 vcpkg 的 `installed/<triplet>/tools/ffmpeg/` 一类目录下找到它们(路径以你的 vcpkg 布局为准)。 |
| 48 | + |
| 49 | +--- |
| 50 | + |
| 51 | +## 3. CMake 链接 FFmpeg(libav*) |
| 52 | + |
| 53 | +FFmpeg 的库通常由这些组件组成: |
| 54 | + |
| 55 | +- `libavformat`:容器/封装(读写 mp4/mkv/flv…) |
| 56 | +- `libavcodec`:编解码(H.264/H.265/AAC…) |
| 57 | +- `libavutil`:通用工具(时间基、字典、缓冲区、像素格式…) |
| 58 | +- `libswscale`:图像缩放与像素格式转换 |
| 59 | +- `libswresample`:音频重采样与格式转换 |
| 60 | + |
| 61 | +vcpkg 的 `ffmpeg` port 提供 CMake 集成,典型用法是: |
| 62 | + |
| 63 | +```cmake |
| 64 | +find_package(FFMPEG REQUIRED) |
| 65 | +target_include_directories(app PRIVATE ${FFMPEG_INCLUDE_DIRS}) |
| 66 | +target_link_directories(app PRIVATE ${FFMPEG_LIBRARY_DIRS}) |
| 67 | +target_link_libraries(app PRIVATE ${FFMPEG_LIBRARIES}) |
| 68 | +``` |
| 69 | + |
| 70 | +如果你想让“工程可移植 + 配置更稳定”,建议把依赖放进 vcpkg manifest(`vcpkg.json`)并用 CMakePresets/VS 的 CMake 集成固定 toolchain 与 triplet。 |
| 71 | + |
| 72 | +### 3.1 链接不等于能跑:运行时 DLL 要能被找到 |
| 73 | + |
| 74 | +Windows 下最常见的问题是: |
| 75 | + |
| 76 | +- 编译链接通过,但运行时报 “找不到 xxx.dll” |
| 77 | + |
| 78 | +第一反应检查: |
| 79 | + |
| 80 | +- DLL 是否在可执行文件同目录 |
| 81 | +- 或者是否在 PATH 可搜索目录中 |
| 82 | +- Debug/Release、x86/x64 是否混用了不同目录的 DLL |
| 83 | + |
| 84 | +更推荐的工程习惯是:先把“能编译 + 能运行 + 能定位 DLL”跑通,再进入具体的解码/编码流程。因为 FFmpeg 真正难的部分往往不是 API,而是工程环境与数据路径。 |
| 85 | + |
| 86 | +--- |
| 87 | + |
| 88 | +## 4. License 的工程现实(你至少要知道的) |
| 89 | + |
| 90 | +FFmpeg 里有不同 license 组合(LGPL/GPL/nonfree)对应不同功能组合与可分发性。初学阶段不需要深究条款,但需要知道: |
| 91 | + |
| 92 | +- 你用的 FFmpeg build 是“带了哪些编码器/库”决定了你能不能用 `libx264`、`libx265` 等 |
| 93 | +- 当你要把程序发布给别人时,license 选择会影响你能否合法分发对应二进制 |
| 94 | + |
| 95 | +工程口径:不确定就先用“功能更基础、可分发性更清晰”的组合,等你真的需要某个编码器/滤镜再补齐。 |
| 96 | + |
| 97 | +--- |
| 98 | + |
| 99 | +## 常见坑 |
| 100 | + |
| 101 | +- **Debug/Release 混用依赖**:同一个工程里用到不同 triplet/构建类型的库,会出现运行时找 DLL 或链接符号对不上的问题 |
| 102 | +- **只链接了 avcodec**:很多符号实际在 avutil/avformat 里,缺一个就会一串 unresolved external |
| 103 | +- **把时间戳当成秒**:libav 的时间基是 `AVRational`,很多字段是“以 time_base 为单位”的整数 |
0 commit comments