public static android.graphics.YuvImage ConvertTo(org.webrtc.VideoRenderer.I420Frame src, int imageFormat) {
byte[] bytes = new byte[src.yuvStrides[0] * src.height +
src.yuvStrides[1] * src.height / 2 +
src.yuvStrides[2] * src.height / 2];
int[] strides = new int[3];
switch (imageFormat) {
default:
return null;
case android.graphics.ImageFormat.YV12: {
ByteBuffer tmp = ByteBuffer.wrap(bytes, 0, src.yuvStrides[0] * src.height);
copyPlane(src.yuvPlanes[0], tmp);
tmp = ByteBuffer.wrap(bytes, src.yuvStrides[0] * src.height, src.yuvStrides[2] * src.height / 2);
copyPlane(src.yuvPlanes[2], tmp);
tmp = ByteBuffer.wrap(bytes, src.yuvStrides[0] * src.height + src.yuvStrides[2] * src.height / 2, src.yuvStrides[1] * src.height / 2);
copyPlane(src.yuvPlanes[1], tmp);
strides[0] = src.yuvStrides[0];
strides[1] = src.yuvStrides[2];
strides[2] = src.yuvStrides[1];
return new YuvImage(bytes, imageFormat, src.width, src.height, strides);
}
case android.graphics.ImageFormat.NV21: {
if (src.yuvStrides[0] != src.width)
return null;
if (src.yuvStrides[1] != src.width / 2)
return null;
if (src.yuvStrides[2] != src.width / 2)
return null;
ByteBuffer tmp = ByteBuffer.wrap(bytes, 0, src.width * src.height);
copyPlane(src.yuvPlanes[0], tmp);
byte[] tmparray = new byte[src.width / 2 * src.height / 2];
tmp = ByteBuffer.wrap(tmparray, 0, src.width / 2 * src.height / 2);
copyPlane(src.yuvPlanes[2], tmp);
for (int row = 0; row < src.height / 2; row++) {
for (int col = 0; col < src.width / 2; col++) {
bytes[src.width * src.height + row * src.width + col * 2] = tmparray[row * src.width / 2 + col];
}
}
copyPlane(src.yuvPlanes[1], tmp);
for (int row = 0; row < src.height / 2; row++) {
for (int col = 0; col < src.width / 2; col++) {
bytes[src.width * src.height + row * src.width + col * 2 + 1] = tmparray[row * src.width / 2 + col];
}
}
return new YuvImage(bytes, imageFormat, src.width, src.height, null);
}
}
}
调用方法
android.graphics.YuvImage yuvImage = ConvertTo(i420Frame, ImageFormat.NV21);
FileOutputStream fileOutputStream = new FileOutputStream(file);
yuvImage.compressToJpeg(new Rect(0, 0, yuvImage.getWidth(), yuvImage.getHeight()), 100, fileOutputStream);