一、vcpkg安装ffmpeg 4.4.1
vcpkg的使用可以参考之前的文章:vcpkg 使用
1.1 查看vcpkg中的ffmpeg版本
查看库的版本:vcpkg.io
1.2 vcpkg.json文件解析
创建vcpkg.json文件:
{"builtin-baseline": "984f9232b2fe0eb94f5e9f161d6c632c581fff0c","dependencies": [{"name": "ffmpeg","features": ["x264", "x265","fdk-aac","mp3lame"]}],"overrides": [{"name": "ffmpeg","version": "4.4.1","port-version": 20}]
}
说明:
builtin-baseline
:是vcpkg的commit-id
,vcpkg如果是解压编译的,是无法获取该id的- 获取commit-id:
git -C D:\Program\Vcpkg\vcpkg rev-parse HEAD
- 获取commit-id:
dependencies
:只需要填写库名称即可。name
库名称features
依赖库
overrides
指定库的版本version
:库主版本号port-version
: vcpkg端口版本号
1.3 ffmpeg 常用feature
查找 feature:vcpkg search ffmpeg
分类 | Feature 名称 | 描述 | 是否默认启用 | 备注 |
---|---|---|---|---|
视频编码 | x264 | H.264 视频编码支持,使用 libx264 库 | 否 | 需要 GPLv2+ 许可证,需手动启用 |
x265 | H.265/HEVC 视频编码支持,使用 libx265 库 | 否 | 需要 GPLv2+ 许可证,需手动启用 | |
vpx | VP8/VP9 视频编码支持,使用 libvpx 库 | 否 | 支持 WebM 编码,需手动启用 | |
aom | AV1 视频编码支持,使用 libaom 库 | 否 | AV1 编码,需手动启用 | |
webp | WebP 图像编码支持,使用 libwebp 库 | 否 | 用于 WebP 图像和动画编码 | |
openh264 | H.264 视频编码支持,使用 Cisco OpenH264 库 | 否 | 受专利限制,仅支持基线配置文件 | |
音频编码 | fdk-aac | AAC 音频编码支持,使用 Fraunhofer FDK AAC 库 | 否 | 非自由许可证,需手动启用 |
mp3lame | MP3 音频编码支持,使用 LAME 库 | 否 | 需手动启用,广泛用于 MP3 编码 | |
opus | Opus 音频编码支持,使用 libopus 库 | 否 | 高质量低延迟音频编码,需手动启用 | |
flac | FLAC 无损音频编码支持,使用 libflac 库 | 否 | 无损音频编码,需手动启用 | |
其他常用 | ffmpeg | 构建 FFmpeg CLI 工具(ffmpeg.exe) | 是 | 核心命令行工具,包含 muxer/demuxer 和基本滤镜 |
ffprobe | 构建 ffprobe 工具,用于分析媒体文件信息 | 否 | 媒体元数据和流信息分析工具 | |
ffplay | 构建 ffplay 工具,用于媒体播放 | 否 | 需要 SDL2 依赖,简单的媒体播放器 | |
sdl2 | SDL2 库支持,用于 ffplay 和其他图形/音频输出 | 否 | ffplay 的依赖,需手动启用 | |
fontconfig | Fontconfig 支持,用于字幕渲染和文本滤镜 | 否 | 需手动启用,增强字幕渲染能力 | |
freetype | FreeType 字体渲染支持,用于字幕和文本滤镜 | 否 | 需手动启用,增强字幕渲染能力 | |
opencl | OpenCL 硬件加速支持,用于滤镜和部分编码/解码 | 否 | 需 OpenCL 兼容硬件,实验性支持 | |
vaapi | VAAPI 硬件加速支持(Linux),用于视频编码/解码 | 否 | Linux 平台,需 Intel/AMD GPU 支持 | |
vdpau | VDPAU 硬件加速支持(Linux),用于视频解码 | 否 | Linux 平台,需 NVIDIA GPU 支持 | |
openjpeg | JPEG 2000 图像编码支持,使用 OpenJPEG 库 | 否 | 需手动启用,支持 J2K 视频 | |
zlib | Zlib 压缩支持,用于某些容器格式(如 PNG、ZIP) | 否 | 需手动启用,常见依赖 | |
bzip2 | Bzip2 压缩支持,用于某些容器格式 | 否 | 需手动启用,较少使用 | |
lzma | LZMA 压缩支持,用于某些容器格式(如 XZ、TIFF) | 否 | 需手动启用,常见于高压缩场景 | |
srt | SRT 协议支持,用于低延迟流传输 | 否 | 需手动启用,适用于直播 | |
rtmp | RTMP 协议支持,用于流媒体传输(如 YouTube 直播) | 否 | 需手动启用,依赖 OpenSSL 或 GnuTLS |
1.4 编译安装库
# 临时设置代理(powershell终端)
$env:HTTP_PROXY = "http://127.0.0.1:11819"
$env:HTTPS_PROXY = "http://127.0.0.1:11819"# 指定VS版本编译,vcpkg默认使用最新版本的VS编译【可选】
# $env:VCPKG_VISUAL_STUDIO_PATH = "D:\Program\Program Files (x86)\Microsoft Visual Studio\2017\Community"# 编译安装(常见Triplet类型在下面表格)
vcpkg.exe install --triplet x64-windows-release --x-install-root=.\tmp
Triplet 名称 | 库链接方式 | 运行时库链接 | 构建类型 |
---|---|---|---|
x64-windows | 动态 (DLL) | 动态 (/MD ) | Debug + Release |
x64-windows-release | 动态 (DLL) | 动态 (/MD ) | Release Only |
x64-windows-static | 静态 (LIB) | 静态 (/MT ) | Debug + Release |
x64-windows-static-release | 静态 (LIB) | 静态 (/MT ) | Release Only |
x64-windows-static-md | 静态 (LIB) | 动态 (/MD ) | Debug + Release |
x64-windows-static-md-release | 静态 (LIB) | 动态 (/MD ) | Release Only |
注意:--x-install-root
是指定库的安装目录,最终库的目录是:tmp\x64-windows
二、VSCode+CMake+VS2019编译器 使用ffmpeg
项目目录结构:
main.c文件内容:
#include <stdio.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>int main() {// 待检查的编解码器列表const char *codecs[] = {"libx264", // H.264 编码器"libx265", // HEVC 编码器"libfdk_aac", // AAC 编码器"libmp3lame", // MP3 编码器NULL // 结束标记};printf("FFmpeg 集成编解码器状态检查:\n");printf("===========================\n");// 遍历并检查每个编解码器for (int i = 0; codecs[i] != NULL; i++) {const AVCodec *codec = avcodec_find_encoder_by_name(codecs[i]);if (!codec) {// 若编码器未找到,尝试查找解码器codec = avcodec_find_decoder_by_name(codecs[i]);}if (codec) {printf("[✅] %-12s : 已启用 (类型: %s)\n", codecs[i], codec->type == AVMEDIA_TYPE_VIDEO ? "视频" : "音频");} else {printf("[❌] %-12s : 未启用或未编译\n", codecs[i]);}}return 0;
}
CMakeLists.txt文件内容:
cmake_minimum_required(VERSION 3.10)
project(ffmpeg_test VERSION 1.0)set(CXX_STANDARD 11)
set(CXX_STANDARD_REQUIRED True)# 设置可执行文件输出目录为 bin
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/bin)# 配置FFmpeg(avcodec.lib时动态库的导入库)
set(FFMPEG_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/ffmpeg_4.4.1)
include_directories(${FFMPEG_DIR}/include)
set(FFMPEG_LIBS${FFMPEG_DIR}/lib/avdevice.lib${FFMPEG_DIR}/lib/avfilter.lib${FFMPEG_DIR}/lib/avformat.lib${FFMPEG_DIR}/lib/avcodec.lib${FFMPEG_DIR}/lib/swscale.lib${FFMPEG_DIR}/lib/swresample.lib${FFMPEG_DIR}/lib/avutil.lib
)# 编译和链接依赖库
add_executable(${PROJECT_NAME} src/main.c)
target_link_libraries(${PROJECT_NAME} PRIVATE ${FFMPEG_LIBS} )# 使用file(GLOB)获取所有DLL文件
file(GLOB FFMPEG_DLLS "${FFMPEG_DIR}/bin/*.dll")# 添加自定义命令,在构建后复制DLL文件到输出目录
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILDCOMMAND ${CMAKE_COMMAND} -E copy_if_different${FFMPEG_DLLS}"${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"
)
构建命令
# 生成构建系统(在项目根目录下执行)
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE --no-warn-unused-cli -S./ -B./build -G "Visual Studio 16 2019" -T host=x64 -A x64# 编译(在build目录下执行)
cmake --build . --config Release
通过cmake插件生成构建系统文件: