libyuv—libyuv测试使用ARGBToI420和ConvertToARGB接口
来源:互联网 发布:江西网络干部学院下载 编辑:程序博客网 时间:2024/06/07 20:05
上一篇http://blog.csdn.net/xiaibiancheng/article/details/72853009讲解了在Android studio 下面如何编译开源libyuv库,这一篇主要讲解如何使用ARGBToI420和ConvertToARGB这两个接口。
ARGBToI420接口主要用于将argb数据转换为一帧yuv I420 数据,接口定义如下:
// Convert ARGB to I420.LIBYUV_API int ARGBToI420(const uint8* src_argb, int src_stride_argb, uint8* dst_y, int dst_stride_y, uint8* dst_u, int dst_stride_u, uint8* dst_v, int dst_stride_v, int width, int height)
各个参数说明:
src_argb:用于待转换的argb数据。
src_stride_argb:argb数据每一行的大小,如果是argb_8888格式的话这个值为wX4,argb4444的话值为wX2。
dst_y:用于保存y分量数据。
dst_stride_y:值为w*h。
dst_u:用于保存u分量数据。
dst_stride_u:值为(w+1)/2。
dst_v:用于保存分量数据。
dst_stride_v:值为(w+1)/2。
width:位图宽度。
height:位图高度。
上面的w和h分别对应width和height。
ConvertToARGB 接口用于将一帧yuv数据转换为一张位图数据,接口定义如下 :
LIBYUV_API int ConvertToARGB(const uint8* sample, size_t sample_size, uint8* crop_argb, int argb_stride, int crop_x, int crop_y, int src_width, int src_height, int crop_width, int crop_height, enum RotationMode rotation, uint32 fourcc)
参数说明如下:
sample:yuv输入数据。
sample_size:输入数据大小,值为w*h*3/2。
crop_argb:用于保存转换后的argb数据。
argb_stride:职位w*4
crop_x:裁剪的起始x位置。
crop_y:裁剪的起始y位置。
src_width:yuv数据帧的宽度
src_height:yuv数据帧的高度
crop_width:裁剪后位图的宽度
crop_height:裁剪后位图的高度
rotation:旋转角度。
fourcc:yuv数据输入格式。
测试代码:
Bitmap image = null; AssetManager am = getResources().getAssets(); try{ //读取assert 的文图 InputStream is = am.open("test.jpg"); image = BitmapFactory.decodeStream(is); //将位图资源转为二进制数据,数据大小为w*h*4 int bytes = image.getByteCount(); ByteBuffer buf = ByteBuffer.allocate(bytes); image.copyPixelsToBuffer(buf); byte[] byteArray = buf.array(); byte[] ybuffer=new byte[w*h];//用于保存y分量数据 byte[] ubuffer=new byte[w*h*1/4];//用于保存u分量数据 byte[] vbuffer=new byte[w*h*1/4];//用于保存v分量数据 //将位图数据argb转换为yuv I420 转换后的数据分别保存在 ybuffer、ubuffer和vbuffer里面 Test.argbtoi420(byteArray,w*4,ybuffer,w,ubuffer,(w+1)/2,vbuffer,(w+1)/2,w,h); //将上面的yuv数据保存到一个数组里面组成一帧yuv I420 数据 分辨率为w*h byte[] frameBuffer=new byte[w*h*3/2]; System.arraycopy(ybuffer,0,frameBuffer,0,w*h); System.arraycopy(ubuffer,0,frameBuffer,w*h,w*h*1/4); System.arraycopy(vbuffer,0,frameBuffer,w*h*5/4,w*h*1/4); //用于保存将yuv数据转成argb数据 byte[] rgbbuffer=new byte[w*h*4]; //将上面的yuv I420 还原成argb数据 Test.convertToArgb(frameBuffer,w*h*3/2,rgbbuffer,w*4,0,0,w,h,w,h,0,0); //还原成位图 Bitmap stitchBmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); stitchBmp.copyPixelsFromBuffer(ByteBuffer.wrap(rgbbuffer)); //显示还原的位图 imgShow.setImageBitmap(stitchBmp); }catch (IOException e){ }
jni代码:
//// Created by Administrator on 2017/6/4.//#include "include/libyuv.h"#include <jni.h>void Java_com_example_libyuv_Test_argbtoi420(JNIEnv* env, jobject thiz, jbyteArray src_argb, int src_stride_argb, jbyteArray dst_y, int dst_stride_y, jbyteArray dst_u, int dst_stride_u, jbyteArray dst_v, int dst_stride_v, int width, int height){ uint8_t* rgbBuffer = (uint8_t*) (*env)->GetByteArrayElements(env, src_argb, 0); uint8_t* yBuffer=(uint8_t*) (*env)->GetByteArrayElements(env, dst_y, 0); uint8_t* uBuffer=(uint8_t*) (*env)->GetByteArrayElements(env, dst_u, 0); uint8_t* vBuffer=(uint8_t*) (*env)->GetByteArrayElements(env, dst_v, 0); ARGBToI420(rgbBuffer,src_stride_argb,yBuffer,dst_stride_y,uBuffer,dst_stride_u,vBuffer,dst_stride_v,width,height); (*env)->ReleaseByteArrayElements(env, src_argb, rgbBuffer, 0); (*env)->ReleaseByteArrayElements(env, dst_y, yBuffer, 0); (*env)->ReleaseByteArrayElements(env, dst_u, uBuffer, 0); (*env)->ReleaseByteArrayElements(env, dst_v, vBuffer, 0);}void Java_com_example_libyuv_Test_convertToI420(JNIEnv* env, jobject thiz, jbyteArray src_frame, int src_size, jbyteArray dst_y, int dst_stride_y, jbyteArray dst_u, int dst_stride_u, jbyteArray dst_v, int dst_stride_v, int crop_x, int crop_y, int src_width, int src_height, int crop_width, int crop_height, int rotation, int format){ uint8_t* yuvFrame = (uint8_t*) (*env)->GetByteArrayElements(env, src_frame, 0); uint8_t* yBuffer=(uint8_t*) (*env)->GetByteArrayElements(env, dst_y, 0); uint8_t* uBuffer=(uint8_t*) (*env)->GetByteArrayElements(env, dst_u, 0); uint8_t* vBuffer=(uint8_t*) (*env)->GetByteArrayElements(env, dst_v, 0); ConvertToI420(yuvFrame,src_size,yBuffer,dst_stride_y,uBuffer,dst_stride_u,vBuffer,dst_stride_v,crop_x,crop_y,src_width,src_height,crop_width,crop_height,kRotate0,FOURCC_IYUV); (*env)->ReleaseByteArrayElements(env, src_frame, yuvFrame, 0); (*env)->ReleaseByteArrayElements(env, dst_y, yBuffer, 0); (*env)->ReleaseByteArrayElements(env, dst_u, uBuffer, 0); (*env)->ReleaseByteArrayElements(env, dst_v, vBuffer, 0);}void Java_com_example_libyuv_Test_convertToArgb(JNIEnv* env, jobject thiz, jbyteArray src_frame, int src_size, jbyteArray dst_argb, int dst_stride_argb, int crop_x, int crop_y, int src_width, int src_height, int crop_width, int crop_height, int rotation, int format){ uint8_t* yuvFrame = (uint8_t*) (*env)->GetByteArrayElements(env, src_frame, 0); uint8_t* rgbBuffer= (uint8_t*) (*env)->GetByteArrayElements(env, dst_argb, 0); ConvertToARGB(yuvFrame,src_size,rgbBuffer,dst_stride_argb,crop_x,crop_y,src_width,src_height,crop_width,crop_height,kRotate0,FOURCC_IYUV); (*env)->ReleaseByteArrayElements(env, src_frame, yuvFrame, 0); (*env)->ReleaseByteArrayElements(env, dst_argb, rgbBuffer, 0);}
demo地址:
https://github.com/XIAIBIANCHENG/android-libyuv
- libyuv—libyuv测试使用ARGBToI420和ConvertToARGB接口
- libyuv—AndroidStudio 编译libyuv
- libyuv库的使用
- android libyuv库的使用
- libyuv编译
- libyuv转换
- Android libyuv应用系列(二)libyuv在Android中的使用
- The Chromium Projects -- libyuv
- NDK编译Libyuv
- RGBA、YUV色彩格式及libyuv的使用
- Bitmap和libyuv在JNI中的字节序
- 音视频基础——libyuv格式转换
- couldn't find "libyuv.so
- libyuv编译(各平台)
- 1, libyuv 编译 for android
- 2,libyuv 编译for ios
- libYUV汇编加速初学记录【1】
- libyuv在windows下的编译。
- 微信小程序使用C#的WebService加载非托管dll配置iis
- L1-019. 谁先倒
- Leetcode 142. Linked List Cycle II
- 新的开始,记突然的离职
- Flink local模式运行SocketWordcount
- libyuv—libyuv测试使用ARGBToI420和ConvertToARGB接口
- SRM 664 hard BearSorts题解搬运
- OC代理,delegate
- windows下解压版mysql-5.7的安装方式
- Java基本数据类型的默认值
- [bzoj1143][CTSC2008]祭祀river 最大独立集+floyd
- 网络流二元关系
- Zookeeper实例原生API--同步更新节点数据
- 开发人员学Linux(6):CentOS7编译安装MySQL5.17.8多实例及主从复制