前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c

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

作者头像
Gnep@97
发布2024-01-04 08:22:14
2340
发布2024-01-04 08:22:14
举报
文章被收录于专栏:Gnep's_Technology_Blog
文章目录
  • 前言
  • 一、前期准备
    • 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、针对下面问题,添加依赖库

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
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

代码语言:javascript
复制
#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 目录下

在这里插入图片描述
在这里插入图片描述

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

代码语言:javascript
复制
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 就大功告成了


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 前言
  • 一、前期准备
    • 1、所需文件
      • 2、编译环境
      • 二、创建工程
      • 三、解决编译报错
      • 四、测试 ffmpeg.c
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档