
最近由于项目要求,需要为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
刚下载的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 task3.常见编译错误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版本编译所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)