文章目录

  • 前言
  • 一、前期准备
    • 1、所需文件
    • 2、编译环境
  • 二、创建工程
  • 三、解决编译报错
  • 四、测试 ffmpeg.c

前言

本文使用官方发布的 SDK 开发包来亲手编译 ffmpeg.c 文件,编译成功后可以对其内部的源码按照我们的需求进行修改,为后面的转码器的开发做个铺垫。


一、前期准备

1、所需文件

ffmpeg-4.3.1-win32-dev

  • include:头文件
  • Lib:库文件

链接:https://pan.baidu.com/s/1gYLUjrFy1kaU5RDe-ihPQw
提取码:iukl

ffmpeg-4.3.1-win32-shared

  • Bin: 动态库 dll

链接:https://pan.baidu.com/s/1SyHTQN0ke1KAtyCHbARtzg
提取码:l12n

FFmpeg4.3.1 的 SDK 开发包

  • ffmpeg.c、cmdutil.c 等源文件

链接:https://github.com/ShiftMediaProject/FFmpeg

因本文编译的 ffmpeg 版本为 4.3.1,因此这里选择版本的时候选择 4.3 版本的最新发布的版本,如下图所示:

2、编译环境

IDE:Visual Studio 2022

二、创建工程

1、新建一个工程文件 ffmpeg431_test

2、编码为了和 ffmpeg 字符串相兼容,字符集这里改为使用多字节字符集

3、将FFmpeg-4.3.r98065 SDK开发包中相关的源文件复制到刚刚创建的工程文件夹内,包括如下文件:

  • 其中 dce_defs.c 所在目录:FFmpeg-4.3.r98065\SMP\ffmpeg
  • 其他文件所在目录:FFmpeg-4.3.r98065\fftools

复制后的结果如下:

4、将刚刚的这些源文件与头文件添加到项目中

5、预编译头选项选择 不使用预编译头

6、点击生成,此时会报很多错误,我们接下来依次解决错误

三、解决编译报错

1、将前面准备好的 ffmpeg-4.3.1-win32-dev 开发库复制到工程目录下并将其改为名 ffmpeg431devw32

2、将 ffmpeg431devw32 开发库头文件路径包含到工程目录内

3、将 ffmpeg431devw32 开发库路径包含到工程目录内

4、将 FFmpeg-4.3.r98065/SMP 目录下的 config.h 文件拷贝到工程目录中

5、将 mfx 目录拷贝到工程目录的 ffmpeg431devw32/include 目录下
mfx 链接:
链接:https://pan.baidu.com/s/1PL1t2zp96uuwVAW3F3Z4Mg
提取码:j377

6、再次编译,此时报错信息如下:

7、将 FFmpeg-4.3.r98065/compat 目录拷贝到工程目录的 ffmpeg431devw32/include 目录下

8、在工程目录的 ffmpeg431devw32/include 目录下新建 libavresample 目录,并将 FFmpeg-4.3.r98065/libavresample/avresample.h 和FFmpeg-4.3.r98065/libavresample/version.h 拷贝到其中

9、将 FFmpeg-4.3.r98065/SMP 目录下的stdatomic.h文件拷贝到 工程目录中

ffmpeg.c 文件中的 #include 改为 #include "stdatomic.h"

stdatomic.h文件中 # include "../compat/atomics/win32/stdatomic.h"改为 # include

10、为解决下面报错,将 FFmpeg-4.3.r98065 目录下相关的文件拷贝到工程文件对应的文件夹

11、为解决下面报错,定义一个宏 _CRT_SECURE_NO_WARNINGS;

如下图所示

12、将 FFmpeg-4.3.r98065/libavutil 目录下的 timer.h 拷贝到 ffmpeg431_test/ffmpeg431devw32/include/libavutil 目录下

13、将 ffmpeg431_test/ffmpeg431devw32/include/libavutil/internal.h 目录下的 #include "config.h" 注释

14、针对下面问题,在 ffmpeg431_test/ffmpeg431devw32/include/libavutil 目录下新建一个 x86 目录,并将 FFmpeg-4.3.r98065/libavutil/x86 目录下的 timer.h 拷贝进去

如下图所示:

15、同上面情况一样,并将 FFmpeg-4.3.r98065/libavutil/x86 目录下的 emms.h 拷贝进去

如下图所示:

16、针对下面报错,F12 跳转到定义的地方将对应的指针赋初值为 NULL

如下图所示:

17、为解决下面报错,需要将 FFmpeg-4.3.r98065 目录下相关的文件拷贝到工程文件对应的文件夹

18、为解决下面报错,需要将 FFmpeg-4.3.r98065/SMP 目录下的 unistd.h 拷贝到 ffmpeg431_test 工程目录下

并将 ffmpeg.c 中 #include 改成 #include "unistd.h"

19、为解决下面报错,需要将 FFmpeg-4.3.r98065 目录下相关的文件拷贝到工程文件对应的文件夹

20、针对下面报错,需要禁用特定警告 4996


21、针对下面报错,将 ffmpeg.c 文件的 main 函数改为 main_ffmpeg431

22、针对下面问题,添加依赖库

avcodec.libavdevice.libavfilter.libavformat.libavutil.libpostproc.libswresample.libswscale.lib


编译还会报错

这里耽搁了很多时间去查这个问题,参考下面的博客,发现原来是文中所讲的原因七:位数选择错误
“error LNK2019: 无法解析的外部符号”原因总结

23、按照上面的修改成 WIN32 后,之前属性页所配置的需要再配置一遍,再次编译,无报错!!!

四、测试 ffmpeg.c

1、在 ffmpeg.h 中声明 main_ffmpeg431 函数

2、修改 ffmepg431_test.cpp,将下面代码复制到 ffmepg431_test.cpp

#include extern "C"{#include "ffmpeg.h"}int main(int argc, char** argv){main_ffmpeg431(argc, argv);}

3、编译出现了如下报错:

原因是关键字冲突,将 class 改成 class2

此时编译成功

4、此时执行会报错

解决办法:将 ffmpeg-4.3.1-win32-shared/bin 目录下的 dll 文件拷贝到工程 ffmpeg431_test/Debug 目录下

再次运行可以看到如下打印:

ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developersbuilt with msvcconfiguration: --enable-gpl --enable-version3 --enable-bzlib --enable-iconv --enable-lzma --enable-sdl2 --enable-zlib --enable-libmp3lame --enable-libvorbis --enable-libspeex --enable-libopus --enable-libilbc --enable-libtheora --enable-libx264 --enable-libx265 --enable-libxvid --enable-libvpx --enable-libgme --enable-libmodplug --enable-libsoxr --enable-libfreetype --enable-fontconfig --enable-libfribidi --enable-libass --enable-libxml2 --enable-gnutls --disable-schannel --enable-gcrypt --enable-libssh --enable-libcdio --enable-libbluray --enable-opengl --enable-libmfx --enable-ffnvcodec --enable-cuda --enable-amf --toolchain=msvcWARNING: library configuration mismatchavutilconfiguration: --disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libgsm --disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amfavcodec configuration: --disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libgsm --disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amfavformatconfiguration: --disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libgsm --disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amfavdeviceconfiguration: --disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libgsm --disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amfavfilterconfiguration: --disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libgsm --disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amfswscale configuration: --disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libgsm --disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amfswresampleconfiguration: --disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libgsm --disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amfpostprocconfiguration: --disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libgsm --disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amflibavutil56. 51.100 / 56. 51.100libavcodec 58. 91.100 / 58. 91.100libavformat58. 45.100 / 58. 45.100libavdevice58. 10.100 / 58. 10.100libavfilter 7. 85.100 /7. 85.100libswscale5.7.100 /5.7.100libswresample 3.7.100 /3.7.100libpostproc55.7.100 / 55.7.100Hyper fast Audio and Video encoderusage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...Use -h to get full help or, even better, run 'man ffmpeg'D:\Project\VS_Project\ffmpeg431_test\Debug\ffmpeg431_test.exe (进程 14056)已退出,代码为 1。要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。按任意键关闭此窗口. . .


因为我们调用的是 ffmpeg.c 文件里面的主函数,其中 show_banner 实现了打印的功能

我们如果把其注释再次运行,则可以看到如下结果:

到此使用 FFmpeg4.3.1 的SDK官方开发包编译 ffmpeg.c 就大功告成了


我的qq:2442391036,欢迎交流!