Android Studio編譯FFmpeg

前言

編譯FFmpeg的Android版本,并整合到Android Studio。
系統(tǒng):macOS Sierra 10.12。
NDK版本:r12b。
FFmpeg版本:3.1.3

編譯FFmpeg的步驟

  • 下載NDK。

  • 下載ffmpeg源碼,解壓到NDK目錄下的sources目錄下。如圖

WechatIMG9.jpeg
  • 修改ffmpeg-3.1.3目錄下的configure文件 定位到3309行:如圖:
![WechatIMG11.jpeg](http://upload-images.jianshu.io/upload_images/1157085-bdeacb1c2ef69c55.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


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)'

目的是將生成.so名稱規(guī)范化,用以滿足android build。

  • 在當(dāng)前目錄下新建一個(gè)build_android.sh文件,如圖:
WechatIMG13.jpeg

內(nèi)容為:


#!/bin/bash
NDK=/Users/maimingliang/Documents/NDK/android-ndk-r12b
SYSROOT=$NDK/platforms/android-15/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
function 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_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU 
ADDI_CFLAGS="-marm"
build_one

  • 打開終端并且把路徑切換到build_android 所在的目錄 ,執(zhí)行命令

./build_android.sh

完成編譯以后,進(jìn)入生成的android文件夾,在arm文件夾里面新建一個(gè)Android.mk文件,內(nèi)容為:


LOCAL_PATH:= $(call my-dir)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libavcodec
LOCAL_SRC_FILES:= lib/libavcodec-57.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libavformat
LOCAL_SRC_FILES:= lib/libavformat-57.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libswscale
LOCAL_SRC_FILES:= lib/libswscale-4.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libavutil
LOCAL_SRC_FILES:= lib/libavutil-55.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libavfilter
LOCAL_SRC_FILES:= lib/libavfilter-6.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libswresample
LOCAL_SRC_FILES:= lib/libswresample-2.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

至此FFmpeg的編譯完成,下面整合到Android Studio 中:

配置Android Studio

  • 在local.properties加入ndk的路徑,我這里是:

ndk.dir=/Users/maimingliang/Documents/NDK/android-ndk-r12b

也可以在project structure 中添加。如圖所示:

WechatIMG14.jpeg
  • 在build.gradle 文件中添加圖中標(biāo)紅處的內(nèi)容。
WechatIMG21.jpeg
  • 配置javah,ndk-build ,ndk-build clean 命令
WechatIMG15.jpeg

添加javah命令:

![Uploading WechatIMG17_232544.jpeg . . .]

program:$JDKPath$/bin/javah
paramers:-classpath $Classpath$ -v -jni $FileClass$
working diretory : $ModuleFileDir$/src/main/jni

添加 ndk-build

IMG_4113.JPG

program:/Users/maimingliang/Documents/NDK/android-ndk-r12b/build/ndk-build //這里要修改你的ndk路徑 的ndk-build
paramers:
working diretory : $ModuleFileDir$/src/main/jni

添加 ndk-build clean

IMG_4114.JPG

program:/Users/maimingliang/Documents/NDK/android-ndk-r12b/build/ndk-build //這里要修改你的ndk路徑的 ndk-build
paramers:clean
working diretory : $ProjectFileDir$/app/src/main

  • 編寫 C文件
  • 編寫Android.mk文件
  • 編寫Application.mk文件。
  • 運(yùn)行 javah,ndk-build ndk-build clean 命令
IMG_4115.JPG
IMG_4116.JPG

END.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容