Android-FFmpeg编译生成单一的库

来源:互联网 发布:淘宝优惠群怎么找商家 编辑:程序博客网 时间:2024/06/06 16:31
Android-FFmpeg编译生成单一的库

通过上一篇文章FFmpeg编译的准备,已经对FFmpeg的基本的知识点了解,由于使用多个库在开发是容易导致很多无法想象的的错误,对项目的维护,配置等一下列的操作都会带来不小的麻烦。
项目地址:https://github.com/cangck/FFmpegVedioPlayer
这一步是音视频开发集成FFmpeg是耗时最多的工作,也是遇到坑最多的地方,如果是第一次使用FFmepg在android上使用的话,那么这一步中我们将会有很多概念需要去了解,很多bug要改。

接下来,就要把FFmpeg生成的多个库改不称为单一的库文件。
要编译相应的单一的so库文件,则这时我们需要修改编译脚本文件build_android.sh文件,通过下面两部来实现
1.主要修改enable-static ,disable-shared
enable-static ,disable-shared
2.修改添加一下代码:
$TOOLCHAIN/bin/arm-linux-androideabi-ld \    -rpath-link=$SYSROOT/usr/lib \    -L$SYSROOT/usr/lib \    -L$PREFIX/lib \    -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \    $PREFIX/libffmpeg.so \    $PREFIX/lib/libavcodec.a $PREFIX/lib/libavfilter.a \    $PREFIX/lib/libavformat.a $PREFIX/lib/libavutil.a \    $PREFIX/lib/libswresample.a $PREFIX/lib/libswscale.a \    -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \    $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a  }
最后修改后完整的文件为:
#!/bin/bashNDK=/Users/cangck/Library/Android/sdk/ndk-bundleSYSROOT=$NDK/platforms/android-19/arch-armTOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64CPU=armARCH=armPREFIX=$(pwd)/android/$CPUADDI_CFLAGS="-marm"#配置./configure \    --prefix=$PREFIX \    --arch=$ARCH \    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \    --extra-ldflags="$ADDI_LDFLAGS" \    --sysroot=$SYSROOT \    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \    --target-os=linux \    --enable-cross-compile \    --enable-gpl \    --disable-shared \    --enable-static \    --disable-doc \    --disable-debug \    --enable-small \    --disable-programs \    --disable-ffmpeg \    --disable-ffplay \    --disable-ffprobe \    --disable-ffserver \    $ADDITIONAL_CONFIGURE_FLAG#编译make cleanmake -j4make install#打包$TOOLCHAIN/bin/arm-linux-androideabi-ld \    -rpath-link=$SYSROOT/usr/lib \    -L$SYSROOT/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#strip$TOOLCHAIN/bin/arm-linux-androideabi-strip  $PREFIX/libffmpeg.so
执行脚本生成下面的文件:
➜  android tree -L 3.└── arm    ├── include    │   ├── libavcodec    │   ├── libavdevice    │   ├── libavfilter    │   ├── libavformat    │   ├── libavutil    │   ├── libpostproc    │   ├── libswresample    │   └── libswscale    ├── lib    │   ├── libavcodec.a    │   ├── libavdevice.a    │   ├── libavfilter.a    │   ├── libavformat.a    │   ├── libavutil.a    │   ├── libpostproc.a    │   ├── libswresample.a    │   ├── libswscale.a    │   └── pkgconfig    └── libffmpeg.so  //这时我们开发是真正需要的库文件12 directories, 9 files
Cmake配置文件和之前的比较简单多了:
cmake_minimum_required(VERSION 3.4.1)add_library( ffmpeg_box              SHARED             src/main/cpp/ffmpeg_box.cpp              )find_library( log-lib              log )add_library(ffmpeg            SHARED            IMPORTED)set_target_properties( ffmpeg                       PROPERTIES IMPORTED_LOCATION                       ../../../../libs/armeabi/libffmpeg.so )include_directories( libs/include )target_link_libraries( ffmpeg_box ffmpeg                       ${log-lib} )
下图是运行App之后输出的信息:项目地址:https://github.com/cangck/FFmpegVedioPlayer,项目比较简单,主要是解决集成FFmpeg到AndroidStudio中并且能够正常运行的操作,这一步很关键,如果不能正常的配置项目,项目运行起来,后续工作就不能完成


参考:
http://gavinliu.cn/2017/03/14/Android-FFmpeg-%E7%BC%96%E8%AF%91%E6%88%90%E5%8D%95so%E5%BA%93/
http://blog.csdn.net/leixiaohua1020/article/details/47011021