序言

本文记录了FFmpeg的windows编译、linux交叉编译(含x264)过程。
先编译成功后才记录的文章,所有有些报错并没有体现出来,如果你遇到了可以贴出来,如果我也碰到过那么可以帮忙解答。

准备工作

下载FFmpeg

官网地址:https://www.ffmpeg.org/
在这里插入图片描述
点击后,跳转到下个界面,然后直接下载就可以
在这里插入图片描述

下载MSYS2

官网地址:https://www.msys2.org/
在这里插入图片描述
直接下载,然后安装即可。

下载libx264

官网链接:https://www.videolan.org/developers/x264.html

这个下载好是源码,等下交叉编译时会用到。

编译环境说明

windows:windows11
ffmpeg:ffmpeg7.1.1
ubuntu:
Linux ubuntu 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
交叉编译链:
arago-2021.09-aarch64-linux-tisdk
交叉编译目标板Linux信息:
Linux 5.10.87 aarch64

windows编译

在windows下编译,要使用到刚才下载的msys2。

更新MSYS2

  1. 打开程序:MSYS2 MINGW64,可以从搜索栏直接搜索,也可以从mysy2安装目录中找到.
  2. 输入pacman -Syu并执行,如果碰到选择Y/N,全部选Y。执行完成后关闭窗口。
  3. 重复 步骤2 ,直至出现*****nothing to do****的字样在这里插入图片描述
  4. 更新编译所需的依赖库
  pacman -S \
  mingw-w64-x86_64-gcc \
  mingw-w64-x86_64-pkg-config \
  mingw-w64-x86_64-make \
  mingw-w64-x86_64-nasm \
  mingw-w64-x86_64-yasm \
  mingw-w64-x86_64-SDL2 \
  mingw-w64-x86_64-x264 \
  mingw-w64-x86_64-x265 \
  mingw-w64-x86_64-fdk-aac \
  mingw-w64-x86_64-lame \
  mingw-w64-x86_64-opus \
  mingw-w64-x86_64-libvpx \
  mingw-w64-x86_64-libvorbis \
  mingw-w64-x86_64-libtheora \
  mingw-w64-x86_64-libwebp \
  mingw-w64-x86_64-ffnvcodec-headers \
  mingw-w64-x86_64-zlib \
  mingw-w64-x86_64-openssl \
  mingw-w64-x86_64-libjpeg-turbo \
  mingw-w64-x86_64-libpng \
  mingw-w64-x86_64-libxml2 \
  git

我在这里遇到一个问题:

:: mingw-w64-x86_64-pkg-config-0.29.2-6 and mingw-w64-x86_64-pkgconf-1~2.3.0-1 are in conflict. 
Remove mingw-w64-x86_64-pkgconf? [Y/n] Y
error: failed to prepare transaction (could not satisfy dependencies)
:: removing mingw-w64-x86_64-pkgconf breaks dependency 'mingw-w64-x86_64-pkgconf' required by mingw-w64-x86_64-cmake

说明我这台电脑上是存在mingw-w64-x86_64-cmake并且它依赖pkgconf,此时应该去掉
mingw-w64-x86_64-pkg-config
然后重新执行

编译FFmpeg

前提:刚才下载的源码进行解压,然后让msys2 进入源码目录
这里有个概念,编译动态库还是静态库。

静态库:
  1. 一般以 .a 或者 .lib结尾
  2. 使用时是直接编译进程序exe中的,所以软件会变大
  3. 运行时不需要库文件。
  4. 相比于动态库来说,在启动软件时会快一些,因为少了加载库的动作
  5. 所依赖的库也必须为静态编译,否则还需要带着依赖库的dll
动态库
  1. 一般以 .so 或者 .lib 或者.so后跟版本号
  2. 程序编译时其实只是引用,等运行时再加载库
  3. 编译出来的程序相较于静态库链接比较小
  4. 可以只更新库文件而不动应用程序
编译

我尝试了静态库和动态库两种编译方法,均成功了。
但是静态库有个问题,所依赖的库也需要是静态编译,否则就失去了静态库的意义,而我有点懒得搞了。就没再搞,如果有兴趣的可以尝试着搞一下。

下面的命令均是在MSYS2 MINGW64上执行的,且所处目录为ffmpeg的源码目录!!!!!

配置静态库
./configure  
 --prefix=D:/ffmpeg7.1.1_build   
--target-os=mingw32   
--arch=x86_64   
--enable-gpl   
--enable-version3  
 --enable-nonfree   
--enable-static   
--disable-shared   
--enable-libx264   
--enable-libx265   
--enable-libvpx   
--enable-libvorbis   
--enable-libtheora   
--enable-libwebp   
--enable-libopus   
--enable-libfdk-aac   
--enable-libmp3lame   
--enable-libxml2   
--enable-openssl   
--enable-ffnvcodec   
--enable-sdl2   
--enable-swresample   
--enable-swscale   
--extra-cflags="-static"   
--extra-ldflags="-static" 
--pkg-config-flags="-static"

配置动态库

与动态库不同,这里指明了AR NM RANLIB STRIP,想尝试的可以不指明试一下,看会不会有惊喜。

AR=x86_64-w64-mingw32-gcc-ar \
NM=x86_64-w64-mingw32-gcc-nm \
RANLIB=x86_64-w64-mingw32-gcc-ranlib \
STRIP=strip \
./configure \
  --prefix=D:/ffmpeg7.1.1_build \
  --target-os=mingw32 \
  --arch=x86_64 \
  --enable-shared \
  --disable-static \
  --enable-gpl \
  --enable-version3 \
  --enable-nonfree \
  --enable-libx264 \
  --enable-libx265 \
  --enable-libvpx \
  --enable-libvorbis \
  --enable-libtheora \
  --enable-libwebp \
  --enable-libopus \
  --enable-libfdk-aac \
  --enable-libmp3lame \
  --enable-libxml2 \
  --enable-openssl \
  --enable-ffnvcodec \
  --enable-sdl2 \
  --enable-swresample \
  --enable-swscale

如果此处指明的AR等一直没生效,可以修改
ffmpeg-7.1.1\compat\windows\makedef 文件,在文件开始处进行声明。如图:
在这里插入图片描述

部分配置解释:

这里拿静态库配置举例,具体的可以执行 ./configure --help自行查看。

--prefix=D:/ffmpeg7.1.1_build      指明安装路径
--target-os=mingw32     指明运行平台为windows
--arch=x86_64     指明架构
--enable-gpl      使用GPL许可证模块(x264、x265等)
--enable-version3  启用某些受 LGPLv3 授权的库(libopencore-amr等)
 --enable-nonfree   启用一些 非自由软件许可的库
--enable-static   编译静态库
--disable-shared   禁用动态库
--enable-libx264   启用H.264编码
--enable-libx265   启用H.265编码
--enable-libvpx     启用VP8/VP9 编码
--enable-libvorbis   启用Ogg Vorbis 音频编码
--enable-libtheora   启用Theora 视频编码
--enable-libwebp  启用WebP 图片格式
--enable-libopus   启用Opus 音频编码
--enable-libfdk-aac   启用高质量 AAC 编码(非自由)
--enable-libmp3lame   启用MP3 编码
--enable-libxml2    启用XML 处理库
--enable-openssl   启用HTTPS 和加密功能支持
--enable-ffnvcodec   启用NVIDIA 硬件加速解码支持
--enable-sdl2   启用 SDL2
--enable-swresample   启用音频重采样(采样率/格式转换)
--enable-swscale   启用视频缩放/像素格式转换
--extra-cflags="-static"   静态链接
--extra-ldflags="-static"  静态链接
--pkg-config-flags="-static"  使用静态库
编译及安装

这个没啥说的,配置没问题直接编译安装就行
分别执行两条命令即可

make -j$(nproc)
make install

windows编译总结

主要是mysy2的依赖库更新以及make ffmpeg时会有问题,尤其静态库那里,耗时极长。

交叉编译FFmpeg及X264

首先:把下载的ffmpeg和x264源码移植ubuntu中,不要放在共享目录里面!不要放在共享目录里面!不要放在共享目录里面!
其次:确认交叉编译链已经生效!!!!
最后: 解压这两个包,然后操作看下文
槽点:在编译静态ffmpeg时,碰到一些问题,比如必须要指明x264,或者x264编译时必须使能pic,懒得再去弄,所以直接放弃。
故这里只有交叉编译动态库的方法
疑问:指定了prefix但还是安装在了交叉编译工具链的fs/opt里面,而不是根目录的/opt里面。有大神看到可以帮忙解答一下

交叉编译x264

进入x264目录并创建编译文件夹
cd x264-master
mkdir build
进行配置
./configure \
--prefix=/opt/x264-master/build \
--enable-shared \
--disable-static \
--enable-pic \
--host=aarch64-linux \
--cross-prefix=aarch64-none-linux-gnu- \
--disable-opencl \
--disable-asm
编译及安装
make -j4
make install

交叉编译FFmpeg

进入解压后的ffmpeg路径

配置x264的路径
export PKG_CONFIG_PATH=/home/forlinx/6254/OK6254-linux-sdk/OK6254-linux-fs/rootfs/opt/x264-master/build/lib/pkgconfig

把后面的路径换成自己编译的X264中pkgconfig路径
最好验证一下,正常应该会输出上面的路径

pkg-config --libs x264
配置ffmpeg
./configure \
--prefix=/opt/ffmpeg-7.1.1/build \
--target-os=linux \
--arch=aarch64 \
--cross-prefix=aarch64-none-linux-gnu- \
--enable-cross-compile \
--cc=aarch64-none-linux-gnu-gcc \
--cxx=aarch64-none-linux-gnu-g++ \
--sysroot=/home/forlinx/6254/OK6254-linux-sdk/OK6254-linux-fs/rootfs \
--disable-static \
--enable-shared \
--enable-gpl \
--enable-version3 \
--enable-nonfree \
--enable-libx264 \
--disable-asm \
--enable-swresample \
--enable-swscale \
--disable-debug \
--enable-ffmpeg \
--disable-stripping \
--disable-doc \
--extra-cflags="-I/home/forlinx/6254/OK6254-linux-sdk/OK6254-linux-fs/rootfs/opt/x264-master/build/include" \
--extra-ldflags="-L/home/forlinx/6254/OK6254-linux-sdk/OK6254-linux-fs/rootfs/opt/x264-master/build/lib" \
--pkg-config="pkg-config"
配置解析
  1. 具体的配置参考windows那里的解析
  2. 不同的是,这里需要指定 cc、gcc、sysroot、extra-cflags、extra-ldflags、pkg-config。
  3. 可能会报错找不到x264,可以按下面的方向进行排查:
    A)如果编译的是静态库,需要修改:–pkg-config=“pkg-config --static”
    B)如果编译的是动态库,且x264也是静态库,在没加 --pkg-config="pkg-config"的情况下,也有可能报错。
编译及安装
make &&make install

最后

编译的过程十分痛苦,会碰到各种奇怪问题,要耐心解决。
当然,如果你嫌麻烦,也可以直接下载我编译好的ffmpeg7.1.1的库,里面包含了windows和linux的相关内容。
链接:资源下载

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐