前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >libyuv编译Android平台so

libyuv编译Android平台so

作者头像
雪月清
发布2022-11-19 10:09:42
1.5K0
发布2022-11-19 10:09:42
举报
文章被收录于专栏:雪月清的随笔

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 雪月清的随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档