一、前言
本篇描述了ffmpeg5.1在ubuntu18.04上的编译经验。编译后的库支持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
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
该版本主要修改了:
- http-flv (支持了h265)
- 音频支持alaw 支持mp4录制pcm音频
- 语音对讲的处理
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 显示所有可用的过滤器