FFmpeg 在windows上面用msvc编译

首先你得准备好msys2环境,安装好对应的工具链,msys2他本身提供了三个环境,但是这次我们是用msvc去编译用哪个环境都无所谓,但是你在哪个环境装的工具链就进入到哪个环境,msys2是环境隔离的。然后下载好对应的ffmpeg源码,x264源码,x265源码,fdk-aac源码,openssl源码,openssl我是用的1.1.1的。还有最重要要安装vs

首先我们先进入到msys2环境里,但是要通过vs命令行工具打开命令行,因为这样才能访问 cl.exe 这个vc的编译器,以及一些编译套件比如 nmake 。也可以不用从vs命令行工具进入,只要把vs这些对应的工具配置到环境变量里也行,这里我们选择x64的命令工具进入,因为我们要编译 ffmpeg 64位库,如果要编译32位的就选择x86。

然后我们进入到安装好的msys2文件夹下面,找到一个msys2_shell.cmd的文件执行 msys2_shell.cmd -help 命令查看他的帮助文档,然后我们以 msys2_shell.cmd -defterm -full-path -no-start -here -mingw64 进入到msys2的环境里,这话代表的意思是 以默认终端,不打开新的新的命令行窗口(就是msys2提供的终端),然后继承当前环境的系统变量进入到当前目录,在mingw64的环境里 这里我说一句不是非得进入到mingw64的环境里,因为我们是用msvc的编译器去编译,用msys2是为了可以用他提供的linux的工具套件,以帮助我们编译ffmpeg,你的工具安装到哪个环境进入到哪个环境都行,如果我们是用mingw去编译ffmpeg的话,就要选择对应的环境去编译了,比如说你用clang去编译ffmpeg,就进入到clang的环境里,就像msys2为不同的环境提供了不同的类gcc的套件

然后我们就原地进入到了msys2环境里,然后我们验证一下环境变量有没有继承过来输入 cl.exe 我们就看到了msvc这个c++的编译器已经正常集成过来了。

编译x264

接下来我们编译 x264 进入x264源码目录,输入 configure -help 查看帮助,选择对应的选项,这里x264编译的时候他会默认选择 CC 这个编译器,这个编译器就是mingw64的编译器,但是我们要编译MSVC的,编写一个脚本,最重要的是 CC=cl 因为x264的编译选项没有提供CC的选项,这里我们就创建一个临时变量让CC=MSVC这个编译器,然后正常 make&&make install

OPTIONS="--enable-static --disable-cli"
BUILD_DIR="/home/X264msvc64"
CC=cl ./configure $OPTIONS --prefix=$BUILD_DIR/

编译x265

然后我们编译 x265 ,x265 是个cmake工程并且提供了各种环境编译的脚本,就更简单了,进入build目录,可以看到各种环境的脚本,我们现在实在msys2上编译msvc版本的x265,我们进入到 msys-cl 这个目录可以看到两个sh脚本一个是编译32位的,一个是64位,其实两个脚本没差别,只不过64的脚本会检查你的 cl.exe 是不是64的,如果不是会直接退出,这里会生成 nmake 然后用nmake工具去编译安装就行了,具体我已经写了注释。

#!/bin/sh
# This is to generate visual studio builds with required environment variables set in this shell, useful for ffmpeg integration
# Run this from within an MSYS bash shell
INSTALL_DIR="/home/x265Msvc64"if cl; thenecho
elseecho "please launch msys from 'visual studio command prompt'"exit 1
fi#选择使用生成nmake
#/W4 显示级别1、级别2和3级警告,并显示默认情况下不关闭的所有级别 4 (信息) 警告
#启用 /GR 时,编译器定义 _CPPRTTI 预处理器宏。 默认情况下, /GR 为打开状态。 /GR- 禁用运行时类型信息
#EH指定编译器生成的异常处理模型支持
#其余具体去查看微软文档
cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR -DCMAKE_CXX_FLAGS="-DWIN32 -D_WINDOWS -W4 -GR -EHsc" -DCMAKE_C_FLAGS="-DWIN32 -D_WINDOWS -W4" ../../sourceif [ -e Makefile ]; thennmake
fi

编译fdk-aac

然后我们编译 fdk-aac 进入到源码目录,因为fdk-aac2.0.2只给了automake生成makefile的部分文件,而没有直接给出可用的configue,所以我们需要生成 configure ,不过源码码录下面有个 sh 文件 ./autogen.sh ,执行一下就会生成更新 configure,然后我们 configure -h 查看帮助,除了上面的编译选项,它还告诉我们可以覆盖这些变量做对应处理,首先CC肯定是他的C编译器了,他的注释写的很清楚了,CFLAGS是他的编译选项,CXX是C++编译器,等等,我们可以覆盖这些变量对生成的makefile做修改。

OPTIONS="CC=cl CXX=cl --enable-static"
BUILD_DIR="/home/fdk-aacMsvc64"
./configure $OPTIONS --prefix=$BUILD_DIR/

这里给出对应的sh脚本,编译安装就生成对应的库文件了

编译openssl

首先我们先查看openssl文档,进入openssl源码目录,打开 INSTALL 文件,里面描述了在各个环境编译要注意的事项,这里我们编译 win 上的openssl,步骤很简单,用perl生成对应架构的nmake(makefile)文件,然后用nmake去编译。

但是这里我试了很多次都不成功,后来我查到是不同平台上的perl的路径,换行符那些不一样,要编译win版的openssl要安装win上面的perl,具体查看openssl文档 NOTES.PERL ,这里叫我们去安装ActiveState Perl,这样我们就能正常生成makefile了,然后执行 nmake test去测试,然后安装

#看你是什么平台,如果是IA64平台选择VC-WIN64I
#如果构建vc 使用ActiveState Perl,msys的perl不行
#具体看openssl文档
perl Configure VC-WIN64A --prefix=/home/local/opensslMsvc64
nmake && nmake test && nmake install

对应openssl脚本文件

编译ffmpeg

我们的前置工作终于做好了,终于可以编译ffmpeg了,我们进入到ffmpeg源码目录,查看configure -h帮助选项,这次ffmpeg提供了对应的编译器选项,这下更简单了

X264_INSTALL="/home/X264msvc64"
X265_INSTALL="/home/x265Msvc64"
aac_INSTALL="/home/fdk-aacMsvc64"
openssl_INSTALL="/home/opensslMsvc64"X264_LIB=$X264_INSTALL/lib
X265_LIB=$X265_INSTALL/lib
aac_LIB=$aac_INSTALL/lib
openssl_LIB=$openssl_INSTALL/lib#PKG_CONFIG_PATH是一个环境变量,它指定pkg-config将在其中搜索其.pc文件的其他路径,扩展pkg-config的默认搜索路径
export PKG_CONFIG_PATH=$X264_LIB/pkgconfig:$X265_LIB/pkgconfig:$aac_LIB/pkgconfig:$openssl_LIB/pkgconfig:$PKG_CONFIG_PATHecho $PKG_CONFIG_PATHBUILD_DIR="/home/ffmpeg4.x/ffmpegInstall"OPTIONS="--enable-shared--enable-libx264--enable-libx265--enable-libfdk-aac--enable-gpl--toolchain=msvc--enable-nonfree--cc=cl--cxx=cl--enable-openssl"#         --disable-programs 不构建命令行程序
#         --enable-gpl   //链接x264 x265需要同意这个协议
#         --enable-nonfree //链接fdk-aac需要同意这个协议
./configure $OPTIONS --prefix=$BUILD_DIR

这里给出脚本文件,openssl我是在win上编译的所以没有生成对应的.pc文件,这里手动编写一下,下面给出配置文件,替换成你安装openssl的路径。

prefix=D:/softwares/msys2/home/opensslMsvc64
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/includeName: GNU openssl
Description: openssl
#Requires:
Version: 1.1.1n
Libs: -L${libdir} -llibssl -llibcrypto
Cflags: -I${includedir}

这里还有个坑,如果你x264想静态链接到ffmpeg,找到ffmpeg源码目录在 libavcodec 文件夹下 libx264.c 文件修改代码,把这一行注释掉,不然ffmpeg默认是动态链接的,会报找不到对应函数的错误,如果你是动态链接x264,则不需要修改代码,正常编译就行。至于x265,我现在只能动态链接到ffmepg,静态链接会报找不到函数的问题,把libx265.c文件下面对应的 X265_API_IMPORTS 这个宏注释掉也不行,具体我现在也不知道怎么解决,希望大佬们有解决方法

这里还有一个问题,如果你要生成ffmpeg命令行工具,configure会在目录下面生成一个 config.h 的文件,打开这个文件会有msvc这个编译器生成的中文,这里原本是这样的,但是ffmpeg用到了这个宏,这里会乱码,会报语法错误,所以在make之前先手动把这一行替换为英文 “Microsoft®C/C++” ,内容随便,不产生乱码就行。

#define "用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.27.29111 版"

在windows下使用MSVC编译ffmpeg相关推荐

  1. Windows下用ndk编译ffmpeg

    Windows下用ndk编译ffmpeg   第一步:创建一个android工程,然后将ffmpeg整体放到jni下,并创建Android.mk和Application.mk Android.mk: ...

  2. 手把手教你在windows下源码编译Open3D

    文章目录 前言 1.编译环境 2.编译步骤 3.编译中的bug 3.1 下载超时问题,ispc.pybind11.open3d_sphinx_theme等 3.2 boringssl 3.3 Dire ...

  3. 手把手教你在Windows下使用MinGW编译libav

    2019独角兽企业重金招聘Python工程师标准>>> 手把手教你在Windows下使用MinGW编译libav libav是在Linux下使用纯c语言开发的,不可避免的,libav ...

  4. 手把手教你在Windows下使用MinGW编译libav(参考libx264的编入)

    转自:http://www.th7.cn/Program/cp/201407/242762.shtml 手把手教你在Windows下使用MinGW编译libav libav是在Linux下使用纯c语言 ...

  5. 在windows下写makefile编译代码

    From: http://blog.163.com/xjming487@126/blog/static/212951352007625114849843/ 在windows下写makefile编译代码 ...

  6. 实践详细篇-Windows下使用VS2015编译的Caffe训练mnist数据集

    上一篇记录的是学习caffe前的环境准备以及如何创建好自己需要的caffe版本.这一篇记录的是如何使用编译好的caffe做训练mnist数据集,步骤编号延用上一篇 <实践详细篇-Windows下 ...

  7. [转]cscope在windows下使用mingw编译的方法

    cscope在windows下使用mingw编译的方法      http://blog.csdn.net/mslk/archive/2007/05/06/1598513.aspx cscope在wi ...

  8. Windows下用CMake编译JsonCpp及配置(适合新手)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 JsonCpp是什么? JSON是一种轻量级的数据交换格式.它可以表示数字.字符串.有序的值序列 ...

  9. Windows下使用VS2019编译libiconv-1.16

    Windows下使用VS2019编译libiconv-1.16 参考了 https://blog.csdn.net/zhouguangcai8/article/details/105270657,在其 ...

最新文章

  1. 算法之排列与组合算法
  2. Mac 技术篇-设置Finder文件管理显示文件路径
  3. 当我给小姐姐讲述为何黑客要挟制路由器DNS 该怎样实时发觉和防备的方法后,小姐姐那崇拜的眼神令我无法忘却
  4. CCNA综合实验配置
  5. 面试中海量数据处理总结
  6. IOS启程01-配制CocoaPods来管理第三方类库
  7. MIT 最新 AI 医疗系统公布:“重症监护室干预” 与”电子医疗档案模型迁移“...
  8. java求立方体表面积和体积_设计一个立方体类BOX,它能计算并输出立方体的体积和表面积...
  9. 移动应用开发常见技术比较
  10. 帝国CMS仿《游戏资讯网》优化版整站源码/专业游戏资讯网站系统模版
  11. 在Ubuntu8.10中启用TrackPoint
  12. 中国计算机学会(CCF)推荐中文科技期刊目录(2020年发布,官网转载)
  13. Dissect HTTP3
  14. 计算机考研院校录取人数,2010年计算机考研34所自主划线院校复试成绩及录取人数等详细情况汇总...
  15. 摆扫式(whisk broom)和推扫式(push broom)卫星传感器
  16. TC8:UDP_MessageFormat_01-02
  17. 基于51单片机SJA1000 CAN通讯实现(C语言程序)
  18. 屏幕左上右下坐标计算
  19. (每日更新)里里,阿里里,阿里阿里里:【第一期】喜欢的记得关注哈
  20. 作文总写不好怎么办?猿辅导:家长要注意这几点

热门文章

  1. word中迅速将表格一分为二 拆分表格快捷键ctrl+shift+enter 重复上一个命令快捷键f4...
  2. fastadmin 加入layui图片弹窗
  3. NOJ-1143-字母转换
  4. 信息熵概念随笔——信息熵、信息的熵
  5. 连锁不平衡的计算方法
  6. 音视频SDK开发包涉及的技术要求
  7. Paper Reading:LightTrack: Finding Lightweight Neural Networks for Object Tracking via One-Shot Archi
  8. 阿里推送以及厂商推送
  9. 新买的笔记本首先该做什么?
  10. 俄罗斯计算机科学技术,俄罗斯计算机科学技术/光学全球领先的圣彼得堡国立信息技术机械与光学大学...