实测成功环境: WIN7 + VS2013 + FFmpeg4.3 和 WIN10 + VS2019 + FFmpeg4.3(N-98819-ge2589ac)

源码下载

  • FFmpeg源码

依赖工具

  • MSYS2
  • ​YASM

下载安装MSYS2; 下载YASM,将文件名改为yasm.exe,将它所在的目录加入到环境变量中。

配置头文件和库搜索路径

以下几种方法任选一种

1.使用vcvarsall.bat

  • 打开cmd,执行vcvarsall.bat(一般在C:Program Files (x86)Microsoft Visual Studio 12.0VC目录下,vcvarsall.bat将会设置INCLUDE和LIB环境变量,以便cl能找到对应头文件和.lib文文件);
  • 继续在cmd中执行msys2安装目录下的msys2_shell.cmd
vcvarsall.bat x86
msys2_shell.cmd -use-full-path

2.在VS中打开msys2

  • 在VS中选择:Tools -> External tools... -> Add
  • 在VS中启动msys2:Tools->msys2

确保msvc编译器cl和链接器link是否正常

我们使用的是微软的编译器cl.exe和链接器link.exe,然而msys2自带有link.exe,和msvc 的link.exe重名,且前者所在目录在环境变量中靠前,所以运行link命令时实际运行的是msys2的link.exe,这将造成链接出错

解决方法

  • 将<msys2安装目录>usrbin下的link.exe重新命名为其它名称;
  • 或者,想办法修改PATH的顺序

msys2 安装pkg-config,diffutils,make工具(msys2没带这些工具,手动安装)

pacman -S pkg-config
pacman -S diffutils
pacman -S make

2.构建

切换至FFmpeg源码目录,执行

./configure --toolchain=msvc
make

构建成功:

编译ffplay

虽然ffplay是默认enable的,但ffplay的编译依赖第三方库sdl2,所以上述步骤可能因为缺少sdl2依赖而无法编译出ffplay.exe。
下面是解决方法 sdl2下载 下载VC版本,解压。

1.配置sdl2对msvc可见

显然,sdl2头文件和库文件必须让编译器可以找到, 可以把头文件目录添加到INCLUDE环境变量,将库文件目录添加到LIB环境变量 在MSYS2控制台执行(注意目录得使用Windows格式 C://...而非 /c/...):

export INCLUDE=$INCLUDE";<sdl2头文件目录>"
export LIB=$LIB";<sdl2库文件目录>"

也可以在cmd执行vcvarsall.bat后使用set命令添加

2.配置sdl2对pkg-config可见

另外,sdl2除了得对msvc可见,还要对pkg-config可见,方法如下(实测可用,但不知道有没有更好的方法) - 新建sdl2.pc 文件,编辑如下

prefix=你的sdl2所在目录(目录格式/c/...而非C://...)
libdir=${prefix}/lib/x86
includedir=${prefix}/includeName: sdl2
Description: sdl2
Version: 2.0.12
Libs: -L${libdir} -lsdl2

prefix设置为的sdl2目录(目录格式/c/...而非C://...),Version设置为你的sdl2版本

  • 查看PKG_CONFIG_PATH环境变量,将sdl2.pc拷贝到其中任一目录(如<msys2安装目录>/usr/lib/pkgconfig)
echo $PKG_CONFIG_PATH

3.启用sdl2,编译

最后,使用--enable-sdl2启用sdl2

./configure --enable-sdl2 --toolchain=msvc
make

其他库的使用方法应该类似

问题

1.源码字符集不匹配的问题

msvc2019

因为msvc2019默认以utf-8编码读取源码,而./configure生成的config.h包含gbk字符 解决方法: - 将config.h以gbk编码打开(notepad++或vscode),复制全部,再以utf-8打开粘贴覆盖; - 或者,干脆将utf-8下乱码的字符删除

msvc2013

msvc2013默认以gbk编码读取源码,所以方法同msvc2019,不过恰好相反,要确保不出现gbk编码无法识别的字符

2.编译出错,timespec未定义

timespec结构体是C11标准定义的,包含在time.h头文件中,msvc2013可能没有完全实现这个标准。 幸好ffmpeg只是借用了这个结构体,而没有用到相应的函数, 所以我们手动定义一下好了:

#ifndef _MY_TIMESPEC_
#define _MY_TIMESPEC_
struct timespec{time_t tv_sec;  // Seconds - >= 0long   tv_nsec; // Nanoseconds - [0, 999999999]};
#endif

将它拷贝到源码中,重新make

ffmpeg添加到环境变量_Windows + MSVC环境编译ffmpeg相关推荐

  1. window安装python3装环境变量_Windows下的Python安装与环境变量的配置

    Windows下的Python安装与环境变量的配置 第一步:python下载: 第二步:python安装: 双击下载包,进入Python安装向导. 此处省略安装时的配图,下一步.下一步即可.但请要注意 ...

  2. 怎样配置java的环境变量_java配置环境变量步骤

    在完成了JDK的安装后,环境变量设置是其安装后的首要操作,有人会问为什么要设置这个,要理解这个你首先要明白环境变量的涵义,它可以简单的理解为路径导向. . JAVA_HOMEC:\Usr\Java\j ...

  3. Windows系统环境变量之path环境变量(Python, Java环境变量配置)

    系统: Windows10 path系统环境变量的作用: Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外 ...

  4. centos设置java环境变量,CentOS设置环境变量

    查看环境变量 查看某个环境变量的值,需要使用 "echo $环境变量名". echo命令用于在终端输出字符串或者变量的值,格式如下: echo [字符串 | $变量名] 常见的环境 ...

  5. centos配置c语言环境变量,CentOS7设置环境变量

    一.环境变量的概念 1.环境变量的含义 程序(操作系统命令和应用程序)的执行都需要运行环境,这个环境是由多个环境变量组成的. 2.环境变量的分类 1)按生效的范围分类. 系统环境变量:公共的,对全部的 ...

  6. Linux——孤儿进程|进程的优先级 用top命令去修改优先级 其他概念 环境变量 PATH 获取环境变量

    目录 孤儿进程 进程的优先级 用top命令去修改优先级 其他概念 环境变量 PATH 获取环境变量 习题 孤儿进程 父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢? 父进程先退出,子 ...

  7. 为什么要配置环境变量以及配置环境变量的步骤

    每一个学习Java的人,第一堂课都是如何配置环境变量,我刚开始学习的时候,都是跟着老师一步一步做的,根本不知道为什么要这么配置,今天就跟大家解答疑惑. 1.JRE和JDK的区别 JRE:java运行环 ...

  8. 环境变量之java环境变量

    为什么要配置环境变量? 在配置环境变量之前,首先理解什么是环境变量? 通俗来讲,环境变量是用户 预配置的将来会使用到的可执行文件的物理位置,众所周知,操作系统中几乎所有的软件都是基于如windows操 ...

  9. 在oracle环境变量里,oracle环境变量详解

    共享存储文件系统(NFS) 通常情况下,ORACLE_SID这个环境变量全称Oracle System Identifier,,用于在一台服务器上标识不同的实例,默认情况下,实例名就是ORACLE_S ...

最新文章

  1. List数组,string数组,Dictionary字典三种contain方法的查询速度
  2. php中为什么要用heade定义头,有什么应用场景
  3. 【转】c#中类的默认访问修饰符
  4. 四川一级计算机课程编码,四川省计算机一级考试真题
  5. 【Linux系统编程】线程池
  6. How is Attachment property retrieved
  7. unzipped list
  8. php实现ppt样式效果源码,jQuery移动端和桌面设备的轻量级幻灯片特效源码
  9. 电子商务数据运营的五大应用
  10. komodo-edit
  11. 04MVC、RPC、SOA、微服务架构区别
  12. 高速公路的一些线路坐标、高程计算公式
  13. redis 删除操作命令
  14. linux let命令详解,Linux命令:let(示例代码)
  15. 计算机系统配置有哪些,电脑的配置基本知识 电脑有哪些基本配置
  16. 方框加对勾怎么输入_word里如何往方框中加对号?带方框的对号怎么弄,原来是这样的...
  17. wpf Route Event Code Snippet
  18. 安卓手机Recovery概述和原理分析
  19. 电脑双屏开机后副屏黑屏,电脑开机显示器黑屏,教您电脑开机后屏幕黑屏怎么解决...
  20. 基于百度云通过Python实现简单的营业执照识别

热门文章

  1. 【转】C++ GetLastError() 返回值对应表
  2. mysql-安装报错计算机中丢失MSVCR100.dll文件丢失
  3. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]40一般来说SPA和DPA的区别是什么
  4. 共轭方式怎么判断_怎样判断共轭双烯
  5. 平面设计中的网格系统pdf_深入浅出,带你认识网格系统与版式设计
  6. 计算机进去pe怎么设置用户,电脑密码怎么设置,教您设置电脑开机密码
  7. python怎么创建字符串列表_Python(字符串,列表,元组,字典)
  8. 创建实现一个简单的web项目
  9. 用计算机画好看的图形,如何画一手漂亮的电脑效果图?技巧案例赏析!
  10. 运行时异常与一般异常有何异同_Java修行第015天,异常机制和常用类