ffmpeg编译笔记:ubuntu18.04下使用mingw交叉编译ffmpeg5.1 x86与64,用于windows使用

一、前言

本篇描述了ffmpeg5.1在ubuntu18.04上的交叉编译经验。用mingw编译后的库支持h264,h265软硬解码,支持https,支持SDL。本篇同时描述openssl在ffmpeg中的编译经验,以及提供ffmpeg编译和openssl编译的32位和64位的配置命令。

二、相关下载

2.1 ubuntu官网下载地址:

http://mirrors.aliyun.com/ubuntu-releases/18.04/

百度网盘下载地址:链接:https://pan.baidu.com/s/1viDEUwy60dJ53hsXEinwgA?pwd=9091
提取码:9091

2.2 如果不想修改ffmpeg源码重新编译ffmpeg的话,也可以直接从网上编译好的ffmpeg库版本进行下载,下载路径为:

https://sourceforge.net/projects/avbuild/files/windows-desktop/

2.3 ffmpeg源码下载路径:

官网:http://ffmpeg.org/download.html#releases ,我选择的是ffmpeg-5.1.3版本

三、在ubuntu18.04上安装mingw64环境:

3.1 安装mingw-w64命令:

sudo apt-get update
sudo apt-get install mingw-w64
执行完成后在/usr/bin/下可以找到:
i686-w64-mingw32-
编译器前缀将在64位系统上构建32位应用程序
x86_64-w64-mingw32-
编译器前缀将在64位系统上构建64位应用程序

3.2 安装mingw-w64-tools命令:

sudo apt-get install mingw-w64-tools

四、openssl编译,包含x86与64

4.1 下载

可以直接下载我的openssl-3.0打包文件, 路径在:链接:https://pan.baidu.com/s/1STFKxszLiIwIMDG-pdMFVw?pwd=9091
提取码:9091

或者官网下载路径:https://www.openssl.org/source/snapshot/,我选择openssl-3.0-SNAP-20220809.tar.gz版本

4.2 配置命令:

4.2.1 64位配置命令:

./Configure no-asm no-shared --prefix=/home/yibin/ffmpeg/build/openssl-build --cross-compile-prefix=x86_64-w64-mingw32- mingw64

4.2.2 32位配置命令:

./Configure no-asm no-shared --prefix=/home/yibin/ffmpeg/build/openssl-build-x86 --cross-compile-prefix=i686-w64-mingw32- mingw

扫描二维码关注公众号,回复: 16151222 查看本文章

4.3 编译命令:

4.3.1 可以清理下上次编译后遗留内容, 执行命令:

make clean

4.3.2 编译执行命令:

make

4.3.3 编译安装执行命令:

make install

4.4 环境变量设置:

4.4.1 临时设置:

32位:

export LDFLAGS="-L/home/yibin/ffmpeg/build/openssl-build-x86/lib"
export CPPFLAGS="-I/home/yibin/ffmpeg/build/openssl-build-x86/include"

64位:


export LDFLAGS="-L/home/yibin/ffmpeg/build/openssl-build/lib64"
export CPPFLAGS="-I/home/yibin/ffmpeg/build/openssl-build/include"
4.4.2 设置环境变量,编辑/etc/profile文件,末尾添加

32位:

export OPENSSL_ROOT=/home/yibin/ffmpeg/build/openssl-build-x86
#运行依赖
export OPENSSL_CONF=$OPENSSL_ROOT/ssl/openssl.cnf
export LD_LIBRARY_PATH=$OPENSSL_ROOT/lib:$LD_LIBRARY_PATH
#开发依赖
export PATH=$OPENSSL_ROOT/bin:$PATH
export CPATH=$OPENSSL_ROOT/include:$CPATH
export LIBRARY_PATH=$OPENSSL_ROOT/lib:$LIBRARY_PATH
export PKG_CONFIG_PATH=$OPENSSL_ROOT/lib/pkgconfig:$PKG_CONFIG_PATH

64位:

export OPENSSL_ROOT=/home/yibin/ffmpeg/build/openssl-build
#运行依赖
export OPENSSL_CONF=$OPENSSL_ROOT/ssl/openssl.cnf
export LD_LIBRARY_PATH=$OPENSSL_ROOT/lib64:$LD_LIBRARY_PATH
#开发依赖
export PATH=$OPENSSL_ROOT/bin:$PATH
export CPATH=$OPENSSL_ROOT/include:$CPATH
export LIBRARY_PATH=$OPENSSL_ROOT/lib64:$LIBRARY_PATH
export PKG_CONFIG_PATH=$OPENSSL_ROOT/lib64/pkgconfig:$PKG_CONFIG_PATH

五、SDL库下载

下载地址:
访问官网:https://github.com/libsdl-org/SDL/releases/tag/release-2.26.3
或者
链接:https://pan.baidu.com/s/1p-fmOO5rOo9ZMcOCbAVcOA?pwd=9091
提取码:9091

六.编译 ffmpeg 支持openssl 支持sdl 支持dxva2硬解:

6.1 ubuntu选择18.04原因是:

ubuntu17.02以下的版本只能支持h264的dxva2,不能支持h265的dxva2,需要安装这个版本以上才能支持。

在这里插入图片描述
(注意:ubuntu下不要使用rar进行打包,会导致工程编译不正常,尽量使用tar进行打包)

6.2 可以直接下载我修改过的ffmpeg-5.1版本,下载地址为:

链接:https://pan.baidu.com/s/1dIb0PgrIsZ5O-Xp08zNiZw?pwd=9091
提取码:9091

该版本主要修改了:

  1. http-flv (支持了h265)
  2. 音频支持alaw 支持mp4录制pcm音频
  3. 语音对讲的处理

6.3.问题定位处理:

6.3.1 查看静态库中函数

nm libcrypt32.a | grep ’ T ’

U代表是被调用

6.3.2 undefined reference to `_imp__CertCloseStore@8’

查最前面的问题,一般是库没链接或者链接顺序有问题

6.4 配置命令

6.4.1 32位配置命令:

./configure --enable-static --enable-shared --enable-version3 --enable-gpl --enable-asm --enable-nonfree --enable-openssl --enable-protocols --enable-protocol=https --extra-cflags=“-I/home/yibin/ffmpeg/build/openssl-build-x86/include/openssl” --extra-ldflags=‘-static-libgcc’ --extra-ldflags=“-L/home/yibin/ffmpeg/build/openssl-build-x86/lib” --disable-pthreads --enable-w32threads --enable-cross-compile --target-os=mingw32 --arch=x86 --enable-small --prefix=/home/yibin/ffmpeg/build/ffmpeg-build-x86 --extra-version=avbuild --disable-doc --enable-runtime-cpudetect --disable-ptx-compression --enable-mediafoundation --disable-vulkan --disable-postproc --disable-htmlpages --cross-prefix=i686-w64-mingw32- --disable-indevs --disable-outdevs --disable-debug --disable-filter=scale_cuda --enable-ffplay --extra-libs=-lSDL2 --enable-hwaccels --enable-dxva2 --extra-cflags=“-I/home/yibin/ffmpeg/SDL2-2.26.3/i686-w64-mingw32/include/SDL2” --extra-ldflags=“-L/home/yibin/ffmpeg/SDL2-2.26.3/i686-w64-mingw32/lib”

6.4.2 64位配置命令:

./configure --enable-static --enable-shared --enable-version3 --enable-gpl --enable-asm --enable-nonfree --enable-openssl --enable-protocols --extra-ldflags=‘-static-libgcc’ --enable-protocol=https --extra-cflags=“-I/home/yibin/ffmpeg/build/openssl-build/include/openssl” --extra-ldflags=“-L/home/yibin/ffmpeg/build/openssl-build/lib64” --disable-pthreads --enable-w32threads --enable-cross-compile --target-os=mingw32-w64 --arch=x86_64 --enable-small --prefix=/home/yibin/ffmpeg/build/ffmpeg-build --extra-version=avbuild --disable-doc --enable-runtime-cpudetect --disable-ptx-compression --enable-mediafoundation --disable-vulkan --disable-postproc --disable-htmlpages --cross-prefix=x86_64-w64-mingw32- --disable-indevs --disable-outdevs --disable-debug --disable-filter=scale_cuda --enable-ffplay --extra-libs=-lSDL2 --enable-hwaccels --enable-dxva2 --extra-cflags=“-I/home/yibin/ffmpeg/SDL2-2.26.3/x86_64-w64-mingw32/include/SDL2” --extra-ldflags=“-L/home/yibin/ffmpeg/SDL2-2.26.3/x86_64-w64-mingw32/lib”

注意:以上openssl库路径、SDL2库路径 和 ffmpeg编译后的路径,请修改为自己存放库的路径。

6.5 修改config.h与config.mak以支持编译ffplay

注意:config.h与config.mak是每次重新配置完后就得修改

在vi里查找CONFIG_FFPLAY 和 CONFIG_SDL2,并进行启用,vi里查找方法:
在命令模式下敲斜杆( / )这时在状态栏(也就是屏幕左下脚)就出现了 “/” 然后输入你要查找的关键字敲回车就可以了。 如果你要继续查找此关键字,敲字符 n 就可以继续查找了。 敲字符N(大写N)就会向前查询。

6.5.1 config.h:

在这里插入图片描述
在这里插入图片描述

6.5.2 config.mak:

在这里插入图片描述
在这里插入图片描述

6.6 执行make编译ffmpeg:

执行结果如下,生成了相关库和可执行文件:
在这里插入图片描述

6.7 执行make install:

执行结果如下,查看存放ffmpeg编译结果的文件,将库拷贝到windows下即可使用:

在这里插入图片描述

七. 测试播放:

7.1 测试32位ffplay

在这里插入图片描述
播放结果:
在这里插入图片描述

7.2 测试64位ffplay

在这里插入图片描述

播放结果:

在这里插入图片描述

八. 编译结果下载:

8.1 32位编译结果下载:

下载地址:https://download.csdn.net/download/linyibin_123/87906819

8.2 64位编译结果下载:

下载地址:https://download.csdn.net/download/linyibin_123/87906819

九. 命令解析:

9.1 配置命令

1.–target-os=xxx:
指定编译目标系统:
32位为:–target-os=mingw32
64位为:–target-os=mingw32-w64

2.–prefix=xxx:
编译安装后库存储路径

3.–arch=xxx
指定arm架构
32位为:–arch=x86
64位为:–arch=x86_64

4.–cross-prefix=xxx
指定交叉编译器的前缀名
32位为:–cross-prefix=i686-w64-mingw32-
64位为:–cross-prefix=x86_64-w64-mingw32-

5.–extra-cflags=xxx
指定头文件路径

6.–extra-ldflags=xxx
指定引用库路径
–extra-ldflags=‘-static-libgcc’:加上这个配置,可以不用依赖libgcc_s_sjlj-1.dll

7.–extra-libs=xxx
指定额外引用库的名字

8.enable和disable配置项:
1)–enable-gpl:修改ffmpeg,再编译,编译时就需要加入这个选项才行
2)–enable-version3:更新许可证版本到3
3)–disable-everything:这个选项相当于关闭了encoders,decoders,hwaccels,muxers,demuxers,parsers,bsfs,protocols,devices,indevs,outdevs,filters共9种组件。
ffmpeg完全编译后有:avcodec,avdevice,avformat,swresample,swscale,avfilter,avutil,postproc这8大块,比如不需要后处理postproc这一块,那么我们就可以关闭它。
4)–enable-shared:默认情况下编译的库是静态的,如果我们想编译动态的,那么就可以加上这个选项。
5)–enable-cross-compile:如果想交叉编译,那么得开启这个开启这个选项,同时还得设置–arch和–target_os和–cross_prefix,实际上你只要增加了–cross_prefix选项,那么configure会自动帮你加上–enable-cross-compile,也就是有了–cross_prefix,–enable-cross-compile你可以省略不写。
6)–enable-asm:开启协处理器 提高FPS,可以提升解码速度。

9.2 帮助选项

–help 打印此消息
–quiet 抑制显示信息输出
–list-decoders 显示所有可用的解码器
–list-encoders 显示所有可用的编码器
–list-hwaccels 显示所有可用的硬件加速器
–list-demuxers 显示所有可用的解复用器
–list-muxers 显示所有可用的复用器
–list-parsers 显示所有可用的解析器
–list-protocols 显示所有可用的协议
–list-bsfs 显示所有可用的比特流过滤器
–list-indevs 显示所有可用的输入设备
–list-outdevs 显示所有可用的输出设备
–list-filters 显示所有可用的过滤器

猜你喜欢

转载自blog.csdn.net/linyibin_123/article/details/131214295