前言
之前在Windows下编译过FFmpeg库,但是编译出来的DLL库不仅个数多达7个,而且库总大小高达几十兆。现经过研究,使用shell脚本根据自己的需要编译自己的FFmpeg库,不仅可以编译出来一个自己命名的DLL,而且大小可以减小到10MB以下。
1、下载
1.1、下载ffmpeg
在https://github.com/FFmpeg/FFmpeg/tree/master下载zip压缩包即可,我下载的是n6.1.1版本
1.2、下载Visual Studio
在Microsoft官网下载VS,我下载的是Visual Studio Professional 2022
1.3、下载msys2
在https://www.msys2.org/下载msys2工具,我下载的是msys2-x86_64-20240113版本
2、安装
2.1、安装ffmpeg
将zip解压至D:\workspace\build\FFmpeg-n6.1.1
2.2、安装VS2022
自行选择安装,我不习惯到C盘,选择安装到D盘
2.3、安装msys2
安装到C:\msys64;
将msys2_shell.cmd中rem set MSYS2_PATH_TYPE=inherit改为set MSYS2_PATH_TYPE=inherit,这样可以从中环境%PATH%读取变量;
再把usr\bin中link.exe改为link.exe.bak,这样可以使用VS自带link.exe进行链接。
使用x86 Native Tools Command Prompt for VS 2022输入C:\msys64\msys2_shell.cmd,打开msys2之后输入下面命令更新并安装工具:
pacman -Syu
pacman -Su
pacman -S make
pacman -S diffutils
pacman -S yasm
pacman -S nasm
3、编译
3.1、设置全局环境,包括cl.exe以及ffmpeg头文件
/* 在Path中添加cl.exe所在文件夹路径。若未找到,可以在VS的安装目录下搜索cl.exe */
D:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.35.32215\bin\Hostx86\x86;
/* 在系统变量中新建变量INCLUDE,添加ffmpeg、cl.exe包含头文件目录 */
D:\workspace\build\FFmpeg-n6.1.1;
D:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.35.32215\include;
D:\Windows Kits\10\Include\10.0.22000.0\shared;
D:\Windows Kits\10\Include\10.0.22000.0\ucrt;
D:\Windows Kits\10\Include\10.0.22000.0\um;
D:\Windows Kits\10\Include\10.0.22000.0\winrt;
/* 在系统变量中新建变量LIB,添加cl.exe库文件目录 */
D:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.35.32215\lib\x86;
D:\Windows Kits\10\Lib\10.0.22000.0\ucrt\x86;
D:\Windows Kits\10\Lib\10.0.22000.0\um\x86;
3.2、编写source桥接文件.h和.c
编写桥接头文件myffmpeg.h
#ifndef __MY_FFMPEG_H__
#define __MY_FFMPEG_H__
#include "libavutil/mem.h"
#include "libavutil/imgutils.h"
#include "libavutil/opt.h"
#include "libavutil/mathematics.h"
#include "libavutil/time.h"
#include "libavcodec/avcodec.h"
#include "libavcodec/packet.h"
#include "libavformat/avformat.h"
#include "libavfilter/avfilter.h"
#include "libavfilter/buffersink.h"
#include "libavfilter/buffersrc.h"
#include "libswscale/swscale.h"
#include "libswresample/swresample.h"
#include "libavdevice/avdevice.h"
#ifdef _WIN32
#define MYFFMPEG_EXPORT __declspec(dllexport)
#else
#define MYFFMPEG_EXPORT __attribute__((visibility("default")))
#