libyuv编译Android平台so

2022-11-19 10:09:42 浏览数 (2)

在之前的Android FFmpeg系列09--抽帧与快速抽帧文章里用到了libyuv来将FFmpeg解码的视频AVFrame统一转化为RGBA格式输出

这篇文章我们来简单聊聊Android平台下libyuv so的编译和使用

两年前写过类似文章libyuv的编译与使用,当时是AS直接导入libyuv源码进行编译,今天我们在终端窗口用ndk-build来完成so的编译

源码下载

代码语言:javascript复制
git clone https://chromium.googlesource.com/libyuv/libyuv

NDK环境配置

笔者的环境为Mac,所以将ndk的路径追加到bash_profile即可,其它PC环境的配置类似(绿色一行为新增)

代码语言:javascript复制
$ cat ~/.bash_profile 
export PATH=${PATH}:~/Desktop/tool/SDKandNDK/android-ndk-r21d
[[ -s "$HOME/.profile" ]] && source "$HOME/.profile"

libyuv源码配置

修改目录名为jni

将git clone下来的源码目录libyuv改为jni

修改Android.mk文件

libyuv会依赖libjpeg库,这里我们将jpeg相关的禁用掉,新增标红的一行

代码语言:javascript复制
# This is the Android makefile for libyuv for NDK.
LOCAL_PATH:= $(call my-dir)
LIBYUV_DISABLE_JPEG:= "yes"

include $(CLEAR_VARS)

LOCAL_CPP_EXTENSION := .cc

...

include $(BUILD_SHARED_LIBRARY)

...

LOCAL_MODULE := libyuv_unittest
include $(BUILD_NATIVE_TEST)

添加Application.mk

指定输出so的架构平台和Android版本

代码语言:javascript复制
APP_ABI := armeabi-v7a arm64-v8a
APP_PLATFORM := android-18

编译

终端中进入jni根目录,依次输入如下命令即可

代码语言:javascript复制
ndk-build clean
ndk-build

编译过程

编译产物

使用示例

将头文件和编译产物libs目录下的so导入AS中

CmakeLists.txt引入

代码语言:javascript复制
# libyuv
set(libyuv_lib_dir ${CMAKE_SOURCE_DIR}/../libs/${CMAKE_ANDROID_ARCH_ABI})
set(libyuv_head_dir ${CMAKE_SOURCE_DIR}/vendor/libyuv)
include_directories(${libyuv_head_dir}/libyuv.h)

add_library(
        yuv
        SHARED
        IMPORTED
)
set_target_properties(yuv
        PROPERTIES IMPORTED_LOCATION
        ${libyuv_lib_dir}/libyuv.so)

target_link_libraries( # Specifies the target library.
        ffmpegdemo
        # ...略

        # libyuv
        yuv

        # system
        android
        ${log-lib})

将FFmpeg解码出来的AV_PIX_FMT_YUV420P视频帧转为RGBA

代码语言:javascript复制
if (frame->format == AV_PIX_FMT_YUV420P) {
    libyuv::I420ToABGR(frame->data[0], frame->linesize[0],
                       frame->data[1], frame->linesize[1],
                       frame->data[2], frame->linesize[2],
                       buffer, width * 4, width, height);
}

Demo Github链接可以点击下方的“阅读原文”

0 人点赞