ffmpeg在不同平台交叉编译windows版sdk(64bit)

ffmpeg在不同平台交叉编译windows版sdk(64bit)

  • 关于ffmpeg在windows下的编译,官方有这篇说明http://www.ffmpeg.org/platform.html#toc-Windows
  • 建议先阅读一下,美中不足的是官方说的太简陋,只是提供了一个编译的方向,至于编译细节就需要自己摸索了
  • 本文也正是在摸索过程中的总结,我们的最终目标都是要windows版的64位sdk,但我们可以在windows平台编译,也可以在linux平台交叉编译,本文就是记录这两种方式的编译过程,希望能帮到一些在编译过程中茫茫无措的你

注意

  • 在编译过程中请仔细查看控制台打印的日志,特别是警告,configure在检测环境时会根据编译环境修改你的配置,比如你打开了硬件加速开关,但configure检测到本地环境不适合,比如找不到相应的头文件,那么会自动帮你关闭硬件加速,这时会在控制台打印一行日志提醒你,比如

    WARNING: Disabled hevc_dxva2_hwaccel because not all dependencies are satisfied: dxva2 DXVA_PicParams_HEVC
    WARNING: Disabled h264_dxva2_hwaccel because not all dependencies are satisfied: dxva2
    

在windows平台编译windows版sdk

搭建编译环境

安装mingw-w64
  • windows下载并安装mingw-w64(http://mingw-w64.org/doku.php/download/mingw-builds)
  • 安装时架构选x86_64,线程选win32,其他默认即可
  • 安装完成后在环境变量可以看到多了MINGW_HOME(没有就新建),我们需要将“%MINGW_HOME%/bin”配置进Path环境变量
安装msys2
  • windows下载msys2并安装(https://www.msys2.org/

  • 安装完msys2后先不要着急打开,因为msys2默认下载东西是非常慢的,因此需要增加国内镜像路径,具体做法如下

  • 在安装目录的etc\pacman.d目录下找到如下三个文件,打开后增加如下行,记得要放在首行

    # mirrorlist.mingw64
    Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64
    Server = http://mirrors.ustc.edu.cn/msys2/mingw/x86_64
    
    # mirrorlist.mingw32
    Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686
    Server = http://mirrors.ustc.edu.cn/msys2/mingw/i686
    
    # mirrorlist.msys
    Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch
    Server = http://mirrors.ustc.edu.cn/msys2/msys/$arch
    
  • 在mysys2安装目录找到mingw64.exe打开

  • 执行如下命令安装一些编译环境及工具

    # s刷新软件包数据
    pacman -Sy 
    
    # normal msys2 packages
    pacman -S vim make pkg-config diffutils
    
    # mingw-w64 packages and toolchains
    pacman -S mingw-w64-x86_64-nasm mingw-w64-x86_64-gcc mingw-w64-x86_64-SDL2
    
  • 其中mingw-w64-x86_64-SDL2目前是不需要的,因为我们编译的目标是库,也不打算使用ffplay,因此这个可以不安装

  • 安装执行完毕后我们可以看到mysy2安装目录下的mingw64增加了一些文件,在mingw64/bin目录里就存放了我们编译过程中需要的东西,而我们编译后如果依赖了一些动态库,基本上都可以在这里找到(比如libiconv-2.dll,不过放心,这种依赖可以避免的,在后面会讲到)

下载ffmpeg源码
  • 将ffmpeg下载下来(我当时的最新版是4.2),以下命令会下载最新版到ffmpeg目录,其他下载方式也行,只要能把源码下载到即可
    git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
    
  • 下载后到ffmpeg目录执行以下命令,这样就会生成一些mak文件,否则会报找不到这些文件的错误
    ./configure
    或
    ./configure --disable-x86asm
    

编译

  • 环境搭建好了之后,就可以开始编写编译脚本了

  • 我们先在ffmpeg目录创建build目录作为我们的编译目录,编译脚本和编译目标之后都会放在这个目录下

  • 在build目录下新建build_wins_sdk.sh并增加可执行权限,内容如下:

    
    #!/bin/bash
    echo "Beginning Make ..."
    rm -r dist_wins_dll
    mkdir -p  dist_wins_dll
    cd ../
    make clean
    echo "configure ..."
    ./configure --prefix=$(pwd)/build/dist_wins_dll \
    --enable-gpl --enable-version3 \
    --enable-shared \
    --disable-programs --disable-ffmpeg --disable-ffplay --disable-ffprobe \
    --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages \
    --disable-asm --disable-sdl2 --disable-iconv --disable-schannel --disable-zlib \
    --disable-avdevice --disable-postproc --disable-avfilter \
    --disable-everything --enable-protocol=file --enable-demuxer=mov --enable-demuxer=flv --enable-decoder=h264 --enable-decoder=hevc --enable-hwaccel=hevc_dxva2 --enable-hwaccel=h264_dxva2
    echo "make ..."
    make -j4
    echo "make install ..."
    make install
    echo "Make Finishing"
    
    
  • 以上配置仅供参考(每个人都需要根据自己的需求去更改),更多配置需要参考configure文件里的说明,我这里只是开启了h264和hevc解码器以及他们的硬件加速而已

  • 之后就可以打开mingw64.exe并切换到脚本目录后执行这个脚本

  • 当执行到./configure命令后,在控制台我们是可以看到类似如下输出,这里记录了编译时的各项参数设置,想知道你的configure配置是否合乎你的要求,可以在这里检查一下,比如External libraries这个就列出了依赖的外部库,如果说编译出的dll会依赖libiconv.dll这些额外的动态库导致报错,那么在这里就会显示iconv,要去除这个依赖,需要我们在configure上增加–disable-iconv

    install prefix            /f/software/ffmpeg/ffmpeg-4.2.2/build/dist_wins_dll
    source path               .
    C compiler                gcc
    C library                 mingw64
    ARCH                      c (generic)
    big-endian                no
    runtime cpu detection     yes
    debug symbols             yes
    strip symbols             yes
    optimize for size         no
    optimizations             yes
    static                    no
    shared                    yes
    postprocessing support    no
    network support           no
    threading support         w32threads
    safe bitstream reader     yes
    texi2html enabled         no
    perl enabled              no
    pod2man enabled           no
    makeinfo enabled          no
    makeinfo supports HTML    no
    
    External libraries:
    
    External libraries providing hardware acceleration:
    d3d11va                 dxva2
    
    Libraries:
    avcodec                 avutil                  swscale
    
    Programs:
    
    Enabled decoders:
    h264                    hevc
    
    Enabled encoders:
    
    Enabled hwaccels:
    h264_dxva2              hevc_dxva2
    
    Enabled parsers:
    
    Enabled demuxers:
    
    Enabled muxers:
    
    Enabled protocols:
    
    Enabled filters:
    
    Enabled bsfs:
    null
    
    Enabled indevs:
    
    Enabled outdevs:
    
    License: GPL version 3 or later
    
    
  • 如果正常编译成功,那么我们就可以在dist_wins_dll目录中看到生成四个文件夹,如下图,在bin目录里就是我们需要的dll
    在这里插入图片描述

在linux平台交叉编译windows版sdk

搭建mingw-w64环境

  • 在linux平台交叉编译windows的话我们需要在linux平台搭建mingw64环境

  • 网上已有大神写了一个脚本帮我们搭建此环境,地址在https://github.com/Zeranoe/mingw-w64-build

  • 这个脚本下载下来后运行

    ./mingw-w64-build x86_64
    
  • 脚本就会帮我们下载mingw64,不过可能要科学上网才行,不然下载速度堪忧

  • 在脚本运行过程中可能会提示一些工具需要安装,你就安装它的要求把工具装好

  • 脚本正常执行后,我们可以看到多了x86_64-w64-mingw32目录,我们接着需要设置下环境变量

export PATH="$PATH:/your_install_dir/mingw-w64-build/x86_64-w64-mingw32/bin"
  • 注意以上配置路径要修改为你自己的路径,不要照抄哈
  • 这种是临时性的环境变量,机器重启后要使用的话还得重新执行一下

编译

  • 在linux交叉编译windows需要开启交叉编译选项–enable-cross-compile,同时必须设置–arch和–target_os,还有–cross-prefix(交叉编译工具链的前缀,注意最后要有横线)

  • 由于我们需要64位的,因此可以配置

    • –arch=x86_64
    • –target_os=mingw32-w64
    • –cross-prefix=x86_64-w64-mingw32-
  • 这样在编译时configure会根据–cross-prefix的值加上–cc设置的值(默认是gcc),凑成x86_64-w64-mingw32-gcc去交叉编译,这也解释了我们为何要配置环境变量,x86_64-w64-mingw32-gcc这个东西就放置在我们搭建的mingw-w64的bin目录下,如果我们不配置环境变量,系统自然找不到x86_64-w64-mingw32-gcc这个家伙

  • 以下列出了一个参考脚本,这个脚本只开启了h264和hevc以及硬解(这里之所以能开启硬解是因为mingw里包含了dxva2api.h)等,实际上你肯定要根据自己的需求更改configure的参数

    #!/bin/bash
    echo "Beginning Make ..."
    rm -r dist_wins_dll
    mkdir -p  dist_wins_dll
    cd ffmpeg
    make clean
    echo "configure ..."
    ./configure --prefix=$(pwd)/../dist_wins_dll \
    --enable-cross-compile --arch=x86_64 --target-os=mingw32-w64 --cross-prefix=x86_64-w64-mingw32- \
    --enable-gpl --enable-version3 --enable-runtime-cpudetect \
    --enable-shared \
    --disable-programs --disable-ffmpeg --disable-ffplay --disable-ffprobe \
    --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages \
    --disable-asm --disable-sdl2 --disable-iconv --disable-schannel --disable-zlib \
    --disable-avdevice --disable-postproc --disable-avfilter \
    --disable-everything --enable-protocol=file --enable-demuxer=mov --enable-demuxer=flv --enable-decoder=h264 --enable-decoder=hevc --enable-hwaccel=hevc_dxva2 --enable-hwaccel=h264_dxva2
    echo "make ..."
    make -j4
    echo "make install ..."
    make install
    echo "Make Finishing"
    
  • 以上脚本执行后正常的话你就可以看到生成了dist_wins_dll目录,里面就是我们需要的动态库以及头文件,可以愉快地拿去二次开发了

  • 在这里插入图片描述

问题

我编译出的dll一使用就会报libiconv-2.dll或zlib1.dll或其他dll找不到的错误,这个怎么解决?

  • 这个一般都是依赖了外部库导致的,在执行到./configure命令时控制台会打印配置信息,我们可以观察控制台看看"External libraries:"这一行打印了什么,假如打印了iconv,那么就表示依赖iconv这个库,那么我们只要在在configure时加上–disable-iconv即可,zlib也如此
  • 或者我们在mingw64的bin目录下找到依赖的这两个库的dll,拷贝过来后也是可以运行的

参考

(4条消息)编译库的方法(基于MSYS2与MinGW-w64)(零)——安装MSYS2与MinGW-w64_运维_图像学习之旅-CSDN博客
https://blog.csdn.net/qq_35789421/article/details/99740382

基于Ubuntu交叉编译X264, FFmpeg Windows SDK详细教程 - haibindev - 博客园
https://www.cnblogs.com/haibindev/archive/2011/12/01/2270126.html

(4条消息)Ubuntu+Mingw64编译WIN32版本的FFMPEG_运维_u010311952的专栏-CSDN博客
https://blog.csdn.net/u010311952/article/details/80658999

Msys2 | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
https://mirror.tuna.tsinghua.edu.cn/help/msys2/

(1条消息)MSYS2镜像源_网络_ELF Project-CSDN博客
https://blog.csdn.net/pkgfs/article/details/50410271

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
FFmpeg是一个开源的音视频处理库,而OpenCV是一个开源的计算机视觉库。它们可以通过交叉编译的方式进行整合,以实现音视频处理和计算机视觉的功能。 下面是一种常见的方法来将FFmpeg和OpenCV进行交叉编译: 1. 配置交叉编译环境:首先,你需要配置好交叉编译环境,包括交叉编译工具链和相关的库文件。这些工具链和库文件需要根据你的目标平台来选择和配置。 2. 下载和编译FFmpeg:从FFmpeg官方网站下载最新的源代码,并解压到本地。然后,在终端中进入FFmpeg源代码目录,执行以下命令进行交叉编译: ``` ./configure --prefix=<安装路径> --enable-shared --disable-static --cross-prefix=<交叉编译工具链前缀> --target-os=<目标操作系统> --arch=<目标架构> --extra-cflags="-I<交叉编译工具链头文件路径>" --extra-ldflags="-L<交叉编译工具链库文件路径>" make make install ``` 这些命令将会配置、编译和安装FFmpeg库到指定的安装路径。 3. 下载和编译OpenCV:从OpenCV官方网站下载最新的源代码,并解压到本地。然后,在终端中进入OpenCV源代码目录,执行以下命令进行交叉编译: ``` mkdir build cd build cmake -DCMAKE_TOOLCHAIN_FILE=<交叉编译工具链文件> -DCMAKE_INSTALL_PREFIX=<安装路径> .. make make install ``` 这些命令将会配置、编译和安装OpenCV库到指定的安装路径。 4. 链接FFmpeg和OpenCV:在你的项目中,你可以使用FFmpeg和OpenCV的头文件和库文件来进行开发。在编译时,需要指定FFmpeg和OpenCV的头文件路径和库文件路径,并链接对应的库文件。 以上是一种常见的方法来将FFmpeg和OpenCV进行交叉编译。具体的配置和编译过程可能会因为不同平台和工具链而有所差异,请根据你的实际情况进行相应的调整。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值