Android-FFmpeg编译生成单一的库

Android-FFmpeg编译生成单一的库

通过上一篇文章FFmpeg编译的准备,已经对FFmpeg的基本的知识点了解,由于使用多个库在开发是容易导致很多无法想象的的错误,对项目的维护,配置等一下列的操作都会带来不小的麻烦。
这一步是音视频开发集成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/bash
NDK=/Users/cangck/Library/Android/sdk/ndk-bundle
SYSROOT=$NDK/platforms/android-19/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64

CPU=arm
ARCH=arm
PREFIX=$(pwd)/android/$CPU

ADDI_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 clean
make -j4
make 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


猜你喜欢

转载自blog.csdn.net/cangck_x/article/details/78110965
今日推荐