文章目录
- 前言
- 一、前期准备
- 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 <stdatomic.h>
改为 #include "stdatomic.h"
将 stdatomic.h文件中 # include "../compat/atomics/win32/stdatomic.h"
改为 # include <compat/atomics/win32/stdatomic.h>
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 <unistd.h>
改成 #include "unistd.h"
19、为解决下面报错,需要将 FFmpeg-4.3.r98065 目录下相关的文件拷贝到工程文件对应的文件夹
20、针对下面报错,需要禁用特定警告 4996
21、针对下面报错,将 ffmpeg.c 文件的 main 函数改为 main_ffmpeg431
22、针对下面问题,添加依赖库
avcodec.lib
avdevice.lib
avfilter.lib
avformat.lib
avutil.lib
postproc.lib
swresample.lib
swscale.lib
编译还会报错
这里耽搁了很多时间去查这个问题,参考下面的博客,发现原来是文中所讲的原因七:位数选择错误
“error LNK2019: 无法解析的外部符号”原因总结
23、按照上面的修改成 WIN32 后,之前属性页所配置的需要再配置一遍,再次编译,无报错!!!
四、测试 ffmpeg.c
1、在 ffmpeg.h 中声明 main_ffmpeg431 函数
2、修改 ffmepg431_test.cpp,将下面代码复制到 ffmepg431_test.cpp
#include <iostream>
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 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。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
因为我们调用的是 ffmpeg.c 文件里面的主函数,其中 show_banner 实现了打印的功能
我们如果把其注释再次运行,则可以看到如下结果:
到此使用 FFmpeg4.3.1 的SDK官方开发包编译 ffmpeg.c 就大功告成了
我的qq:2442391036,欢迎交流!