【FFmpeg】Windows 下 vscode 配置 ffmpeg 开发环境

编译器mingw64

1. 配置 c_cpp_properties.json

实现 vscode 对 ffmpeg 库的代码提示功能

按下 ctrl + shift + p,输入 c/c++,选择:

添加 ffmpeg 的 include 路径,使 vscode 能够获取库函数的代码提示

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "E:\\ProgramLibs\\ffmpeg\\ffmpeg-7.1\\include"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "D:\\Soft\\MinGW\\mingw64\\bin\\gcc.exe",
            "cStandard": "c17",
            "cppStandard": "gnu++14",
            "intelliSenseMode": "windows-gcc-x64"
        }
    ],
    "version": 4
}

2. 配置 task.json

配置 task.json 来实现链接 ffmpeg 库编译我们的代码

打开任意 c/c++ 文件的 vscode 页面中,按下 ctrl + shift + p,输入 tasks,选择

在编译命令的参数中加入 ffmpeg 的库目录、包含目录,以及要链接的库(我这里使用的是静态库,如果使用动态库,还需要将库目录中的 .dll 文件拷贝到 生成的可执行文件 的目录下,才能正确运行可执行文件。不拷贝也能正常编译,但是却无法运行编译出来的可执行程序)

{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "cppbuild",
			"label": "C/C++: g++.exe 生成ffmpeg活动文件",
			"command": "D:\\Soft\\MinGW\\mingw64\\bin\\gcc.exe",
			"args": [
				"-fdiagnostics-color=always",
				"-g",
				"${file}",
				"-L",
				"E:\\ProgramLibs\\ffmpeg\\ffmpeg-7.1\\lib",
				"-I",
				"E:\\ProgramLibs\\ffmpeg\\ffmpeg-7.1\\include",
				"-lavcodec",
				"-lavdevice",
				"-lavfilter",
				"-lavformat",
				"-lavutil",
				"-lpostproc",
				"-lswresample",
				"-lswscale",
				"-o",
				"${fileDirname}\\${fileBasenameNoExtension}.exe"
			],
			"options": {
				"cwd": "${fileDirname}"
			},
			"problemMatcher": [
				"$gcc"
			],
			"group": {
				"kind": "build",
				"isDefault": true
			},
			"detail": "编译器: D:\\Soft\\MinGW\\mingw64\\bin\\gcc.exe"
		}
	]
}

3. 配置 launch.json

配置调试相关的设置

点击顶部栏中的 `运行`,选择 `添加配置`

在 launch.json 中的 configurations 中添加 `(gdb) 启动` 配置

配置运行程序和调试器的路径:

(同样地,如果使用动态库,还需要将库目录中的 .dll 文件拷贝到 生成的可执行文件 的目录下,才能保证 gdb 调试 的时候可以运行 .exe 文件)

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "D:\\Soft\\MinGW\\mingw64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

4. cpp 文件下使用 FFmpeg 库的注意事项

FFmpeg 库同样可以用于 C++ 开发,值得注意的是,由于 FFmpeg 库是使用 C 语言编写的,因此我们在引用其头文件时,应该使用 extern "C" 进行修饰,原因如下:

  • 背景知识:C++ 与 C 语言的链接方式差异
    • 在 C++ 中,函数重载是一个重要的特性。这意味着可以有多个同名函数,只要它们的参数列表不同。为了实现函数重载,C++ 编译器会对函数名进行名称修饰(Name Mangling)。例如,一个简单的 C++ 函数int add(int a, int b)在编译后的符号名可能会被修饰成类似_Z3addii这样复杂的名字(不同编译器的修饰规则不同),其中Z表示这是一个 C++ 函数,3add表示函数名是addii表示函数有两个int型参数。
    • 而 C 语言没有函数重载的概念,函数名在编译后的符号名就是其本身。例如,一个 C 函数int add(int a, int b)在编译后的符号名就是add
  • extern "C"的作用
    • 当在 C++ 代码中需要调用 C 语言编写的函数或者使用 C 语言编写的库时,就会用到extern "C"extern "C"的主要作用是告诉 C++ 编译器,被它包围的代码应该按照 C 语言的方式进行链接,即不进行函数名修饰。
    • 例如,如果有一个 C 语言编写的库,里面有一个函数int add(int a, int b),当在 C++ 代码中想要调用这个函数时,如果直接包含头文件并调用,C++ 编译器会按照 C++ 的方式去寻找经过名称修饰后的函数符号,这样就会找不到正确的函数。

简单代码如下:

#include <bits/stdc++.h>
extern "C"
{
#include <libavutil/log.h>
}

int main(int argc, char const *argv[])
{
    av_log_set_level(AV_LOG_DEBUG);
    std::cout << "hello world" << std::endl;
    av_log(NULL, AV_LOG_INFO, "hello FFmpeg!\n");
    return 0;
}

同时,我们也可以将  c_cpp_properties.json 和 task.json 中配置的编译器修改为 g++ 进行编译

### 配置 FFmpeg 开发环境使用 VSCode #### 安装 FFmpeg 开发包 为了配置 FFmpeg开发环境,在 Ubuntu 18 上需要先安装必要的依赖库以及 FFmpeg 自身。这可以通过更新软件包列表并安装一系列预构建的静态库来完成,这些操作可以简化后续的工作流程[^2]。 ```bash sudo apt-get update && sudo apt-get upgrade -y sudo apt-get install build-essential yasm cmake git libtool automake autoconf pkg-config zlib1g-dev libssl-dev libva-dev libvdpau-dev libvorbis-dev libtheora-dev libopus-dev libmp3lame-dev libsdl2-dev libnuma-dev libass-dev libfreetype6-dev libfdk-aac-dev libwebp-dev libopenjpeg-dev libxvidcore-dev libx264-dev libx265-dev libavdevice-dev libdc1394-22-dev libraw1394-dev libiec61883-dev libxml2-dev libjack-jackd2-dev libbluray-dev libzmq3-dev libssh-gcrypt-dev libarchive-dev libcurl4-openssl-dev libgsm1-dev libopencore-amrnb-dev libopencore-amrwb-dev speexdsp-dev librtmp-dev libcdio-paranoia-dev libcaca-dev libmodplug-dev libvo-amrwbenc-dev librubberband-dev libchromaprint-dev libmysofa-dev libmfx-dev libkvazaar-dev libilbc-dev libopenh264-dev libaribb24-dev libzimg-dev libsnappy-dev libtesseract-dev libtensorflow-lite-dev libnppi-dev nvidia-cuda-toolkit ``` 对于更深入定制化的需求,则可以从源码编译 FFmpeg 并指定特定前缀以便管理文件位置: ```bash ./configure --prefix=/usr/local/ffmpeg ... make sudo make install ``` 此命令中的 `--prefix` 参数指定了 FFmpeg 编译产物的目标路径[^3]。 #### 创建 CMakeLists.txt 文件用于 VSCode 项目结构设置 创建一个新的工作区或打开现有项目后,需建立一个名为 `CMakeLists.txt` 的文件作为项目的根目录下的核心配置文档。该文件定义了如何构建程序及其依赖关系。下面是一个简单的例子: ```cmake cmake_minimum_required(VERSION 3.0) project(my_ffmpeg_project) set(CMAKE_C_STANDARD 99) find_package(PkgConfig REQUIRED) pkg_check_modules(LIBAVFORMAT REQUIRED IMPORTED_TARGET avformat>=4.0) pkg_check_modules(LIBSWSCALE REQUIRED IMPORTED_TARGET swscale>=4.0) add_executable(main main.c) target_link_libraries(main PRIVATE PkgConfig::LIBAVFORMAT PkgConfig::LIBSWSCALE) ``` 这段脚本会寻找系统上已有的 FFmpeg 库,并将其链接到新创建的应用程序中去。 #### 设置 launch.json 和 tasks.json 支持调试功能 为了让开发者能够在 VSCode 中方便地运行和调试代码,还需要编辑 `.vscode/launch.json` 及其关联的任务描述符`.vscode/tasks.json` 来适配具体的编程需求。这里给出了一组基本模板供参考: **tasks.json** ```json { "version": "2.0.0", "tasks": [ { "label": "build", "type": "shell", "command": "cmake --build . --config Debug" } ] } ``` **launch.json** ```json { "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/main", "args": [], "stopAtEntry": false, "cwd": "${fileDirname}", "environment": [], "externalConsole": true, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "build", "miDebuggerPath": "/usr/bin/gdb" } ] } ``` 通过上述步骤,已经成功设置了基于 VSCodeFFmpeg 开发环境,允许编写、测试和优化多媒体处理应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值