Windows + MSVC环境编译ffmpeg

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

源码下载

依赖工具

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

配置头文件和库搜索路径

以下几种方法任选一种

1.使用vcvarsall.bat

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

2.在VS中打开msys2

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


    微信截图_20200825163707.png
  • 在VS中启动msys2:Tools->msys2

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

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


微信截图_20200824165551.png

解决方法

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

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

pacman -S pkg-config
pacman -S diffutils
pacman -S make
微信截图_20200824192330.png

2.构建

切换至FFmpeg源码目录,执行

./configure --toolchain=msvc
make
微信截图_20200824192408.png
微信截图_20200824193403.png

构建成功:


微信截图_20200824204411.png

编译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
includedir=${prefix}/include

Name: 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.源码字符集不匹配的问题

微信截图_20200824193456.png
微信截图_20200824200500.png
微信截图_20200824200916.png

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 - >= 0
        long   tv_nsec; // Nanoseconds - [0, 999999999]
    };
#endif

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,000评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,745评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,561评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,782评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,798评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,394评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,952评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,852评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,409评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,483评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,615评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,303评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,979评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,470评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,571评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,041评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,630评论 2 359