Linux下ffmpeg4.x版本编译

Linux下ffmpeg4.x版本编译,第1张

概述Linux下ffmpeg4.x版本编译前言一、编译环境二、编译步骤1.修改configure文件内容2.新建build_android.sh文件3.常见编译错误总结参考链接前言最近由于项目要求,需要为android系统机顶盒(32位)的应用提供libffmpeg.so,因此总结了一下编译方法与遇到的坑。一、编译环境

linux下ffmpeg4.x版本编译前言一、编译环境二、编译步骤1.修改configure文件内容2.新建build_android.sh文件3.常见编译错误总结参考链接

前言

最近由于项目要求,需要为androID系统机顶盒(32位)的应用提供libffmpeg.so,因此总结了一下编译方法与遇到的坑。


@L_301_9@一、编译环境

*** 作系统:Ubuntu 5.4.0

ffmpeg源码版本:ffmpeg-cd04bb4
---->下载链接:https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/cd04bb4afea111aa85afbaf806ae747103a843fd

ndk使用版本:androID-ndk-r17c
---->下载链接:https://developer.android.google.cn/ndk/downloads/older_releases

二、编译步骤1.修改configure文件内容

刚下载的ffmpeg源码,直接编译出来的so会带有版本号的后缀,无法使用,需要修改configure文件内容去除版本号:

将:SliBname_WITH_MAJOR='$(SliBname).$(libmAJOR)'liB_INSTALL_EXTRA_CMD='$$(RANliB) "$(liBDIR)/$(liBname)"'SliB_INSTALL_name='$(SliBname_WITH_VERSION)'SliB_INSTALL_linkS='$(SliBname_WITH_MAJOR) $(SliBname)'修改为:SliBname_WITH_MAJOR='$(SliBPREF)$(FulLname)-$(libmAJOR)$(SliBSUF)'liB_INSTALL_EXTRA_CMD='$$(RANliB)"$(liBDIR)/$(liBname)"'SliB_INSTALL_name='$(SliBname_WITH_MAJOR)'SliB_INSTALL_linkS='$(SliBname)'
2.新建build_androID.sh文件

新建build_androID.sh文件,用于编译生成libavcodec.a、libavfilter.a、libswresample.a、libavformat.a、libavutil.a、libswscale.a、libavdevice.a、libpostproc.a,并将它们打包生成最终的libffmpeg.so;根据自己的需要修改ndk版本和so生成的路径来修改build_androID.sh中的内容:

#!/bin/bashNDK=/data_ex/qcs/zjz/tools/androID-ndk-r17c/ISYSROOT=$NDK/sysroot#修改点1PLATFORM=$NDK/platforms/androID-19/arch-arm#修改点2:如果是Mac系统编译路径则是:xxx/darwin-x86_64/xxxTOolCHAIN=$NDK/toolchains/arm-linux-androIDeabi-4.9/prebuilt/linux-x86_64#修改点3:PREFIX=../function build_one{	./configure \	 --prefix=$PREFIX \	--target-os=androID \	--enable-cross-compile \	--disable-doc \	--cross-prefix=$TOolCHAIN/bin/arm-linux-androIDeabi- \	--arch=arm \	--sysroot=$PLATFORM \	--extra-cflags="-I$ISYSROOT/usr/include -isystem $ISYSROOT/usr/include/arm-linux-androIDeabi" \	--cc=$TOolCHAIN/bin/arm-linux-androIDeabi-gcc \	--nm=$TOolCHAIN/bin/arm-linux-androIDeabi-nm \	--enable-static \	--disable-shared \	--enable-runtime-cpudetect \	--enable-gpl \	--enable-small \	--enable-ffplay \	--enable-ffprobe \	--enable-ffmpeg \	--disable-deBUG \	--disable-symver \	--disable-stripPing \	--extra-cflags="-Os -pIE -fPIE -fpic $ADDI_CFLAGS -U_@R_404_6852@_OFFSET_BITS -D__ANDROID_API__=19" \	--extra-ldflags="$ADDI_LDFLAGS" \$ADDITIONAL_CONfigURE_FLAG make cleanmake -j4make install $TOolCHAIN/bin/arm-linux-androIDeabi-ld \    -rpath-link=$PLATFORM/usr/lib \    -L$PLATFORM/usr/lib \    -L$PREFIX/lib \    -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \    $PREFIX/libffmpeg.so \    libavcodec/libavcodec.a \    libavfilter/libavfilter.a \    libswresample/libswresample.a \    libavformat/libavformat.a \    libavutil/libavutil.a \    libswscale/libswscale.a \    libavdevice/libavdevice.a \    libpostproc/libpostproc.a \    -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \    $TOolCHAIN/lib/gcc/arm-linux-androIDeabi/4.9.x/libgcc.a #修改点4: 4.8 or 4.9	echo "编译结束!"} # arm v7vfpecho "编译不支持neon和硬解码"cpu=armv7-aOPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$cpu "ADDI_CFLAGS="-marm"build_one #build first task echo "编译支持neon和硬解码"cpu=armv7-aPREFIX=./androID/armv7-a-neon-hardCFLAG="-I$INCLUDE -I$INCLUDE/arm-linux-androIDeabi -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp"ADD="--enable-asm \    --enable-neon \    --enable-jni \    --enable-mediacodec \    --enable-decoder=h264_mediacodec \    --enable-hwaccel=h264_mediacodec "build_one #build second task
3.常见编译错误

1.报错一:format/udp.c:290 error: request for member ‘s_addr‘ in something not a structure or union

----试了ndk10-17版本,发现ndk 10-15版本会出现错误,换用高版本(最好是r17c)之后就不会报此问题

2.报错二:xxxxx/include/stdint.h:9:26: Fatal error: stdint.h: No such @R_404_6852@ or directory

----出现这个错误是因为NDK r17c版本将头文件和库文件进行了分离,指定的sysroot文件夹下只有库文件,而头文件放在了NDK目录下的sysroot内. 在build_androID.sh文件的–extra-cflags中添加 “-isysroot $NDK/sysroot”即可

3.报错三:libavcodec/aaccoder.c:803:25: error: expected IDentifIEr or ‘(’ before numeric constant int B0 = 0, B1 = 0;

----将里面的B0都改为其他变量(如b0)即可;后续其他文件也会报类似错误,都是把B0改为b0或其他变量

4.报错四:在编译完毕32位libffmpeg.so后,使用盒子无法加载动态库,报出dlopen("/data/app-lib/com.example.freevIEwpoint_demo-2/libffmpeg.so") Failed: dlopen Failed: cannot locate symbol “mmap64” referenced by “libffmpeg.so”…

----这是因为盒子为AndroID4.4版本,对应androID platform版本为19,而之前编译使用的是21

5.报错五(接问题3)修改build_androID.sh中androID platform版本为19后编译,报出libavcodec/v4l2_buffers.c:434:44: error: call to ‘mmap’ declared with attribute error: mmap is not available > with _@R_404_6852@_OFFSET_BITS=64 when using GCC until androID-21. Either raise your minSdkVersion, disable > _@R_404_6852@_OFFSET_BITS=64, or switch to Clang.

----21版本以下,需要取消 _@R_404_6852@_OFFSET_BITS宏定义。添加编译参数: -U_@R_404_6852@_OFFSET_BITS

总结

编译ffmpeg竟然遇到这么多坑,也是服了,不过网上查了n多资料,加上自己试验总算编译成功。最后附上自己编译的32位libffmpeg.so链接:https://download.csdn.net/download/qq_31366471/15174217

参考链接

https://blog.csdn.net/u010164190/article/details/107581146

总结

以上是内存溢出为你收集整理的Linux下ffmpeg4.x版本编译全部内容,希望文章能够帮你解决Linux下ffmpeg4.x版本编译所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1046307.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-24
下一篇2022-05-24

发表评论

登录后才能评论

评论列表(0条)

    保存