Windows平台下编译FFmpeg

最近一时兴起想整一下windows下面的FFmpeg编译,当然可以直接下载官方编译好的库,有个缺点就是官方的是默认的编译配置,所以如果我们想自定义配置ffmpeg的编译参数,还是得自己亲自来编译,官方提供三个版本的编译: 
- static:只有编译完成的exe程序; 
- shared:包含dll和exe; 
- dev: 包含头文件.h,lib和dll.a

先来几个参考网站,

1、官方编译网站

2、Microsoft官方实例

编译需要的原料:

1、FFmpeg源码 —————– 官方下载

2、MSYS2(编译环境) ————-MSYS2官方下载

3、YASM ————————官方下载地址

4、gas-preprocessor ————下载地址

 

安装msys2

msys2类似于cygwin(可以在windows上配置linux环境)和mingw(git的bash环境),安装完成之后,先需要把安装目录下的msys2_shell.cmd中注释掉的rem set MSYS2_PATH_TYPE=inherit,改成set MSYS2_PATH_TYPE=inherit,主要是将vs的环境继承给msys2;接着打开msys2的shell,安装4个编译工具,

 

pacman -S make gcc perl diffutils1


  如果之前安装了cygwin,这里的安装可能会出现冲突问题,导致cygwin的bash窗口中没法使用一些命令,如:ls等等,一般会报错:

 


1 [main] ls (138392) D:\msys64\usr\bin\ls.exe: *** fatal error - cygheap base mismatch detected - 0x180305408/0x1802FE408.
This problem is probably due to using incompatible versions of the cygwin DLL.
Search for cygwin1.dll using the Windows Start->Find/Search facility
and delete all but the most recent version.  The most recent version *should*
reside in x:\cygwin\bin, where 'x' is the drive on which you have
installed the cygwin distribution.  Rebooting is also suggested if you
are unable to find another cygwin DLL.1234567

这时候我们需要在我的电脑中改变一下环境变量,在Path中将D:\cygwin64\bin提到D:\msys64\usr\bin前面,没有的话可以先配置

 

替换yasm

将下载的yasm-**-win64.exe改成yasm.exe,替换msys安装目录x:\msys64\usr\bin\yasm.exe,可以做个备份把原来的改成yasm.bak

 

安装gas-preprocessor

将下载的gas-preprocessor.pl放到msys2安装目录下面x:\msys64\usr\bin\gas-preprocessor.pl

 

从VS的命令窗口重新启动msys2的bash窗口

这一步没有把握正确,编译很容易出错,例如cl is unable to create an executable file.正确的启动步骤是:先去打开VS的工具命令提示符,C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2015\Visual Studio Tools\Windows Desktop Command Prompts,然后在命名窗口中使用命令符打开msys2的bash窗口, 
我安装在D盘,依次执行命令如下:

 

D:
cd msys64
msys2_shell.cmd123

在bash窗口中先检查,安装环境是否已经正确配置:

 

$ which cl
/d/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/amd64_x86/cl

$ which link
/d/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/amd64_x86/link

$ which yasm
/usr/bin/yasm

$ which cpp
/usr/bin/cpp

$ which gas-preprocessor.pl
/usr/bin/gas-preprocessor.pl1234567891011121314

正确配置之后就可以进行编译了。

 

开始编译

编译ffmpeg,有两种方式,

 

微软官方Demo

可以按照微软官方的Demo教程来编译,先使用git下载,

 

git clone git://github.com/microsoft/FFmpegInterop.git
cd FFmpegInterop
git clone git://source.ffmpeg.org/ffmpeg.git123

下载完成之后,目录结构如下:

 

.
├── ARM
├── BuildFFmpeg.bat
├── Debug
├── FFmpegConfig.sh
├── FFmpegInterop
├── FFmpegInterop.pfx
├── FFmpegWin10.VC.db
├── FFmpegWin10.sln
├── FFmpegWin8.1.sln
├── LICENSE
├── README.md
├── Samples
├── Tests
├── UpgradeLog.htm
├── ffmpeg
└── ipch1234567891011121314151617

直接在bash窗口中进入,执行执行编译相应版本的命令就行了

 

BuildFFmpeg.bat win10                     - Build for Windows 10 ARM, x64, and x86
BuildFFmpeg.bat phone8.1 ARM              - Build for Windows Phone 8.1 ARM only
BuildFFmpeg.bat win8.1 x86 x64            - Build for Windows 8.1 x86 and x64 only
BuildFFmpeg.bat phone8.1 win10 ARM        - Build for Windows 10 and Windows Phone 8.1 ARM only
BuildFFmpeg.bat win8.1 phone8.1 win10     - Build all architecture for all target platform12345

 

手动编译

首先步骤是./configure配置编译参数,可以参考微软Demo中的脚本FFmpegConfig.sh,先进入下载的FFmepg源码目录, 
比如编译Win10的x64版本,

 

    ./configure \
        --toolchain=msvc \
        --disable-programs \
        --disable-d3d11va \
        --disable-dxva2 \
        --arch=x86_64 \
        --enable-shared \
        --enable-cross-compile \
        --target-os=win32 \
        --extra-cflags="-MD -DWINAPI_FAMILY=WINAPI_FAMILY_APP -D_WIN32_WINNT=0x0A00" \
        --extra-ldflags="-APPCONTAINER WindowsApp.lib" \
        --prefix=./Build/Windows10/x64
        make install12345678910111213

编译完成之后,ffmpeg的编译库就在Build/Windows10/x64目录下面,目录结构如下:

 

.
├── bin
│   ├── avcodec-57.dll
│   ├── avcodec.lib
│   ├── avdevice-57.dll
│   ├── avdevice.lib
│   ├── avfilter-6.dll
│   ├── avfilter.lib
│   ├── avformat-57.dll
│   ├── avformat.lib
│   ├── avutil-55.dll
│   ├── avutil.lib
│   ├── swresample-2.dll
│   ├── swresample.lib
│   ├── swscale-4.dll
│   └── swscale.lib
├── include
│   ├── libavcodec
│   ├── libavdevice
│   ├── libavfilter
│   ├── libavformat
│   ├── libavutil
│   ├── libswresample
│   └── libswscale
└── lib
    ├── avcodec-57.def
    ├── avdevice-57.def
    ├── avfilter-6.def
    ├── avformat-57.def
    ├── avutil-55.def
    ├── pkgconfig
    ├── swresample-2.def
    └── swscale-4.def

11 directories, 21 files1234567891011121314151617181920212223242526272829303132333435

手动编译,这里特别注意一下编译不同版本的configure脚本,不然会出现各种编译错误: 
比如: 
make: *** [cmdutils.o] Error 2 
make: *** [/c/ffmpeg/common.mak:60: cmdutils.o] Error 2 
…….. 
还有一些其他的错误,下面列出不同版本的基本的configure脚本:

win10 32位:  

 

./configure \
        --toolchain=msvc \
        --disable-programs \
        --disable-d3d11va \
        --disable-dxva2 \
        --arch=x86 \
        --enable-shared \
        --enable-cross-compile \
        --target-os=win32 \
        --extra-cflags="-MD -DWINAPI_FAMILY=WINAPI_FAMILY_APP -D_WIN32_WINNT=0x0A00" \
        --extra-ldflags="-APPCONTAINER WindowsApp.lib" \
        --prefix=../../../Build/Windows10/x86123456789101112

win10 64位:  

 

./configure \
        --toolchain=msvc \
        --disable-programs \
        --disable-d3d11va \
        --disable-dxva2 \
        --arch=x86_64 \
        --enable-shared \
        --enable-cross-compile \
        --target-os=win32 \
        --extra-cflags="-MD -DWINAPI_FAMILY=WINAPI_FAMILY_APP -D_WIN32_WINNT=0x0A00" \
        --extra-ldflags="-APPCONTAINER WindowsApp.lib" \
        --prefix=../../../Build/Windows10/x64123456789101112

win10 ARM:  

 

./configure \
        --toolchain=msvc \
        --disable-programs \
        --disable-d3d11va \
        --disable-dxva2 \
        --arch=arm \
        --as=armasm \
        --cpu=armv7 \
        --enable-thumb \
        --enable-shared \
        --enable-cross-compile \
        --target-os=win32 \
        --extra-cflags="-MD -DWINAPI_FAMILY=WINAPI_FAMILY_APP -D_WIN32_WINNT=0x0A00 -D__ARM_PCS_VFP" \
        --extra-ldflags="-APPCONTAINER WindowsApp.lib" \
        --prefix=../../../Build/Windows10/ARM123456789101112131415

win8.1 32位:  

 

./configure \
        --toolchain=msvc \
        --disable-programs \
        --disable-d3d11va \
        --disable-dxva2 \
        --arch=x86 \
        --enable-shared \
        --enable-cross-compile \
        --target-os=win32 \
        --extra-cflags="-MD -DWINAPI_FAMILY=WINAPI_FAMILY_PC_APP -D_WIN32_WINNT=0x0603" \
        --extra-ldflags="-APPCONTAINER" \
        --prefix=../../../Build/Windows8.1/x86123456789101112

win8.1 64位:  

 

./configure \
        --toolchain=msvc \
        --disable-programs \
        --disable-d3d11va \
        --disable-dxva2 \
        --arch=x86_64 \
        --enable-shared \
        --enable-cross-compile \
        --target-os=win32 \
        --extra-cflags="-MD -DWINAPI_FAMILY=WINAPI_FAMILY_PC_APP -D_WIN32_WINNT=0x0603" \
        --extra-ldflags="-APPCONTAINER" \
        --prefix=../../../Build/Windows8.1/x64123456789101112

win8.1 ARM:

 

./configure \
        --toolchain=msvc \
        --disable-programs \
        --disable-d3d11va \
        --disable-dxva2 \
        --arch=arm \
        --as=armasm \
        --cpu=armv7 \
        --enable-thumb \
        --enable-shared \
        --enable-cross-compile \
        --target-os=win32 \
        --extra-cflags="-MD -DWINAPI_FAMILY=WINAPI_FAMILY_PC_APP -D_WIN32_WINNT=0x0603 -D__ARM_PCS_VFP" \
        --extra-ldflags="-APPCONTAINER -MACHINE:ARM" \
        --prefix=../../../Build/Windows8.1/ARM123456789101112131415

phone 8.1 x86:

 

./configure \
        --toolchain=msvc \
        --disable-programs \
        --disable-d3d11va \
        --disable-dxva2 \
        --arch=x86 \
        --enable-shared \
        --enable-cross-compile \
        --target-os=win32 \
        --extra-cflags="-MD -DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP -D_WIN32_WINNT=0x0603" \
        --extra-ldflags="-APPCONTAINER -subsystem:console -opt:ref WindowsPhoneCore.lib RuntimeObject.lib PhoneAppModelHost.lib -NODEFAULTLIB:kernel32.lib -NODEFAULTLIB:ole32.lib" \
        --prefix=../../../Build/WindowsPhone8.1/x86123456789101112

phone 8.1 ARM:

 

./configure \
        --toolchain=msvc \
        --disable-programs \
        --disable-d3d11va \
        --disable-dxva2 \
        --arch=arm \
        --as=armasm \
        --cpu=armv7 \
        --enable-thumb \
        --enable-shared \
        --enable-cross-compile \
        --target-os=win32 \
        --extra-cflags="-MD -DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP -D_WIN32_WINNT=0x0603 -D__ARM_PCS_VFP" \
        --extra-ldflags="-APPCONTAINER -MACHINE:ARM -subsystem:console -opt:ref WindowsPhoneCore.lib RuntimeObject.lib PhoneAppModelHost.lib -NODEFAULTLIB:kernel32.lib -NODEFAULTLIB:ole32.lib" \
        --prefix=../../../Build/WindowsPhone8.1/ARM123456789101112131415

win7 32位:  

 

./configure \
        --toolchain=msvc \
        --disable-programs \
        --disable-d3d11va \
        --disable-dxva2 \
        --arch=x86 \
        --enable-shared \
        --enable-cross-compile \
        --target-os=win32 \
        --extra-cflags="-MD -D_WINDLL" \
        --extra-ldflags="-APPCONTAINER:NO -MACHINE:x86" \
        --prefix=../../../Build/Windows7/x86123456789101112

win7 64位:

 

./configure \
        --toolchain=msvc \
        --disable-programs \
        --disable-d3d11va \
        --disable-dxva2 \
        --arch=amd64 \
        --enable-shared \
        --enable-cross-compile \
        --target-os=win32 \
        --extra-cflags="-MD -D_WINDLL" \
        --extra-ldflags="-APPCONTAINER:NO -MACHINE:x64" \
        --prefix=../../../Build/Windows7/x64123456789101112

还有会遇到下面的错误:

 

Could not create temporary library1

解决办法: 
清除之前编译的缓存,重新编译,

 

make clean
make distclean
ls -l */*.o   //检查是否有
--------------------- 
作者:斑图不巫 
来源:CSDN 
原文:https://blog.csdn.net/danjuan123/article/details/65444054 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值