使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c

文章目录

  • 前言
  • 一、前期准备
    • 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 版本的最新发布的版本,如下图所示:
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第1张图片

2、编译环境

IDE:Visual Studio 2022

二、创建工程

1、新建一个工程文件 ffmpeg431_test
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第2张图片
2、编码为了和 ffmpeg 字符串相兼容,字符集这里改为使用多字节字符集
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第3张图片

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

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

复制后的结果如下:
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第4张图片
4、将刚刚的这些源文件与头文件添加到项目中
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第5张图片
5、预编译头选项选择 不使用预编译头
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第6张图片
6、点击生成,此时会报很多错误,我们接下来依次解决错误
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第7张图片

三、解决编译报错

1、将前面准备好的 ffmpeg-4.3.1-win32-dev 开发库复制到工程目录下并将其改为名 ffmpeg431devw32
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第8张图片
2、将 ffmpeg431devw32 开发库头文件路径包含到工程目录内
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第9张图片
3、将 ffmpeg431devw32 开发库路径包含到工程目录内
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第10张图片
4、将 FFmpeg-4.3.r98065/SMP 目录下的 config.h 文件拷贝到工程目录中
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第11张图片
5、将 mfx 目录拷贝到工程目录的 ffmpeg431devw32/include 目录下
mfx 链接:
链接:https://pan.baidu.com/s/1PL1t2zp96uuwVAW3F3Z4Mg
提取码:j377
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第12张图片
6、再次编译,此时报错信息如下:
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第13张图片
7、将 FFmpeg-4.3.r98065/compat 目录拷贝到工程目录的 ffmpeg431devw32/include 目录下
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第14张图片
8、在工程目录的 ffmpeg431devw32/include 目录下新建 libavresample 目录,并将 FFmpeg-4.3.r98065/libavresample/avresample.h 和FFmpeg-4.3.r98065/libavresample/version.h 拷贝到其中
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第15张图片
9、将 FFmpeg-4.3.r98065/SMP 目录下的stdatomic.h文件拷贝到 工程目录中
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第16张图片
ffmpeg.c 文件中的 #include 改为 #include "stdatomic.h"
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第17张图片
stdatomic.h文件中 # include "../compat/atomics/win32/stdatomic.h"改为 # include
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第18张图片
10、为解决下面报错,将 FFmpeg-4.3.r98065 目录下相关的文件拷贝到工程文件对应的文件夹
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第19张图片
11、为解决下面报错,定义一个宏 _CRT_SECURE_NO_WARNINGS;
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第20张图片
如下图所示
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第21张图片
12、将 FFmpeg-4.3.r98065/libavutil 目录下的 timer.h 拷贝到 ffmpeg431_test/ffmpeg431devw32/include/libavutil 目录下

13、将 ffmpeg431_test/ffmpeg431devw32/include/libavutil/internal.h 目录下的 #include "config.h" 注释
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第22张图片
14、针对下面问题,在 ffmpeg431_test/ffmpeg431devw32/include/libavutil 目录下新建一个 x86 目录,并将 FFmpeg-4.3.r98065/libavutil/x86 目录下的 timer.h 拷贝进去
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第23张图片
如下图所示:
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第24张图片
15、同上面情况一样,并将 FFmpeg-4.3.r98065/libavutil/x86 目录下的 emms.h 拷贝进去
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第25张图片
如下图所示:
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第26张图片
16、针对下面报错,F12 跳转到定义的地方将对应的指针赋初值为 NULL
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第27张图片
如下图所示:
在这里插入图片描述
17、为解决下面报错,需要将 FFmpeg-4.3.r98065 目录下相关的文件拷贝到工程文件对应的文件夹
在这里插入图片描述
18、为解决下面报错,需要将 FFmpeg-4.3.r98065/SMP 目录下的 unistd.h 拷贝到 ffmpeg431_test 工程目录下
在这里插入图片描述
并将 ffmpeg.c 中 #include 改成 #include "unistd.h"
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第28张图片
19、为解决下面报错,需要将 FFmpeg-4.3.r98065 目录下相关的文件拷贝到工程文件对应的文件夹
在这里插入图片描述
20、针对下面报错,需要禁用特定警告 4996
在这里插入图片描述
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第29张图片
21、针对下面报错,将 ffmpeg.c 文件的 main 函数改为 main_ffmpeg431
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第30张图片
22、针对下面问题,添加依赖库
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第31张图片

avcodec.lib
avdevice.lib
avfilter.lib
avformat.lib
avutil.lib
postproc.lib
swresample.lib
swscale.lib

使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第32张图片
编译还会报错
在这里插入图片描述
这里耽搁了很多时间去查这个问题,参考下面的博客,发现原来是文中所讲的原因七:位数选择错误
“error LNK2019: 无法解析的外部符号”原因总结
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第33张图片
23、按照上面的修改成 WIN32 后,之前属性页所配置的需要再配置一遍,再次编译,无报错!!!使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第34张图片

四、测试 ffmpeg.c

1、在 ffmpeg.h 中声明 main_ffmpeg431 函数
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第35张图片
2、修改 ffmepg431_test.cpp,将下面代码复制到 ffmepg431_test.cpp

#include 
extern "C"
{
#include "ffmpeg.h"
}

int main(int argc, char** argv)
{
    main_ffmpeg431(argc, argv);
}

3、编译出现了如下报错:
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第36张图片
原因是关键字冲突,将 class 改成 class2
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第37张图片
此时编译成功
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第38张图片
4、此时执行会报错
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第39张图片

解决办法:将 ffmpeg-4.3.1-win32-shared/bin 目录下的 dll 文件拷贝到工程 ffmpeg431_test/Debug 目录下
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第40张图片
再次运行可以看到如下打印:

ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
  built with msvc
  configuration: --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=msvc
  WARNING: library configuration mismatch
  avutil      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-amf
  avcodec     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-amf
  avformat    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-amf
  avdevice    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-amf
  avfilter    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-amf
  swscale     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-amf
  swresample  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-amf
  postproc    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-amf
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Hyper fast Audio and Video encoder
usage: 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。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第41张图片
因为我们调用的是 ffmpeg.c 文件里面的主函数,其中 show_banner 实现了打印的功能
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第42张图片
我们如果把其注释再次运行,则可以看到如下结果:
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c_第43张图片
到此使用 FFmpeg4.3.1 的SDK官方开发包编译 ffmpeg.c 就大功告成了


我的qq:2442391036,欢迎交流!


你可能感兴趣的:(音视频开发,ffmpeg,编译)