本文是关于windows8.1/windows10通用应用下编译ffmpeg的一些需要注意的地方,针对最新的msys2而写,都是我在实际操作中遇到的,但是网上没有提到的。如果大家遇到什么问题或是在之前的MINGW中可以编译,但在最新的msys2里遇到了问题,或许可以从本文中获取一点参考。

uwp应用中,如果我们想要实现系统原生支持之外的媒体格式的解码(如:flv,ape等),需要使用FFmpeg库的支持。在Windows环境中,微软写好了一个专门用于编译、调试FFmpeg的项目,也提供了三种语言的使用范例。但是,很多人经常卡在编译ffmpeg这个最基础的步骤上,原因五花八门,但最常见的问题则是cl编译器无法工作。

这个问题,有很多可能的原因,网上也有很多解决方案,以下根据我遇到的情况,只针对。“cl is unable to create an executable file.”的问题补充、纠正几点(网络上的众多解决方案其实有一些于事无补,还会增加大量不必要的操作):

①cl.exe编译器自身的问题:

使用命令提示符打开Visual Studio的VC编译器的目录(eg:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin),有几个文件夹需要注意:

·amd64

·amd64_arm

·amd64_x86

·arm

·x86_amd64

·x86_arm

显而易见,这几个文件夹提供的是对应(跨)平台的编译工具。我们需要编译什么平台的ffmpeg库,最好在之前打开相应文件夹里的link.exe,看能否正常打开;使用命令提示符打开cl.exe,检查是否有正常的提示信息打印在控制台里。如果cl.exe无法打开,很可能是缺失动态链接库的原因。在……\Microsoft Visual Studio 14.0\Common7\IDE目录下,将msobj140.dll,mspdb140.dll,mspdbcore.dll和mspdbsrv.exe四个文件覆盖到……\Microsoft Visual Studio 14.0\VC\bin目录下。完成后,双击cl.exe,提示符瞬间弹出即为正常。

②VS库没有被msys正确链接:

网络上其他的编译ffmpeg的教程几乎都提到:如果不用vs提供的命令提示符打开msys2,也可以通过为msys2添加环境变量的方式来完成编译。事实上,这一方法有很多漏洞,可行性很低,如果之前就遇到了cl相关的问题,那么通过手动添加环境变量的方式看似正确,实则会让人走入弯路。

1.通过export命令直接添加

这个方法可能是最常用的,比如:export PATH=$PATH:"/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_arm"。随后执行echo $PATH,可以看到环境变量添加成功。但是,在编译时,ffmpeg里的configure配置无法读取到后来手动添加的路径。说白了,这个方法是徒劳的。

2.直接修改默认环境变量

这个方法直接修改msys目录下/etc/profile文件,为其添加:

unset VS

VS=“路径”

随后在MINGW的三个case语句里的PATH后面追加${VS}。这个方法可行,但是还是很容易出错,原因解释:

msys2在执行链接到VS的交叉编译时,需要引入的环境变量不止……Microsoft Visual Studio 14.0/VC/bin/<平台>一个。(事实上,perl等的编译也需要vs的介入。)环境变量缺一不可。

所以,最稳妥的解决方法是:使用vs自带的命令提示符(注意平台的对应)来打开msys2。

如果这之后观察环境变量,发现还是msys2默认的那几个,就根据平台打开对应的ini配置文件,将MSYS2_PATH_TYPE=inherit一句的注释取掉(删掉前面的“#”)。

执行 echo $PATH 指令,可以看到相比之前多出了很多vs的lib和include目录,接下来再执行which指令确认cl(推荐使用文件的完全名称(如:cl.exe)进行which指令查询。)、link.exe(注意是在vs的目录下,msys目录下的文件需要临时重命名)、armasm.exe(针对arm平台的编译所需)是否就位(至于cpp.exe等包含于msys的文件,如果缺失,请检查gcc,perl等库的安装),完毕后,将目录cd至ffmpeg所在目录,然后执行BuildFFmpegInterop.bat [系统] [平台] 即可。

一点补充:

Ⅰ.关于ffmpeg库,推荐从github上直接下载zip包,只有14.6mb。如果使用git指令获取的话,你可能会得到一个300m+的包,其实我们真正用到的只有解压出来的那几十m而已。

Ⅱ.微软提供的批处理已经写入了允许交叉编译的指令,同时编译出的库允许为商店应用所用,不需要我们添加额外的 -store 参数。另外,关于dx11的相关库的编译是默认关闭的。

希望本文能为想在自己应用中引入多格式媒体支持,却又在编译ffmpeg库遇到问题时的各位提供帮助。

【UWP】FFmpeg库的编译的更多相关文章

  1. Android APP使用NDK编译后的ffmpeg库出现undefined reference to 'posix_memalign'错误

    在android程序中使用NDK编译后的ffmpeg库的时候出现了如下错误: jni/libs/libavutil.a(mem.o): in function av_malloc:libavutil/ ...

  2. 手把手图文并茂教你用Android Studio编译FFmpeg库并移植

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52661331 之前曾写过一篇&l ...

  3. 实战FFmpeg--编译iOS平台使用的FFmpeg库(支持arm64的FFmpeg2.6.2)

    编译环境:Mac OS X 10.10.2 ,Xcode 6.3  iOS SDK 8.3        FFmpeg库的下载地址是 http://www.ffmpeg.org/releases/ . ...

  4. FFmpeg:初步编译使用[Android]

    1.安装NDK:http://dl.google.com/android/ndk/android-ndk-r9-linux-x86.tar.bz2 sudo gedit ~/.bashrc 末尾添加: ...

  5. 【转】FFMPEG 库移植到 VC 需要的步骤

    原文:http://blog.csdn.net/leixiaohua1020/article/details/12747899 在VC下使用FFMPEG编译好的库,不仅仅是把.h,.lib,.dll拷 ...

  6. FFMPEG 库移植到 VC 需要的步骤

    在VC下使用FFMPEG编译好的库,不仅仅是把.h,.lib,.dll拷贝到工程中就行了,还需要做以下几步.(此方法适用于自己使用MinGW编译的库,也同样适用于从网上下载的编译好的库,例如http: ...

  7. Linux下FFmpeg的安装编译过程【转】

    本文转载自:http://www.linuxidc.com/Linux/2013-06/85628.htm 详细说下在Linux下FFmpeg的安装编译过程.参考 Ubuntu 10.04安装编译FF ...

  8. Android中集成ffmpeg(一):编译ffmpeg

    方案选择 Android中集成ffmpeg的codec功能无非两种方式: JNI直接调用,主要用于App开发(无权限修改系统底层),如EXOPlayer,JPlayer等. 集成ffmpeg到OMX, ...

  9. 交叉编译多平台 FFmpeg 库并提取视频帧

    原文地址: 交叉编译多平台 FFmpeg 库并提取视频帧 交叉编译多平台 FFmpeg 库并提取视频帧 本文档适用于 x86 平台编译 armeabi.armeabi-v7a.arm64-v8a.x8 ...

随机推荐

  1. cocos2d-x---开篇介绍

    关于cocos2d-x这一游戏引擎,现在受到了手机游戏开发者的青睐.其实cocos2d一开始是由于cocos2d-iphone的成功,然后带动各类开源项目越来越火.由苹果独家的Objective-C到 ...

  2. adb报错:The connection to adb is down, and a severe&nbs

    我觉得这就像是adb的大姨妈一样,不过处理起来还是很easy滴:  1.报错:BUILD FAILEDD:\workspace\ganji\build.xml:144: The following e ...

  3. jdom.jar导入问题

    一开始,导入jdom-1.1.1.jar无反应,还是缺包状态 =>将jdom-1.1.1.jar解压,在jdom/build/目录下有jdom.jar导入,success!

  4. UVa 573 - The Snail

    题目大意:有一只蜗牛位于深一个深度为h米的井底,它白天向上爬u米,晚上向下滑d米,由于疲劳原因,蜗牛白天爬的高度会比上一天少f%(总是相对于第一天),如果白天爬的高度小于0,那么这天它就不再向上爬,问 ...

  5. ui主线程控件的更新就让这个activity的异步任务做完整

    项目中使用的SingleMessageView,控件实例化后,点击用户头像,此时跳转到UserInfo里查看这个用户的头像.用户名.签名.标签. 之前,师兄在SingleMessage里写了个头像的点 ...

  6. UVa 143 - Orchard Trees

    题目大意:果园里的树排列成矩阵,它们的x和y坐标均是1~99的整数.输入若干三角形,依次统计每一个三角形内部和边界上共有多少棵树. 三角形P0P1P2有向面积为A:2A = x0y1 + x2y0 + ...

  7. iOS 之 界面编程解析

    参考:http://www.cocoachina.com/design/20151225/14789.html 0. 内容概述 基础与本质:说明普遍意义上的UI系统的三大模块,让读者从整体上对UI系统 ...

  8. 大话设计模式--委托--IOS

    最近看了一些关于IOS委托的文章,看完之后,感觉不大好. 引文: 委托delegation是一种简单但是功能强大的设计模式,它的功能是程序中一个对象代表另一个对象,或者一个对象与另外一个对象协同工作. ...

  9. Eclipse和debug的一些快捷键

    F5单步调试进入函数内部.  F6单步调试不进入函数内部,如果装了金山词霸2006则要把“取词开关”的快捷键改成其他的.  F7由函数内部返回到调用处.  F8一直执行到下一个断点.  F11 这个好 ...

  10. C# 枚举的使用

    /// <summary>    /// 枚举的使用    /// 主要功能:使用枚举的值DataTypeId.Money,获取对应的Money字符串.    /// </summa ...