ubuntu下NDK9交叉编译ffmpeg
来源:互联网 发布:淘宝店铺的图片 编辑:程序博客网 时间:2024/05/30 02:26
废话:
闲来蛋疼地搞起来好久没弄的NDK编程,念头一起想把之前一直没编译的ffmpeg编译一遍。
太久没用,折腾来好久,果然知识都生疏,所以还是整理一下吧。
正文:
先说说自己的环境配置,不同环境下确实还是有不少差别的。
操作系统:ubuntu 12
NDK版本:r9 ffmpeg版本:2.0.1
资源准备:
1. ffmpeg
直接下载:
http://www.ffmpeg.org/releases/ 下载对应的版本
GIT下载:
在终端使用
git clone git://git.videolan.org/ffmpeg.git
or
git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
(新建一个文件夹并命名为ffmpeg,进入该文件夹下,输入git指令)
2.Android NDK r9
自己下载
开始编译:
参考链接:http://www.roman10.net/how-to-build-ffmpeg-with-ndk-r9/
简要总结如下,
1.将下载下来的ffmpeg拷贝到目标路径下($NDK/sources,$NDK为NDK所在的路径)
2.修改configure文件
由于找到以下4行,
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)'理由:为了libavcodec.so等共享库编译成适用于Android平台的。
3.编写build_android.sh
内容如下:可根据具体需要进行删减。注意中间不要留空行。
编写后,执行
sudo chmod +x build_android.sh./build_android.sh
build_android.sh的内容尝试了2种方法。
基于NDK9并以android-8为目标版本进行编译,交叉工具链采用NDK中最低版本4.6.
法1:编译生成多个动态库,成功编译后,将在$(pwd)/android/arm生成具体的动态库和头文件
build_android.sh:
#!/bin/bashNDK=$HOME/Android/android-ndk-r9SYSROOT=$NDK/platforms/android-8/arch-arm/TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86function build_one{./configure \ --prefix=$PREFIX \ --enable-shared \ --disable-static \ --disable-doc \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-avdevice \ --disable-doc \ --disable-symver \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --target-os=linux \ --arch=arm \ --enable-cross-compile \ --sysroot=$SYSROOT \ --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ --extra-ldflags="$ADDI_LDFLAGS" \ $ADDITIONAL_CONFIGURE_FLAGmake cleanmakemake install}CPU=armPREFIX=$(pwd)/android/$CPU ADDI_CFLAGS="-marm"build_one
法2:基本思路就是,先编译成静态库,再将各个静态库编译成一个动态库libffmpeg.so
成功编译后,将在$(pwd)/android/arm生成具体的静态库和头文件,以及libffmpeg动态库。
#!/bin/bashNDK=$HOME/Android/android-ndk-r9PLATFORM=$NDK/platforms/android-8/arch-arm/PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86function build_one{./configure \ --prefix=$PREFIX \ --disable-shared \ --enable-static \ --disable-doc \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-avdevice \ --disable-doc \ --disable-symver \ --disable-everything \ --enable-decoder=h264 \ --cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \ --target-os=linux \ --arch=arm \ --enable-cross-compile \ --sysroot=$PLATFORM \ --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ --extra-ldflags="$ADDI_LDFLAGS" \ $ADDITIONAL_CONFIGURE_FLAGmake cleanmakemake install}function build_d{$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PREBUILT/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 libswscale/libswscale.a libswresample/libswresample.a -lc -lm -lz -ldl -llog --warn-once --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.6/libgcc.a}function build_d0{$PREBUILT/bin/arm-linux-androideabi-gcc --sysroot=$PLATFORM -shared -o $PREFIX/libffmpeg.so \-Wl,--whole-archive libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a libswresample/libswresample.a \-Wl,--no-whole-archive -lm -lz}CPU=armPREFIX=$(pwd)/android/$CPU ADDI_CFLAGS="-marm"build_onebuild_d0
编译成功后如何调用?
1.如果是按法1直接生成多个动态库的话
先在$NDK/sources/ffmpeg-2.0.1/android/arm/Android.mk中声明各个动态库为共享库
Android.mk内容如下:
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS)LOCAL_MODULE:= libavcodecLOCAL_SRC_FILES:= lib/libavcodec-55.soLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/includeinclude $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS)LOCAL_MODULE:= libavformatLOCAL_SRC_FILES:= lib/libavformat-55.soLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/includeinclude $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS)LOCAL_MODULE:= libswscaleLOCAL_SRC_FILES:= lib/libswscale-2.soLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/includeinclude $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS)LOCAL_MODULE:= libavutilLOCAL_SRC_FILES:= lib/libavutil-52.soLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/includeinclude $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS)LOCAL_MODULE:= libavfilterLOCAL_SRC_FILES:= lib/libavfilter-3.soLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/includeinclude $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS)LOCAL_MODULE:= libwsresampleLOCAL_SRC_FILES:= lib/libswresample-0.soLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/includeinclude $(PREBUILT_SHARED_LIBRARY)
然后,参照https://github.com/roman10/android-ffmpeg-tutorial例程中进行jni调用。
注意在jni中的Android.mk编写,加入编译出来的动态库,和头文件所在路径等
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := tutorial01LOCAL_SRC_FILES := tutorial01.cLOCAL_LDLIBS := -llog -ljnigraphics -lz LOCAL_SHARED_LIBRARIES := libavformat libavcodec libswscale libavutil include $(BUILD_SHARED_LIBRARY)$(call import-module,ffmpeg-2.0.1/android/arm)
经测试,利用法1编写的Android测试项目可以成功运行。
按法2,虽然将多个静态库编译成一个动态库,但应用时似乎函数有所缺失。待测试。
0 0
- ubuntu下NDK9交叉编译ffmpeg
- windows下使用ndk9编译ffmpeg
- Linux下ffmpeg交叉编译
- ubuntu下交叉编译
- ubuntu下编译ffmpeg
- Ubuntu下编译ffmpeg
- ubuntu下编译FFmpeg
- Ubuntu下编译FFmpeg
- ubuntu下编译ffmpeg
- ubuntu下编译FFmpeg
- ubuntu下编译FFmpeg
- Ubuntu下编译ffmpeg
- Ubuntu下FFmpeg编译
- 基于Ubuntu交叉编译FFmpeg Windows SDK
- 基于Ubuntu交叉编译FFmpeg Windows SDK
- 基于Ubuntu交叉编译FFmpeg Windows SDK
- 基于Ubuntu交叉编译FFmpeg Windows SDK
- 基于Ubuntu交叉编译FFmpeg Windows SDK
- STL算法-交集,并集,差集,对称差
- maven pom 详解
- C++函数重载
- spring中前置通知与后置通知
- Cocos2D-x游戏开发之二十一:ScheduleUpdate 和ScheduleOne的用法
- ubuntu下NDK9交叉编译ffmpeg
- 隐藏Ubuntu引导,直接进入系统——变色龙引导Linux,Windows,Mac OS(苹果系统)攻略之二
- 音乐播放器源代码
- 变幻莫测的python(二)---流程控制
- # 查询客户id为1的任意订单中产品总价超过30的产品名称
- linux后端服务程序之信号处理
- MFC 如何添加自定义消息
- Python实现的两个文件操作:当前目录下所有文件和转码
- Java jdbc Connection sql server And Oracle