libyuv libyuv使用cpu的特殊指令集,对cpu的运算做加速,比sws转换效率高,编译的时候如果cpu不支持ssse、avx等指令集,也基本和sws差不多,而且有时可能更慢 在row.h的宏定义中可以看到
在之前的Android FFmpeg系列09--抽帧与快速抽帧文章里用到了libyuv来将FFmpeg解码的视频AVFrame统一转化为RGBA格式输出 这篇文章我们来简单聊聊Android平台下libyuv so的编译和使用 两年前写过类似文章libyuv的编译与使用,当时是AS直接导入libyuv源码进行编译,今天我们在终端窗口用ndk-build来完成so的编译 源码下载 git clone https ://chromium.googlesource.com/libyuv/libyuv NDK环境配置 笔者的环境为Mac,所以将ndk的路径追加到bash_profile即可,其它PC环境的配置类似(绿色一行为新增 源码配置 修改目录名为jni 将git clone下来的源码目录libyuv改为jni 修改Android.mk文件 libyuv会依赖libjpeg库,这里我们将jpeg相关的禁用掉,新增标红的一行 (yuv PROPERTIES IMPORTED_LOCATION ${libyuv_lib_dir}/libyuv.so) target_link_libraries
libyuv是Google开源的实现YUV数据格式转换,旋转,缩放和镜像等操作的库。 编译 使用cmake+ndk来编译.so文件 在新建的AS工程中建一个module--libyuv,该module下的源码目录下新建cpp目录,将下载的libyuv相关文件导入到cpp目录中: ? /include) add_subdirectory(src/main/cpp/libyuv . 应用层通过jni的方式来使用libyuv,此处以NV21转I420为例进行演示。 常见的yuv操作都做个封装Util,代码: https://github.com/sifutang/libyuv.git
: No such file or directory #include "libyuv.h" ^ compilation terminated. make: /root/ijkplayer/ijkplayer-android/android profiler build: NO 搜索整个目录 , 确实没有 “libyuv.h” 文件 ; 二、解决方案 --- - 在根目录下 , 有一个 init-android-libyuv.sh 脚本 , 执行该 init-android-libyuv.sh 脚本 , 就可以自动下载并安装 libyuv; 在 ijkplayer-android /init-android-libyuv.sh == pull libyuv base == 正克隆到 'extra/libyuv'... remote: Enumerating objects: 12767 处理 delta 中: 100% (10540/10540), 完成. == pull libyuv fork == 正克隆到 'ijkmedia/ijkyuv'...
一、环境介绍 操作系统: ubuntu18.04 开发平台: RK3399 二、出现的问题 使用FFMPEG的sws_scale函数在ARM平台转换效率很低,使用libyuv提高转换效率。 三、下载编译libyuv CSDN下载地址:https://download.csdn.net/download/xiaolong1126626497/12631325 GitHub下载地址: https ://github.com/lemenkov/libyuv wbyq@wbyq:~/qt_code/666$ unzip /mnt/hgfs/linux-share-dir/libyuv-master.zip wbyq@wbyq:~/qt_code/666$ cd libyuv-master wbyq@wbyq:~/qt_code/666$ make -f linux.mk 四、示例代码 调用libyuv 库方式: 将libyuv.h包含到工程,直接调用转换函数即可(转换函数名称可看下面2个例子),编译时指定libyuv.a库。
Libyuv库的介绍 其实对于YUV数据的处理,Google已经开源了一个叫做libyuv的库专门用于YUV数据的处理。 什么是libyuv libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。 Android上如何使用Libyuv libyuv并不能直接为Android开发直接进行使用,需要对它进行编译的操作。 在这里介绍的是使用Android Studio的Cmake的方式进行libyuv的编译操作,首先从官方网站Libyuv上下载libyuv库,下载的目录结构如下 ? (#include "libyuv.h"),在这里我们用到的是libyuv::NV21ToI420方法,我们来看下它传参 // Convert NV21 to I420.
implementation'jp.co.cyberagent.android.gpuimage:gpuimage-library:1.4.1' implementation 'com.blankj:utilcodex:1.30.6' 2.引入libyuv 这里我用的是这个案例(https://github.com/theeasiestway/android-yuv-utils)里面的libyuv,如下 image.png 3.编写CameraX预览代码 SuppressLint("UnsafeOptInUsageError") override fun analyze(image: ImageProxy) { //将Android的YUV数据转为libYuv isTakePhoto){ //将Android的YUV数据转为libYuv的数据 var yuvFrame = yuvUtils.convertToI420
1、BGRA 转换为 ARGB 下面的示例代码实现了 iOS BGRA 转换 ARGB,也打印了 vImage 与 libyuv 的处理耗时,接口与 libyuv 保持一致,反复测试发现性能基本一致。 下面的示例代码实现并对比了 vImage 与 libyuv 性能,接口与 libyuv 保持一致,反复测试发现性能基本一致。 下面的示例代码实现并对比了 vImage 与 libyuv 性能,接口与 libyuv 保持一致,反复测试发现性能基本一致。 uvBufferInfo 宽高针对于奇数会向上取整,对齐 libyuv。 参考资料 [1] libyuv: https://chromium.googlesource.com/libyuv/libyuv
1、libyuv库简介 libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。 编译方法(注意编译要求gcc版本必须在4.8以上),把libyuv库克隆到本地仓库,进入libyuv目录,进行编译: git clone https://github.com/lemenkov/libyuv.git cd libyuv make -f linux.mk 就会在当前目录下生成一个libyuv.a静态库,本人没有将libyuv编译安装到本地。 ---- 3、程序实现缩小NV12格式图片 实现算法:利用libyuv库的libyuv::NV12ToI420()函数将NV12转换成I420,再利用libyuv::I420Scale()函数将I420 int src_h = 1080; const int dst_w = 1280; const int dst_h = 720; libyuv::FilterModeEnum fmode = libyuv
此次采用libyuv,libyuv是一个谷歌的开源项目,跨平台,处理速度很快。针对此次MJPEG处理是比较合适的。 ${log-lib}) libyuv移植 这里采用直接将libyuv源码导入到AnV4L2Camera工程中 下载libyuv https://chromium.googlesource.com/libyuv /libyuv 将 libyuv 源码 include 目录下的 libyuv 目录下的头文件和 libyuv.h 一起拷贝到 v4l2camera模块下的 src\main\cpp\include目录 将 libyuv 源码 source 目录下的全部文件拷贝到 v4l2camera模块新建文件夹src\main\cpp\libyuv libyuv.png 修改v4l2camera模块 CMakeLists.txt (-DHAVE_JPEG) # 导入libyuv 源文件路径 file(GLOB src_files *.cpp libyuv/source/*.cc) libyuv解码MJPEG
环境介绍 宿主机环境: ubuntu18.04 64位 PC平台 目标环境: RK3399(ubuntu18.04 64位 ARM平台) 编译器: aarch64-linux-gcc 二、交叉编译 先下载libyuv ,不会下载看这里:https://blog.csdn.net/xiaolong1126626497/article/details/105984222 libyuv下载地址:https://download.csdn.net /download/xiaolong1126626497/12631325 wbyq@wbyq:~/rk3399/$ unzip /mnt/hgfs/linux-share-dir/libyuv-master.zip wbyq@wbyq:~/rk3399/$ cd libyuv-master/ wbyq@wbyq:~/rk3399/libyuv-master$ gedit linux.mk 修改之后继续编译。 wbyq@wbyq:~/rk3399/libyuv-master$ make -f linux.mk
文章目录 一、进入 ijkplayer-android 目录 二、执行 init-android-libyuv.sh 脚本 三、执行 init-android-soundtouch.sh 脚本 参考 https /init-android-libyuv.sh 命令 , 下载 libyuv 依赖库 , 之后编译 ijkplayer 需要用到 ; 执行过程 : root@octopus:~/ijkplayer/ijkplayer-android /init-android-libyuv.sh == pull libyuv base == 正克隆到 'extra/libyuv'... remote: Enumerating objects: 12767 处理 delta 中: 100% (10540/10540), 完成. == pull libyuv fork == 正克隆到 'ijkmedia/ijkyuv'... /init-android-soundtouch.sh 命令 , 下载 libyuv 依赖库 , 之后编译 ijkplayer 需要用到 ; 执行过程 : root@octopus:~/ijkplayer
YUV转换RGB,之前在C++上应用过很多次了,可以把现有代码修改一下放到java里运行,不过考虑到性能问题,决定还是使用libyuv。 libyuv是一款以c/c++为基础的,专做YUV与RGB格式转换的开源项目,性能非常高。 使用libyuv,需要通过NDK交叉编译,并通过JNI来调用。 libyuv编译起来也很简单,首先下载libyuv源码,代码地址是:https://chromium.googlesource.com/libyuv/libyuv 。 最后,进入libyuv目录,调用ndk-build即可。libyuv项目里已经写好了Android.mk,所以,直接编译就行了(我是在Windows上)。 ? 注意! 在AndroidStudio上建立c++文件,封装libyuv接口,然后按照JNI规范暴露接口,同时在Java层封装类来调用native方法。 ?
FreeSwitch 视频支持,需要特殊安装一些依赖 还有安装顺序问题 这里列出来 安装libyuv libvpx opus mod_av 等模块的代码 方便大家使用 环境: CentOS 6.x 64 FreeSwitch 1.6.20 URL=file.qzlink.com #bugfix: step1 libyuv cd /usr/local/src/freeswitch/libs rm -rf libyuv wget http://$URL/freeswitch/libyuv.zip unzip libyuv.zip cd libyuv make -f linux.mk CXXFLAGS=" -fPIC -O2 -fomit-frame-pointer -Iinclude/" make install yes|cp /usr/lib/pkgconfig/libyuv.pc /usr/lib64 /pkgconfig/ yes|cp /usr/lib/libyuv.so /usr/lib64/ #bugfix :step2 libvpx cd /usr/local/src/freeswitch/
/init-android-libyuv.sh 命令 , 下载 libyuv 依赖库 , 之后编译 ijkplayer 需要用到 ; 执行过程 : root@octopus:~/ijkplayer/ijkplayer-android /init-android-libyuv.sh == pull libyuv base == 正克隆到 'extra/libyuv'... remote: Enumerating objects: 12767 处理 delta 中: 100% (10540/10540), 完成. == pull libyuv fork == 正克隆到 'ijkmedia/ijkyuv'...
google开源的libyuv库正是这样一个替代品,可以用于在RGB和YUV之间进行转换: libyuv is an open source project that includes YUV scaling git clone https://chromium.googlesource.com/libyuv/libyuv 网上关于libyuv的资料貌似比较少,官方也没看到什么文档。 编码的视频效果对比如下(上图是libyuv实现,下图是ffmpeg的swscale实现): ? ? 可以看出来,下图有类似于水面波纹一样的噪声,而上图则几乎不可见。
argb = new byte[width / scale * height / scale * 4]; //值得注意的是在Java层传入byte[]以RGBA顺序排列时,libyuv 是用ABGR来表示这个排列 //libyuv表示的排列顺序和Bitmap的RGBA表示的顺序是反向的。 // 所以实际要调用libyuv::ABGRToI420才能得到正确的结果。 temp_y_scale + scaleSize; jbyte *temp_v_scale = temp_y_scale + scaleSize + scaleSize / 4; libyuv ::kRotate90 ); libyuv::I420ToABGR( (uint8_t *) temp_y, height, (uint8
libyuv 矩阵生成(搜索 『bt.』),参考:libyuv[2]。 4)RGBA 纹理转换 YUV 数据模块。 通常数据间转换使用 libyuv,例如 I420 转换 RGBA,方法为 I420ToARGBMatrix,参数支持设置矩阵 YuvConstants。 : https://github.com/BradLarson/GPUImage/blob/master/framework/Source/GPUImageColorConversion.m [2] libyuv : https://github.com/lemenkov/libyuv/blob/master/source/row_common.cc [3] RGB2YUV: https://en.wikipedia.org
简书链接:https://www.jianshu.com/p/8c6508cab763 有时候想对摄像头采集的视频流进行区域裁剪,可以使用libyuv这个库,原理就是先把NV12转换为i420,对i420 2.使用 libyuv::ConvertToI420 方法时,src_width需要填入步长而不是宽度,因为yuv内部要根据步长来取U、V数据,如果是填入的宽度,那么就会取值位移错误,导致转换失真。 3.因为我是直接NV12数据转换的,所以填写的类型是:libyuv::FOURCC_NV12。应该根据当前数据的类型选择对应的格式。 ::kRotate0, /*uint32 format*/ libyuv::FOURCC_NV12); // 2.把缩放后的I420数据转换为NV12 int nv12_plane1_stride = ::kRotate0, /*uint32 format*/ libyuv::FOURCC_I420); // 3.把缩放后的I420数据转换为NV12 int nv12_plane1_stride =
我们以一个 libyuv 三方库举例。 首先将项目添加为 Git Submodule git submodule add https://chromium.googlesource.com/libyuv/libyuv third_party/ libyuv 添加完成后,我们写一个自动编译三方库的脚本,Windows 平台下使用批处理、macOS 下使用 Shell 脚本。