libYuv编译

简介: 安卓使用NDK编译libYuv库

前言

前面几篇写的都是Opengl ES的系列博文,并且都涉及到了YUV与RGB的转换,为了完善YUV与RGB相关的知识点,这里加写一篇关于libyuv交叉编译的博文,算是yuv这一系列的结束,后续继续Opengl ES的写了撰写。

做过音视频开发的童鞋们一定对libyuv这个库不陌生,利用这个库不但可以做yub到rgb颜色空间的互相转换,还可以进行图像的放大缩小、旋转等形变转换。

libyuv 是谷歌开源的对 YUV 数据进行缩放、旋转和转换的跨平台库,可在 Windows、Linux、Mac、Android 等操作系统,x86、x64、arm 架构上进行编译运行,支持 AVX2、NEON 等 SIMD 指令加速。

NDK编译libyuv

笔者的编译环境是MacOS M1芯片版。因为本文使用的是cmake编译,因此没有安装cmake的童鞋请先安装cmake。

libyuv的源码地址:https://chromium.googlesource.com/libyuv/libyuv

例如笔者下载解压后的文件名是libyuv-refs_heads_main,这个地址的源码下载可能需要点技巧,如果无法访问,可以到github上寻找相应的源码...

然后编写编译脚本build_yuv.sh:

#!/bin/bash
mkdir build
cd build
# 注意替换成你的NDK路径
NDK_PATH=/Users/fly/Documents/Android/SDK/ndk/21.4.7075529
TOOLCHAIN=$NDK_PATH/toolchains/llvm/prebuilt/darwin-x86_64

PREFIX=`pwd`/../androidOut/${ANDROID_ARCH_ABI}
API=21

function build_android
{
# cmake 传参
cmake ../libyuv-refs_heads_main -G"Unix Makefiles" \
    -DANDROID_NDK=${NDK_PATH} \
        -DCMAKE_CXX_COMPILER=$TOOLCHAIN/bin/$ANDROID_ARCH_COMPILER$API-clang++ \
      -DCMAKE_C_COMPILER=$TOOLCHAIN/bin/$ANDROID_ARCH_COMPILER$API-clang \
    -DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake \
    -DANDROID_ABI=${ANDROID_ARCH_ABI} \
    -DANDROID_NATIVE_API_LEVE=${API} \
    -DCMAKE_INSTALL_PREFIX=${PREFIX} \
    -DANDROID_ARM_NEON=TRUE \
    ..

# 生成库
#make clean
make
make install
}

# arm64
ANDROID_ARCH_ABI=arm64-v8a
ANDROID_ARCH_COMPILER=aarch64-linux-android
#清空上次的编译
PREFIX=`pwd`/../androidOut/${ANDROID_ARCH_ABI}
make clean
# 函数调用
build_android

echo ${PREFIX}

# 先删除build目录
cd ..
rm -rf build
mkdir build
cd build

# armeabi-v7a
ANDROID_ARCH_ABI=armeabi-v7a
ANDROID_ARCH_COMPILER=armv7a-linux-androideabi
PREFIX=`pwd`/../androidOut/${ANDROID_ARCH_ABI}
echo ${PREFIX}
echo $TOOLCHAIN/bin/$ANDROID_ARCH_COMPILER$API-clang++
# 函数调用
build_android

编写完毕赋予编译脚本运行权限,运行命令chmod +x build_yuv.sh,然后运行编译脚本./build_yuv.sh即可编译出libyuv的静态库和动态库,输出目录为源码目录libyuv-refs_heads_main的同级目录android下。

例如笔者编译完毕的完整目录是这样子的:
笔者libyuv编译完毕目录

编译成功后至于怎么引入,可以参考笔者之前的文章,原理都是一致的,这里就不再重复了。
参考:NDK21编译ffmpeg5.0.1

其他编译方式

对与程序员来说README.md是一个很有用的文档,无论那个项目都应该养成先看README.md的习惯。同样在libyuv的源码中也有README.md,里面就有介绍了使用gclient对libyuv各种平台的编译介绍。
具体介绍文档是libyuv-refs_heads_main/docs/getting_started.md

使用文档

同样在README.md也介绍了详细的使用文档,具体的使用文档是libyuv-refs_heads_main/docs/rotation.md。笔者浏览起来是挺详细的,这里就不多说了。

同时也可以参考其他博客文章:android全平台编译libyuv库实现YUV和RGB的转换
https://github.com/byhook/ffmpeg4android/blob/master/readme/android%E5%85%A8%E5%B9%B3%E5%8F%B0%E7%BC%96%E8%AF%91libyuv%E5%BA%93%E5%AE%9E%E7%8E%B0YUV%E5%92%8CRGB%E7%9A%84%E8%BD%AC%E6%8D%A2.md

推荐阅读

Opengl ES之EGL环境搭建
Opengl ES之着色器
Opengl ES之三角形绘制
Opengl ES之四边形绘制
Opengl ES之纹理贴图
Opengl ES之VBO和VAO
Opengl ES之EBO
Opengl ES之FBO
Opengl ES之PBO
Opengl ES之YUV数据渲染
YUV转RGB的一些理论知识
Opengl ES之RGB转NV21

关注我,一起进步,人生不止coding!!!

目录
相关文章
|
Ubuntu Linux
在Linux中如何解压 .xz 和 tar.xz 文件?
【4月更文挑战第17天】
12016 6
在Linux中如何解压 .xz 和 tar.xz 文件?
|
编解码 Linux C语言
探索C++与Live555实现RTSP服务器的艺术(一)
探索C++与Live555实现RTSP服务器的艺术
1280 1
|
Web App开发 应用服务中间件 Go
尝鲜:如何搭建一个简单的webrtc服务器
前几天我一朋友问我有关webrtc的事,简单了解了下相关知识,搭建了一个webrtc的服务,以及经历的各种踩坑事件,感觉踩坑主要是Python、Node、OpenSSL等版本问题和证书问题导致。本来以为很简单的搭建,但在搭建的过程中遇到各种阻碍,写一篇文章梳理一下。
13416 0
|
编解码 监控 网络协议
如何使用FFmpeg实现RTSP推送H.264和H.265(HEVC)编码视频
本文详细介绍了如何使用FFmpeg实现RTSP推送H.264和H.265(HEVC)编码视频。内容涵盖环境搭建、编码配置、服务器端与客户端实现等方面,适合视频监控系统和直播平台等应用场景。通过具体命令和示例代码,帮助读者快速上手并实现目标。
3447 6
|
编解码 Linux
libfdk-aac和x264安装编译
libfdk-aac和x264安装编译
825 0
libfdk-aac和x264安装编译
|
Android开发
我的Android 进阶修炼(1): AOSP源码根目录结构
本文介绍了AOSP源码的根目录结构,提供了基于MTK9269 Android 9.0源码的目录说明,帮助读者了解AOSP源码的组织方式和各目录的功能。
1093 0
我的Android 进阶修炼(1): AOSP源码根目录结构
阿里云域名注册流程和备案流程(详细图文教程)
阿里云域名注册指南:访问[阿里云域名注册入口,查询并注册心仪域名,如.com/.cn,加入清单后结算。价格因后缀而异,如.com首年78元。创建信息模板进行实名认证,首次需上传资料。获取域名优惠口令并使用,详细步骤见文档。备案流程参照阿里云ICP备案系统。
17859 2
|
编解码 Unix Linux
【Linux C/C++ 延时(延迟)函数比较】介绍Linux系统中常用的延时函数sleep、usleep、nanosleep、select和std::sleep_for()的区别和使用场景
【Linux C/C++ 延时(延迟)函数比较】介绍Linux系统中常用的延时函数sleep、usleep、nanosleep、select和std::sleep_for()的区别和使用场景
4743 1
|
开发工具 对象存储 Android开发
对象存储oss使用问题之C++使用OSS SDK时遍历OSS上的文件时崩溃如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
736 0
|
存储 编解码 数据处理
深入浅出:FFmpeg 音频解码与处理AVFrame全解析(二)
深入浅出:FFmpeg 音频解码与处理AVFrame全解析
1055 0