ffmpeg windows编译 + Linux交叉编译(含x264)
本文记录了ffmpeg在windows以及linux上编译生成可执行库的方法。
序言
本文记录了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
- 打开程序:MSYS2 MINGW64,可以从搜索栏直接搜索,也可以从mysy2安装目录中找到.
- 输入pacman -Syu并执行,如果碰到选择Y/N,全部选Y。执行完成后关闭窗口。
- 重复 步骤2 ,直至出现*****nothing to do****的字样

- 更新编译所需的依赖库
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 进入源码目录
这里有个概念,编译动态库还是静态库。
静态库:
- 一般以 .a 或者 .lib结尾
- 使用时是直接编译进程序exe中的,所以软件会变大
- 运行时不需要库文件。
- 相比于动态库来说,在启动软件时会快一些,因为少了加载库的动作
- 所依赖的库也必须为静态编译,否则还需要带着依赖库的dll
动态库
- 一般以 .so 或者 .lib 或者.so后跟版本号
- 程序编译时其实只是引用,等运行时再加载库
- 编译出来的程序相较于静态库链接比较小
- 可以只更新库文件而不动应用程序
编译
我尝试了静态库和动态库两种编译方法,均成功了。
但是静态库有个问题,所依赖的库也需要是静态编译,否则就失去了静态库的意义,而我有点懒得搞了。就没再搞,如果有兴趣的可以尝试着搞一下。
下面的命令均是在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"
配置解析
- 具体的配置参考windows那里的解析
- 不同的是,这里需要指定 cc、gcc、sysroot、extra-cflags、extra-ldflags、pkg-config。
- 可能会报错找不到x264,可以按下面的方向进行排查:
A)如果编译的是静态库,需要修改:–pkg-config=“pkg-config --static”
B)如果编译的是动态库,且x264也是静态库,在没加 --pkg-config="pkg-config"的情况下,也有可能报错。
编译及安装
make &&make install
最后
编译的过程十分痛苦,会碰到各种奇怪问题,要耐心解决。
当然,如果你嫌麻烦,也可以直接下载我编译好的ffmpeg7.1.1的库,里面包含了windows和linux的相关内容。
链接:资源下载
更多推荐
所有评论(0)