Ubuntu下FFmpeg库编译方法

来源:互联网 发布:人工智能论坛 哪个好 编辑:程序博客网 时间:2024/06/18 08:19

在自己编译之前也是参考了很多网友的帖子,在此作一下简单的记录,以备后续只需。

最基本的编译环境JDK+NDK,两者的下载以及环境变量配置相对简单,网上也一大把,不再细述。

本人使用的JDK版本:1.8.0_121,NDK版本:android-ndk-r13b,FFmpeg版本:ffmpeg-3.2.2

FFmpeg官方下载地址:https://ffmpeg.org/download.html

步骤1,下载解压,进入ffmpeg根目录,修改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:,ffmpeg根目录新建android_build.sh文件,写入如下配置内容,在此列出两种配置文件内容:

注意:其中ANDROID_NDK就是在环境变量中设置的,PLATFORM和PREBUILT要按照实际的存放路径对应修改!

  1)生成多个.so文件

#!/bin/bashecho It is okPLATFORM=$ANDROID_NDK/platforms/android-9/arch-arm/PREBUILT=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64export SYSROOTexport TOOLCHAINfunction build_one{./configure \   --prefix=$PREFIX \   --enable-shared \   --disable-static \   --disable-doc \   --disable-ffserver \   --enable-cross-compile \   --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \   --target-os=linux \   --arch=arm \   --sysroot=$SYSROOT \   --extra-cflags="-Os -fpic $ADDI_CFLAGS" \   --extra-ldflags="$ADDI_LDFLAGS" \   $ADDITIONAL_CONFIGURE_FLAGmake cleanmake -j4 install}CPU=armv7-aOPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"PREFIX=./android/$CPUADDITIONAL_CONFIGURE_FLAG=--enable-neonbuild_one

步骤3,执行build_android.sh,编译完成后,会在ffmpeg根目录生成一个android文件目录,进入android/armv7-a下会有如目录,


其中在lib目录下,一般生成以下6个:

libavformat: 用于各种音视频封装格式的生产和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;

libavcodec: 用于各种类型音视频的编解码;

libavutil: 一些公共的工具函数,用于简化程序,其中包括随机数生产器,数据结构,数学代码,核心多媒体工具等;

libswscale: 用于执行高度优化的图像缩放和颜色空间、像素格式转换;

libswresample:用于执行高度优化的音频重采样,重新矩阵和取样格式转换操作;

libavfilter: 包含媒体过滤器的库

   2)最终集成一个libffmpeg.so库文件

#!/bin/bashecho It is okPLATFORM=$ANDROID_NDK/platforms/android-9/arch-arm/PREBUILT=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64export SYSROOTexport TOOLCHAINfunction build_one{./configure \   --prefix=$PREFIX \   --disable-shared \   --enable-static \   --disable-doc \   --disable-ffserver \   --enable-cross-compile \   --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \   --target-os=linux \   --arch=arm \   --sysroot=$SYSROOT \   --extra-cflags="-Os -fpic $ADDI_CFLAGS" \   --extra-ldflags="$ADDI_LDFLAGS" \   $ADDITIONAL_CONFIGURE_FLAGmake cleanmake -j4 install$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib  -soname libffmpeg.so -shared -nostdlib  -z noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libavfilter/libavfilter.a libswscale/libswscale.a libavdevice/libavdevice.a libswresample/libswresample.a -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a}CPU=armv7-aOPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"PREFIX=./android/$CPUADDITIONAL_CONFIGURE_FLAG=--enable-neonbuild_one
与1)不同的地方主要是修改-shared置为disable,-static置为enable,这样make install出来的是多个静态库文件.


最后将这几个静态库文件集成一个libffmpeg.so.


这就是整个编译过程,如果出现编译错误,找不到某些文件之类的问题,大都是因为.sh文件中的路径有错,或者直接粘贴复制的话会有编码格式不同导致到语法错误,只能对症下药,随机应变,个别对待了。

0 0
原创粉丝点击