在之前的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链接可以点击下方的“阅读原文”