NiceLeeのBlog 用爱发电 bilibili~

一次Windows下FFmpeg的编译尝试

2020-02-06
nIceLee

阅读:


这几天一直捣鼓这个,configure/make了无数次,花了这么多功夫,总得记录一下。
以Win10 64位系统为例。

实现步骤

安装msys2

  • 建议去官网下载
  • 安装完毕之后,可以直接调用pacman安装其它所需的东西,不用再东一个西一个到处找了。
  • 假设安装路径D:\Work\msys64\

为pacman更换国内镜像源

  1. 打开D:\Work\msys64\etc\pacman.d\

  2. 编辑mirrorlist.mingw32,在文件开头添加:
    Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686
    Server = http://mirrors.ustc.edu.cn/msys2/mingw/i686
    
  3. 编辑mirrorlist.mingw64,在文件开头添加:
    Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64
    Server = http://mirrors.ustc.edu.cn/msys2/mingw/x86_64
    
  4. 编辑mirrorlist.msys,在文件开头添加:
    Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch
    Server = http://mirrors.ustc.edu.cn/msys2/msys/$arch
    
  5. 然后执行pacman -Sy刷新软件包数据即可。

安装前置环境

  • 运行D:\Work\msys64\msys2_shell.cmd,在弹出的shell窗口中执行
      pacman -S make yasm nasm diffutils pkg-config
      pacman -S gcc base-devel vim
      pacman -S mingw-w64-i686-gcc 
      pacman -S mingw-w64-x86_64-gcc 
      pacman -S mingw-w64-x86_64-toolchain
      pacman -S mingw-w64-i686-toolchain
    

MSYS2编译FFmpeg(以64位为例)

  • 写在前面:
    用Msys2生成的库有依赖,例如直接运行生成的static的ffmpeg.exe会报错。
    此时,依赖的库基本上位于
    D:\Work\msys64\mingw64\bin
    或
    D:\Work\msys64\mingw32\bin
    

    我在编译的时候试了一下,需要将libwinpthread-1.dll和ffmpeg.exe打包在一起才能正常运行。

  • 编译
    • 先打开cmd窗口
        cd D:\Work\msys64\
        msys2_shell.cmd -mingw64
      
    • 打开mingW32 shell后,cd 到ffmpeg所在目录
        ./configure --enable-static --disable-shared --disable-everything --enable-decoder=h264 --enable-parser=h264 --arch=x86_64
        make
        make install
      
    • 你可以在ffmpeg目录或者D:\Work\msys64\usr\local\bin\找到已经编译的东西

VS2015编译FFmpeg(以32位为例)

  • 写在前面
    • 假设电脑已经安装了Visual Studio
    • VS2015不需要,但是低版本的VS可能需要C99-to-C89 Converter & Wrapper,参见此处
  • 重命名link.exe
    • 将D:\Work\msys64\usr\bin\link.exe改名,防止和MSVC的link.exe抵触。
  • 设置环境变量
    • 系统环境变量Path添加3个位置:
        ## 第一个位置先找到VS安装位置,然后下面有很多路径,根据当前设备与目的设备的情况决定  
        ## D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\
        D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64_x86
      
        ## 第二个位置没啥好说的
        D:\Work\msys64\usr\bin\
      
        ## 第三个参数取决于mingW调用的是哪个窗口
        ## msys2_shell.cmd -mingw64 / mingw32
        D:\Work\msys64\mingw32\bin
      
  • 配置msys2_shell.cmd
    • 编辑D:\Work\msys64\msys2_shell.cmd
        在@echo off后面的第二行插入VC的配置脚本,插入哪一个取决于当前设备与目的设备的情况:
        rem call "D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat"
        call "D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64_x86\vcvarsamd64_x86.bat"
      
        找到set MSYS2_PATH_TYPE=inherit所在行,去掉注释rem
      
  • 在编译前的检查
    • 先打开cmd窗口
        cd D:\Work\msys64\
        msys2_shell.cmd -mingw32
      
    • 打开mingW32 shell后
        which cl link yasm cpp
        #显示如下内容
        /d/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/amd64_x86/cl
        /d/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/amd64_x86/link
        /usr/bin/yasm
        /mingw32/bin/cpp
      
    • 如果不符,请重启电脑试一试,可能环境变量尚未生效。
  • 编译
    • 先打开cmd窗口
        cd D:\Work\msys64\
        msys2_shell.cmd -mingw32
      
    • 打开mingW32 shell后,cd 到ffmpeg所在目录
        ./configure --toolchain=msvc --arch=x86_64 --enable-yasm --enable-asm --disable-debug --disable-doc --disable-ffplay --disable-ffprobe --enable-static --disable-shared --disable-everything --enable-decoder=h264 --enable-parser=h264
        make
        make install
      

可能的坑

很多都放到具体的步骤里面了,那些趟过的雷就不说了

  • 尝试不同工具编译前,先确保ffmpeg的目录是干净的,不要有上一款操作的残留
    • 在由msys2转为msvc时头铁浪费了很多时间,好气啊
  • msvc编译时,为了能够编译成功,需要注释掉cmdutils.c中CC_IDENT所在的行
  • 如果ffmpeg下载很慢,不妨尝试使用码云新建一个repo镜像,然后下载

参考


内容
隐藏