安卓平台文字叠加库freetype的编译
freetype是一款跨平台开源的文字叠加库,支持对图像,视频进行文字叠加.
做多媒体开发的小伙伴大概都知道文字叠加是个刚需.所以最近研究了一下freetype库在安卓平台的编译过程.
下载
freetype 可在https://freetype.org/download.html下载,目前最新版本是2.11.1.
配置
freetype是一个标准的GNU Autotools生成的项目.其原理是:1 使用configure生成Makefile,2 make. 我们这里要做的就是修改configure的输出参数,来适配到安卓平台.
我借鉴了一些第三方的配置项目,创建了build_android.sh脚本,过程略过,内容如下. 具体见freetype-2.11.1/build_android.sh:
#!/bin/bash FFMPEG_EXT_PATH=`pwd` NDK_PATH="/Users/pro21/Downloads/android-ndk-r21e/" HOST_PLATFORM="darwin-x86_64" ENABLED_DECODERS=("${@:4}") JOBS=$(nproc 2> /dev/null || sysctl -n hw.ncpu 2> /dev/null || echo 4) echo "Using $JOBS jobs for make" COMMON_OPTIONS=" --with-zlib=no --with-bzip2=no --with-png=no --with-harfbuzz=no --with-brotli=no --with-sysroot=${SYSROOT} " TOOLCHAIN_PREFIX="${NDK_PATH}/toolchains/llvm/prebuilt/${HOST_PLATFORM}/bin" SYSROOT="${NDK_PATH}/toolchains/llvm/prebuilt/${HOST_PLATFORM}/sysroot" cd "${FFMPEG_EXT_PATH}" make clean FOLDER=`pwd`/android-libs/armeabi-v7a mkdir -p ${FOLDER} CC=${TOOLCHAIN_PREFIX}/armv7a-linux-androideabi16-clang ./configure --prefix=${FOLDER} --libdir=${FOLDER} --host=arm-linux-androideabi --enable-neon --enable-thumb --disable-gpl --disable-nonfree --enable-runtime-cpudetect ${COMMON_OPTIONS} make -j$JOBS && make install make clean FOLDER=`pwd`/android-libs/arm64-v8a mkdir -p ${FOLDER} CC=${TOOLCHAIN_PREFIX}/aarch64-linux-android21-clang ./configure --prefix=${FOLDER} --libdir=${FOLDER} --host=aarch64-linux-android --enable-debug ${COMMON_OPTIONS} make -j$JOBS && make install make clean FOLDER=`pwd`/android-libs/x86 mkdir -p ${FOLDER} CC=${TOOLCHAIN_PREFIX}/i686-linux-android16-clang ./configure --prefix=${FOLDER} --libdir=${FOLDER} --host=i686-linux-android ${COMMON_OPTIONS} make -j$JOBS && make install
编译
cd到 freetype-2.11.1,更改build_android.sh里面的NDK环境为自己的编译环境,包括NDK_PATH和HOST_PLATFORM,然后执行:
sh build_android.sh
编译成功后,动态库位于android-libs目录.
编译Android JNI
-
cd 到 android/library/freetype_jni 执行 ndk-build
测试项目
通过AS打开安卓项目,执行测试代码: android/library/src/androidTest/java/com/tsinglink/android/library/TextDrawTest.kt
安卓端接口调用
// 创建 TextDraw 实例 val draw = TextDraw() // 设置字库,文字大小,旋转角度: draw.init("/system/fonts/NotoSansCJK-Regular.ttc",20,0.0f) // 在20,120处叠加文字. frame为叠加的图像帧,YUV格式.width,height表示图像帧的宽高 // draw方法可以多次调用. draw.draw("你好 hello ", 20, 120, frame, width, height) // 释放实例 draw.release()
叠加效果展示
draw.draw("""Log.i(TAG,"你好 hello ")""", 20, 30, frame, width, height) draw.draw("""Log.i(TAG,"こんにちは hello ")""", 20, 60, frame, width, height) draw.draw("你好 hello ", 20, 120, frame, width, height) draw.draw("こんにちは hello ", 20, 150, frame, width, height)
项目地址
https://github.com/tsinglink/android-freetype
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
机器学习面试笔记整理7-Adaboost