libyuv接口NV12ToI420的实际使用

NV12ToI420

1.接口定义:
// Convert NV12 to I420.
LIBYUV_API
int NV12ToI420(const uint8* src_y, int src_stride_y,
const uint8* src_uv, int src_stride_uv,
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);

2.实际使用
首先弄清楚两种图片格式的存储格式:
在这里插入图片描述

	const uint8 *nv12_y = (const uint8*)image->data;
    int nv12_y_stride = image->width;
    const uint8 *nv12_uv = nv12_y + nv12_y_stride * image->height;
    int nv12_uv_stride = nv12_y_stride;

	uint8 *i420_image = NULL;
	i420_image = (uint8*)malloc(image->width * image->height * 1.5);
    uint8* i420_image_y_ptr = i420_image;
    uint8* i420_image_u_ptr = i420_image_y_ptr + (image->width * image->height);
    uint8* i420_image_v_ptr = i420_image_u_ptr + (int)(image->width * image->height * 0.25);
	
	libyuv::NV12ToI420(
	    nv12_y, nv12_y_stride, nv12_uv, nv12_uv_stride,
	    i420_image_y_ptr, image->width,
	    i420_image_u_ptr, (image->width >> 1),//由于4个y值共用一个uv,所以可以假设图总共为4个Y,则肯定就一个uv,
	    															  //所以dst_stride_y为2,dst_stride_u和dst_stride_v为1,所以需要处除2
	    i420_image_v_ptr, (image->width >> 1),
	    image->width, image->height);
以下是一个使用libyuv库对1920x1080的nv12数据分别旋转y通道和uv通道90度的示例代码: ```java import org.webrtc.NV21Buffer; import org.webrtc.VideoFrame; import org.webrtc.VideoFrame.Buffer; public class YUVUtils { // 旋转y通道90度 public static byte[] rotateY(byte[] yData, int width, int height) { byte[] rotatedY = new byte[width * height]; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { rotatedY[j * height + height - i - 1] = yData[i * width + j]; } } return rotatedY; } // 旋转uv通道90度 public static byte[] rotateUV(byte[] uvData, int width, int height) { byte[] rotatedUV = new byte[width * height / 2]; for (int i = 0; i < height / 2; i++) { for (int j = 0; j < width / 2; j++) { rotatedUV[j * height / 2 + height / 2 - i - 1] = uvData[i * width + j * 2]; rotatedUV[j * height / 2 + height / 2 + width / 2 - i - 1] = uvData[i * width + j * 2 + 1]; } } return rotatedUV; } // 旋转nv12数据的y和uv通道90度 public static byte[] rotateNV12(byte[] nv12Data, int width, int height) { byte[] rotatedY = rotateY(nv12Data, width, height); byte[] rotatedUV = rotateUV(nv12Data, width, height); byte[] rotatedNV12 = new byte[width * height * 3 / 2]; System.arraycopy(rotatedY, 0, rotatedNV12, 0, width * height); System.arraycopy(rotatedUV, 0, rotatedNV12, width * height, width * height / 2); return rotatedNV12; } } // 在使用时,可以将nv12数据转换为VideoFrame.Buffer,然后通过libyuv库进行旋转 byte[] nv12Data = ... NV21Buffer buffer = new NV21Buffer(nv12Data, width, height, null); VideoFrame.I420Buffer i420Buffer = buffer.toI420(); byte[] rotatedNV12 = YUVUtils.rotateNV12(i420Buffer.getDataY(), width, height); VideoFrame.Buffer rotatedBuffer = new NV21Buffer(rotatedNV12, height, width, null); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值