Mac OS下为Android Studio编译FFmpeg解码库的详细教程

前端技术 2023/09/07 Android

NDK部分
1、下载ndk
这里就一笔带过了。

2、解压ndk
不要解压,文件权限会出错。执行之,会自动解压,然后mv到想放的地方。我放到了”/usr/local/bin/android-ndk-r10d”(此目录之后用$NDK_DIR指代)。

3、下载Ffmpeg
我下的是2.5.3版本。

4、解压Ffmpeg
解压Ffmpeg到$NDK_DIR/sources/ffmpeg-2.5.3。

5、修改Ffmpeg编译配置
在ffmpeg-2.5.3目录下把configure文件中的这几行,目的是去掉默认生成的库名字libavcodec.so.55最后那个”55″的版本号。

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


6、编译Ffmpeg
在ffmpeg-2.5.3目录下创建文件build_android.sh。
注意前三行要按照自己的路径正确配置。

#!/bin/bash
NDK=/usr/local/android-ndk-r10d
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

保存后执行

sudo chmod +x build_android.sh
./build_android.sh

编译会花上一段时间。

7、查看编译结果

编译完成后$NDK_DIR/sources/ffmpeg-2.5.3下面会多出一个android目录,里面就是我们想要的编译好的库。

[cg@local]# ls -R android/

arm
 
android//arm:
Android.mk include lib
 
android//arm/include:
libavcodec libavfilter libavformat libavutil  libswresample libswscale
 
android//arm/include/libavcodec:
avcodec.h  avfft.h   dv_profile.h dxva2.h   old_codec_ids.h vaapi.h   vda.h   vdpau.h   version.h  vorbis_parser.h xvmc.h
 
android//arm/include/libavfilter:
asrc_abuffer.h avcodec.h  avfilter.h  avfiltergraph.h buffersink.h buffersrc.h  version.h
 
android//arm/include/libavformat:
avformat.h avio.h  version.h
 
android//arm/include/libavutil:
adler32.h  avstring.h  cast5.h   downmix_info.h hash.h   macros.h   opt.h   replaygain.h  time.h
aes.h   avutil.h   channel_layout.h error.h   hmac.h   mathematics.h parseutils.h  ripemd.h   timecode.h
attributes.h  base64.h   common.h   eval.h   imgutils.h  md5.h   pixdesc.h  samplefmt.h  timestamp.h
audio_fifo.h  blowfish.h  cpu.h   ffversion.h  intfloat.h  mem.h   pixelutils.h  sha.h   version.h
audioconvert.h bprint.h   crc.h   fifo.h   intreadwrite.h motion_vector.h pixfmt.h   sha512.h   xtea.h
avassert.h  bswap.h   dict.h   file.h   lfg.h   murmur3.h  random_seed.h stereo3d.h
avconfig.h  buffer.h   display.h  frame.h   log.h   old_pix_fmts.h rational.h  threadmessage.h
 
android//arm/include/libswresample:
swresample.h version.h
 
android//arm/include/libswscale:
swscale.h version.h
 
android//arm/lib:
libavcodec-56.so libavfilter-5.so libavformat-56.so libavutil-54.so libswresample-1.so libswscale-3.so pkgconfig
libavcodec.so  libavfilter.so  libavformat.so  libavutil.so  libswresample.so libswscale.so
 
android//arm/lib/pkgconfig:
libavcodec.pc libavfilter.pc libavformat.pc libavutil.pc  libswresample.pc libswscale.pc

其中libavcodec.so、libavfilter.so、libavformat.so、libavutil.so、libswresample.so、libswscale.so都是软链,没有用,可以删掉。

8、给Ffmpeg库写Android.mk使其可用
创建$NDK_DIR/sources/ffmpeg-2.5.3/android/arm/Android.mk文件,内容如下:
要注意其中.so前面的数字应该改成你的ffmpeg版本编译出来的数字。

LOCAL_PATH:= $(call my-dir)
 
 include $(CLEAR_VARS)
LOCAL_MODULE:= libavcodec
LOCAL_SRC_FILES:= lib/libavcodec-56.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
 include $(CLEAR_VARS)
LOCAL_MODULE:= libavformat
LOCAL_SRC_FILES:= lib/libavformat-56.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
 include $(CLEAR_VARS)
LOCAL_MODULE:= libswscale
LOCAL_SRC_FILES:= lib/libswscale-3.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
 include $(CLEAR_VARS)
LOCAL_MODULE:= libavutil
LOCAL_SRC_FILES:= lib/libavutil-54.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
 include $(CLEAR_VARS)
LOCAL_MODULE:= libavfilter
LOCAL_SRC_FILES:= lib/libavfilter-5.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
 include $(CLEAR_VARS)
LOCAL_MODULE:= libswresample
LOCAL_SRC_FILES:= lib/libswresample-1.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

至此ndk配置完毕,后面是配置Android Studio的部分。

Android Studio部分
Android Studio和Eclipse不太一样,它有一定的自动生成Android.mk并自动搞定JNI的能力。
但目前还并不足以让我们使用起来Ffmpeg库。
因此我们的思路是禁用掉Android Studio自动ndk-build的功能,手动编译我们的C代码达到目的。

首先当然要新建一个Android Studio项目。
我们使用$ROOT_DIR指代项目根目录。

1、Android Studio配置ndk路径
$ROOT_DIR/local.properties原先只配置了sdk。

sdk.dir=/usr/local/bin/android-sdk-macosx

给它增加一行ndk的配置

sdk.dir=/usr/local/bin/android-sdk-macosx
ndk.dir=/usr/local/bin/android-ndk-r10d

2、配置build.gradle
项目里面有两个build.gradle,一个在根目录下,一个在$ROOT_DIR/app/src下,我们要修改的是后者。
A>添加这一段以禁用自动ndk-build。

sourceSets.main.jni.srcDirs = []

B>添加这一段让它知道用库

  ndk {
   abiFilter \"armeabi\"
   moduleName \"ovsplayer\"
   ldLibs \"log\", \"z\", \"m\", \"jnigraphics\", \"android\"
  }

修改后的build.gradle是这样的。

android {
 compileSdkVersion 21
 buildToolsVersion \"21.1.1\"
 
 sourceSets.main.jni.srcDirs = [] // 禁用自动执行ndk-build
 defaultConfig {
  applicationId \"com.example.chengang.myapplication\"
  minSdkVersion 15
  targetSdkVersion 21
  versionCode 1
  versionName \"1.0\"
  ndk {
   abiFilter \"armeabi\"
   moduleName \"ovsplayer\" // 这个是C文件的名字
   ldLibs \"log\", \"z\", \"m\", \"jnigraphics\", \"android\"
  }
 }
 buildTypes {
  release {
   minifyEnabled false
   proguardFiles getDefaultProguardFile(\'proguard-android.txt\'), \'proguard-rules.pro\'
  }
 }
}

3、生成头文件
执行命令,注意路径要根据自己的情况更改。

复制代码 代码如下:

javah -d jni -classpath ..\\..\\build\\intermediates\\classes\\debug com.example.nativeapp.app.MainActivity

本文地址:https://www.stayed.cn/item/18234

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。