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-shared2.修改添加一下代码:
$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 filesCmake配置文件和之前的比较简单多了:
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
阅读全文
0 0
- Android-FFmpeg编译生成单一的库
- 编译ffmpeg生成Android动态库
- ffmpeg 如何编译出单一的so文件
- Compile FFmpeg for Android(编译用于android的FFmpeg库)
- Ffmpeg编译Android库
- ffmpeg编译android的so库
- 编译Android平台使用的FFmpeg库
- 编译ffmpeg无法生成ffplay的问题解决
- 编译ffmpeg无法生成ffplay的问题解决
- 编译Android下的ffmpeg
- android移植ffmpeg的编译
- ffmpeg编译生成ffplay
- FFMPEG之编译生成
- FFmpeg+x264编译Android库
- android ffmpeg 动态库编译
- Android单排上王者系列之FFmpeg移植Android编译生成多库
- Android单排上王者系列之FFmpeg移植Android编译生成单个库
- Linux下编译Android平台的ffmpeg库
- linux centos7 安装Nginx服务
- 比特币白皮书研究
- maven项目中的报错问题——Dynamic Web Module 3.0 requires Java 1.6 or newer.
- 【动态语言和静态语言的比较】动态or静态?
- thinkphp怎样获取控制器名称和操作名称
- Android-FFmpeg编译生成单一的库
- 第四周项目4
- 【java学习】装箱与拆箱、泛型
- CC2640R2F BLE5.0 建立Source Insight 工程
- JAVA9新特性
- TCP/IP、Http、Socket的区别
- STL中的空间配置器allocator的实现原理及源码剖析
- java线程池
- iOS nomatic strong,weak,retain,assign,copy 等的区别。