5.3 VSCode使用FFmpeg库

一、VS+CMake

1.1 使用ffmpeg动态库

项目目录结构:

bash 复制代码
./
├── 3rdparty          # 第三方依赖库
│   └── ffmpeg_4.4.1 
│       ├── include   # 头文件
│       ├── lib       # 静态库库
│       └── share
├── build             # 编译目录
├── CMakeLists.txt    # cmake配置文件
└── src               # 源码文件
    └── main.c

CMakeLists.txt文件内容:

bash 复制代码
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/avcodec.lib
    ${FFMPEG_DIR}/lib/avdevice.lib
    ${FFMPEG_DIR}/lib/avfilter.lib
    ${FFMPEG_DIR}/lib/avformat.lib
    ${FFMPEG_DIR}/lib/avutil.lib
    ${FFMPEG_DIR}/lib/swresample.lib
    ${FFMPEG_DIR}/lib/swscale.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_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${FFMPEG_DLLS}
        "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"
)

main.c文件内容:

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;
}

生成构建系统的文件(相当于cmake .. 这里省略了一些参数):

编译:

bash 复制代码
cd build
cmake --build . --config Release

1.2 使用ffmpeg静态库

除了CMakeLists.txt文件内容不同,其他的和上面的动态库一样。

CMakeLists.txt文件内容:

bash 复制代码
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
set(FFMPEG_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/ffmpeg-4.4.1)
include_directories(${FFMPEG_DIR}/include)
set(FFMPEG_LIBS
    ${FFMPEG_DIR}/lib/libavcodec.a
    ${FFMPEG_DIR}/lib/libavdevice.a
    ${FFMPEG_DIR}/lib/libavfilter.a
    ${FFMPEG_DIR}/lib/libavformat.a
    ${FFMPEG_DIR}/lib/libavutil.a
    ${FFMPEG_DIR}/lib/libswresample.a
    ${FFMPEG_DIR}/lib/libswscale.a
)

# 添加 MSVC 编码支持
if(MSVC)
  add_compile_options("/utf-8")
endif()

# 编译和链接依赖库
add_executable(${PROJECT_NAME} src/main.c)

# 强制使用静态运行时库(ffmpeg静态库使用MT,这里强制使用MT)
target_link_options(${PROJECT_NAME} PRIVATE "/NODEFAULTLIB:LIBCMT")
target_link_libraries(${PROJECT_NAME} PRIVATE ${FFMPEG_LIBS}  ws2_32 bcrypt)

二、MSYS2+CMake

项目目录结构:

bash 复制代码
./
├── 3rd               # 第三方依赖库
│   └── ffmpeg_4.4.1 
│       ├── include   # 头文件
│       ├── lib       # 静态库库
│       └── share
├── build			  # 编译目录
├── CMakeLists.txt    # cmake配置文件
├── set_env.ps1       # msys2配置脚本(使我们能在powershell上使用msys2)
└── src               # 源码目录
    └── main.c

CMakeLists.txt文件内容:

bash 复制代码
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}/bin/avdevice.lib
${FFMPEG_DIR}/bin/avfilter.lib
${FFMPEG_DIR}/bin/avformat.lib
${FFMPEG_DIR}/bin/avcodec.lib
${FFMPEG_DIR}/bin/swscale.lib
${FFMPEG_DIR}/bin/swresample.lib
${FFMPEG_DIR}/bin/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_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${FFMPEG_DLLS}
        "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"
)

set_env.ps1脚本内容:

powershell 复制代码
# =============================================================================
#                          MSYS2 配置参数(可修改)
# =============================================================================
# MSYS2安装路径
$MSYS2_DIR = "D:\Program\msys64"

# 选择MSYS2子系统: MINGW64, MINGW32, MSYS, CLANG64
$MSYSTEM = "MINGW64"

# 是否继承当前环境变量PATH (yes=继承, no=不继承)
$MSYS2_PATH_TYPE = "inherit"
# =============================================================================
#                          以下内容请勿修改
# =============================================================================
# 设置输出编码为 UTF-8
$OutputEncoding = [System.Text.Encoding]::UTF8
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

# 检查 MSYS2 目录是否存在
if (-not (Test-Path $MSYS2_DIR)) {
    Write-Error "Error: MSYS2 directory not found at $MSYS2_DIR"
    Write-Error "Please update MSYS2_DIR in this script to your MSYS2 installation path."
    exit 1
}

# 设置基本环境变量
$env:MSYS = "winsymlinks:nativestrict"
$env:MSYS2_ARG_CONV_EXCL = "*"
$env:MSYSTEM = $MSYSTEM
$env:MSYS2_PATH_TYPE = $MSYS2_PATH_TYPE

# 更新 PATH 环境变量
$env:Path = "$MSYS2_DIR\$MSYSTEM\bin;$MSYS2_DIR\usr\bin;$env:Path"

Write-Host "MSYS2 $MSYSTEM environment loaded successfully."
Write-Host ""

# 验证环境
$bashPath = "$MSYS2_DIR\usr\bin\bash.exe"
if (Test-Path $bashPath) {
    Write-Host ""
    Write-Host "MSYS2 Environment Information:"
    Write-Host "----------------------------"
    try {
        $unameOutput = & $bashPath -c "uname -a"
        if ($LASTEXITCODE -eq 0) {
            Write-Host $unameOutput
        } else {
            Write-Warning "Failed to execute uname command"
            exit 1
        }
    } catch {
        Write-Warning "Failed to execute uname command"
        exit 1
    }
    Write-Host "----------------------------"
    Write-Host "MSYS2 environment loaded successfully."
    Write-Host ""
} else {
    Write-Error "Error: bash.exe not found at $bashPath"
    exit 1
}

# 查看 系统上所有环境变量
# Get-ChildItem Env:

# 查看powershell配置文件内容
# notepad $PROFILE

main.c文件内容:

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;
}

构建命令

bash 复制代码
# 在vscode的powershell 执行set_env.ps1脚本,配置msys2
.\set_env.ps1

# 生成构建系统(在项目根目录下执行)
cmake .. -G "MinGW Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++

# 编译(在build目录下执行)
cmake --build . --config Release
相关推荐
Yeauty17 小时前
你那条 ffmpeg 命令,一键翻成 Rust builder 代码
开发语言·rust·ffmpeg
Irene19911 天前
怎么设置 PyCharm 使用 VSCode 的快捷键,推荐保留的原生快捷键(特色功能不建议覆盖,否则丧失效率优势)Ctrl+Alt+L:代码格式化
vscode·pycharm·快捷键
放学校门口见1 天前
vscode部署stm32开发调试环境
ide·vscode·stm32
独隅2 天前
DevEco Code 在 Windows/MacOS 双系统上的完整使用指南
ide·人工智能·windows·macos·华为·harmonyos
Yeauty2 天前
用 Whisper 转录前,你不用再离开 Rust
开发语言·rust·ffmpeg·音视频·视频
2501_916008892 天前
iOS应用开发工具全面解析:如何选择与优化开发效率
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
csdn_aspnet3 天前
如何将 Cursor MCP 与 VS Code 连接
vscode·cursor·mcp·composio
paokuflying3 天前
ffmpeg提取视频中的音频
ffmpeg·音视频
梦想的颜色3 天前
2026 VibeCoding 工具链精选|IDE + 大模型成套组合推荐,按场景分级收录
ide·trae·ai 编程·vibecoding·国产海外 ai 编程方案·氛围编程成套配置·副业 ai 开发工具栈
Tirzano3 天前
java 精简使用ffmpeg
java·开发语言·ffmpeg