FFmpeg:编译(Windows)
Posted 满嘴跑火车的小土匪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FFmpeg:编译(Windows)相关的知识,希望对你有一定的参考价值。
编译环境
Windows 10
编译流程
安装msys2
- 下载:MSYS2
-
安装:点击下载好的exe,这里选择默认的安装路径:
C:\\msys64
. -
配置环境变量:在windows的左下侧搜索栏,搜索
环境变量
,然后点击编辑系统环境变量
。并将安装路径C:\\msys64
添加到系统变量Path中。 -
在windows的搜索栏搜索
msys2
,打开msys2的命令行窗口。
- 下载相关编译工具。在命令行中输入:
pacman -S mingw-w64-x86_64-toolchain
- 使用Notepad++打开
C:\\msys64\\msys2_shell.cmd
,搜索rem set MSYS2_PATH_TYPE=inherit
,去掉rem
,即更改为:
set MSYS2_PATH_TYPE=inherit
下载FFmpeg源码
在C:\\source
下执行下列git命令,即在下载源码至C:\\source\\ffmpeg
:
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
编译FFmpeg
- 下载、安装Visual Studio。
- 在windows的搜索栏搜索
x64 Native Tools
,然后点击x64 Native Tools Command Prompt For VS 2019
。
- 在弹出窗口中,输入:
msys2_shell.cmd -mingw64
- 在弹出的mingw64命令窗口中,切换到ffmpeg源码目录:
cd /c/source/ffmpeg
- 然后输入编译命令:
./configure --toolchain=msvc --enable-shared --enable-debug --prefix=../ffmpeg_build --extra-cflags="-I../source/ffmpeg_build/include" --extra-ldflags="-LIBPATH:../source/ffmpeg_buid/lib"
解释一下编译命令:
./configure
:执行当前目录,即C:\\source\\ffmpeg下的脚本文件configure。打开configure文件,你会有搜索到ffmpeg常用的一些编译命令的注释,比如--enable-shared
等。--enable-shared
:编译成动态链接库(dll)。--enable-debug
:允许对ffmpeg源码进行调试。--prefix=../ffmpeg_build
:指定编译结果的存放路径为C:\\source\\ffmpeg_build
。这里写成了相对路径。--extra-cflags="-I../source/ffmpeg_build/include"
:cflags
表示用于C编译器的选项。-I
表示在头文件的搜索路径列表中添加dir目录。这里的dir目录指定为C:\\source\\ffmpeg_build
,也写成了相对路径。--extra-ldflags="-LIBPATH:../source/ffmpeg_buid/lib"
:ldflags
设置gcc等编译器会用到的一些优化参数,也可以在里面指定库文件的位置。-LIBPATH:
也可以简写成-L
,后面紧跟库文件的目录。
关于--prefix
与--extra-cflags
、--extra-ldflags
路径的差异:
C # C盘
├── msys64 # msys2安装目录,也是msys2_shell.cmd所在的目录
└── source
├── ffmpeg # ffmpeg源码根目录,也是configure脚本文件所在目录
└── ffmpeg_build # 保存ffmpeg源码编译结果的目录
--prefix
的起始目录是ffmpeg源码的根目录,即:C:\\source\\ffmpeg
。所以ffmpeg_build目录的相对路径为:../ffmpeg_build
。
--extra-cflags
、--extra-ldflags
的起始目录是msys2_shell.cmd所在的目录,也就是C:\\msys64
。所以ffmpeg_build目录的相对路径为:../source/ffmpeg_buid
。
- 等待configure执行完毕后,继续输入下列命令,把源码文件编译成二进制可行文件:
make -j12 && make install
验证FFmpeg编译
- 在
C:\\source\\ffmpeg_build\\bin
下可以看见生成的ffmpeg.exe
:
- 切换到
C:\\source\\ffmpeg_build\\bin
目录。输入ffmpeg -version
验证:
注:建议把ffmpeg.exe
所在目录,即C:\\source\\ffmpeg_build\\bin
,加入windows系统环境变量,就可随时使用ffmpeg命令行。
参考资料:
【FFmpeg笔记】04-Win10编译ffmpeg4.2.1(For Windows)
ffmpeg学习记录源码编译windows下vs2019构建demo调试
1 编译ffmpeg源码
1.1 下载ffmpeg源码(github或ffmpeg官网【http://ffmpeg.org】
1.2 下载msys2,官网地址【http://www.msys2.org】
windows使用MinGW编译ffmpeg源码
1.3 安装msys2,默认安装路径(C:\\msys64)
1.4 更新msys2数据源(可省略)
1.4.1 C:\\msys64\\etc\\pacman.d\\mirrorlist.mingw32
http://mirrors.ustc.edu.cn/msys2/mingw/i686
1.4.2 C:\\msys64\\etc\\pacman.d\\mirrorlist.mingw64
http://mirrors.ustc.edu.cn/msys2/mingw/x86_64
1.4.3 C:\\msys64\\etc\\pacman.d\\mirrorlist.msys
http://mirrors.ustc.edu.cn/msys2/msys/$arch
1.4.4 重新启动msys 64bit
1.5 更新源pacman -Sy
1.5.1设置格式(可以不用设置,不影响编译结果)
1.6 msys安装编译工具pacman -S yasm make pkg-config diffutils
1.7 设置启动vs的批处理
复制vs安装路径下vcvars64脚本 D:\\soft\\vs2019\\install\\VC\\Auxiliary\\Build\\vcvars64.bat(找到vs安装路径直接搜索)
编辑msys启动命令 C:\\msys64msys2_shell.cmd
1.8 config配置项
./configure --enable-shared --enable-postproc --enable-gpl --toolchain=msvc --prefix=./bin
可使用./config --help查看所有选项
–enable-shared 开启动态库
–enable-postproc 启动后期处理
–enable-gpl 使用postproc时需要开源许可证
–toolchain-msvs 编码工具
–prefix=./bin 输出路径,当前目录下bin
同时可查看ffbuild目录下config.log文件中的输出日志
1.9 编译make
编译前工作:windows编译器编码格式是GBK,所以按照4.5的方法修改编码格式
ffmpeg目录下生成的文件转成utf-8格式
同理ffbuild目录下config.mak也需要保证是utf-8格式,修改后重启一下(可省略)
make 编译 -j(多少线程执行,一般按照cpu核心数量 * 2计算,最大化利用cpu进行编译)
1.10 make install 安装
到此就完成了编译工作,接下来就可以使用ffmpeg的库还有头文件来编写自己的demo
查看当前目录下是否有bin目录生成,里面就是编译源码后生成的动态库
2 安装SDL库,用于图像显示
下载地址 libsdl.org
下载后解压出SDL的库和头文件(后续播放时需要用到这个库)
3 调试自带的ffplay的demo
3.1 解决方案结构设计
MyFFmpeg
一一一一一 bin(所有项目生成目录)
一一一一一 dll(程序运行所依赖的动态库目录)
一一一一一一一一一一 ffmpeg
一一一一一一一一一一 SDLx64
一一一一一一一一一一SDLx86
一一一一一 FFmpeg(ffmpeg自带的三个应用目录)
一一一一一一一一一一 FFmpeg(ffmpeg自带的应用工程目录ffmpeg,转码,推流。。。)
一一一一一一一一一一 FFplay(ffmpeg自带的应用工程目录ffplay,播放)
一一一一一一一一一一 FFprobe(ffmpeg自带的应用工程目录ffpobe,查看文件格式)
一一一一一 include(SDL和ffmpeg头文件目录)
一一一一一一一一一一FFmpeg
一一一一一一一一一一一一一一一libavcodec
一一一一一一一一一一一一一一一libavdevice
一一一一一一一一一一一一一一一libavfilter
一一一一一一一一一一一一一一一libavformat
一一一一一一一一一一一一一一一libavutil
一一一一一一一一一一一一一一一libpostproc
一一一一一一一一一一一一一一一libswresample
一一一一一一一一一一一一一一一libswscale
一一一一一一一一一一SDL2-2.0.14
一一一一一一一一一一一一一一一SDL.h…
一一一一一一一一一一一一一一一…省略其他
一一一一一 lib(所有依赖的动态库或静态库)
一一一一一一一一一一ffmpeg
一一一一一一一一一一一一一一一avcodec.lib
一一一一一一一一一一一一一一一avcodec-59.dll
一一一一一一一一一一一一一一一avdevice.lib
一一一一一一一一一一一一一一一avdevice-59.dll
一一一一一一一一一一一一一一一…
一一一一一一一一一一SDLx64
一一一一一一一一一一一一一一一SDL2.dll
一一一一一一一一一一一一一一一SDL2.lib
一一一一一一一一一一一一一一一…
一一一一一一一一一一SDLx86
一一一一一一一一一一一一一一一…
一一一一一MyFFmeg(用于后续自己编写demo使用)
总结构图
ffmpeg自己的demo工程管理图
3.2 vs2019创建解决方案
下一步
创建ffmpeg自带的应用工程目录ffmpeg
创建ffmpeg自带的应用工程目录ffplay
创建ffmpeg自带的应用工程目录ffpobe
先创建这三个项目,并没有添加任何代码,示意图如下
3.3 修改项目属性和测试
全部修改为x64平台
这三个工程相同的修改方式基本一致,只举其中一个为例
ffmpeg工程添加测试代码test.cpp
编写测试代码(return 0后面少了一个分号,当时有点粗心)
test.cpp
#include <iostream>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <SDL.h>
#include <SDL_thread.h>
#include <libavutil/imgutils.h>
using namespace std;
int main()
{
cout << "test ffmpeg" << endl;
return 0;
}
此时我们会看到很多编译的错,就是需要用到的头文件没包进来。
工程->属性->配置属性->常规->输出目录
修改为 …\\bin
工程->属性->配置属性->c/c+±>常规->附加包含目录
修改为 …\\include\\FFmpeg;…\\include\\FFmpeg;…\\include\\SDL2-2.0.14
工程->属性->配置属性->链接器->常规->输出文件
修改为 …\\bin$(ProjectName).exe
工程->属性->配置属性->链接器->常规->附加库目录
修改为 …\\lib\\ffmpeg;…\\lib\\SDLx64
工程->属性->配置属性->链接器->输入->附加依赖项
添加 avcodec.lib;avdevice.lib;avfilter.lib;avformat.lib;avutil.lib;postproc.lib;swresample.lib;swscale.lib;SDL2.lib
工程->属性->配置属性->链接器->调试->生成数据库文件
修改为 …\\bin$(TargetName).pdb
因为已经没有明显的错误信息,此时编译一下试试
无法解析的外部符号 main,这个错误应该是其他头文件导致的,然后我们要把库给包含进来
3.2 将需要用到的库和用到的ffmpeg的代码拷到工程目录下
D:\\ffmpeg\\ffmpeg\\fftools\\ffplay.c
D:\\ffmpeg\\ffmpeg\\fftools\\cmdutils.c
D:\\ffmpeg\\ffmpeg\\fftools\\cmdutils.h
D:\\ffmpeg\\ffmpeg\\config.h
以上是关于FFmpeg:编译(Windows)的主要内容,如果未能解决你的问题,请参考以下文章
FFmpegffmpeg 命令查询一 ( 版本 | 编译配置 | 复用格式 | 编解码器 )
FFmpegffmpeg 命令查询一 ( 版本 | 编译配置 | 复用格式 | 编解码器 )
ffmpeg视频编解码 demo初探(包含下载指定windows版本ffmpeg)分离视频文件中的视频流每一帧YUV图片
ffmpeg视频编解码 demo初探(包含下载指定windows版本ffmpeg)分离视频文件中的视频流每一帧YUV图片