java.nio.ByteBuffer.arrayOffset和#xFF1F;
我需要从IFrameCallback中获取位图,该位图用于处理UVCCamera预览中的帧,但有一个例外: java.lang.UnsupportedOperationException位于 java.nio.ByteBuffer.arrayOffset 或者,如果我使用createBitmap而不是decodeByteArray,则会出现以下异常: java.lang.RuntimeException:缓冲区不够大,无法容纳像素 android.graphics.Bitmap.copyPixelsFromBuffer 由于预览大小为1280 x 720,因此可以忽略运行时异常的问题 对于从ByteBuffer获取数组偏移量的第一个异常,有什么想法吗 附言:我知道 UnsupportedOperationException-如果此缓冲区未由 可访问阵列java.nio.ByteBuffer.arrayOffset和#xFF1F;,java,android,bytebuffer,Java,Android,Bytebuffer,我需要从IFrameCallback中获取位图,该位图用于处理UVCCamera预览中的帧,但有一个例外: java.lang.UnsupportedOperationException位于 java.nio.ByteBuffer.arrayOffset 或者,如果我使用createBitmap而不是decodeByteArray,则会出现以下异常: java.lang.RuntimeException:缓冲区不够大,无法容纳像素 android.graphics.Bitmap.copyPixe
我的观点是:是否有其他方法获得数组偏移,或者如果无法获得,以及如何解决运行时异常?好吧,既然没有好的解决方案,我已经改变了从IFrameCallback获取位图的方法 因为我已将UVCCamera.PIXEL_格式\u NV21格式应用于UVCCamera:
private ChannelBufferOutputStream stream = new ChannelBufferOutputStream(MessageBuffers.dynamicBuffer());
......
private final IFrameCallback callback = new IFrameCallback() {
@override
public void onFrame(final ByteBuffer frame) {
new Thread(new Runnable() {
@override
public void run() {
byte[] bytes = new byte[frame.remaining()];
frame.get(bytes);
if(bytes.length > 0) {
YuvImage yuvImage = new YuvImage(bytes, ImageFormat.NV21, UVCCamera.DEFAULT_PREVIEW_WIDTH, UVCCamera.DEFAULT_PREVIEW_HEIGHT, null);
bytes = null;
if(yuvImage.getYuvData().length > 0) {
yuvImage.compressToJpeg(new Rect(0, 0, yuvImage.getWidth(), yuvImage.getHeight()), 80, stream);
Bitmap bitmap = BitmapFactory.decodeByteArray(stream.buffer().array(), 0, stream.buffer().array().length);
......
}
}
}
}).start();
}
}
uvcCamera.setFrameCallback(frameCallback,
UVCCamera.PIXEL_格式_NV21)
因此,我可以得到位图,只需变换YuvImage:
private ChannelBufferOutputStream stream = new ChannelBufferOutputStream(MessageBuffers.dynamicBuffer());
......
private final IFrameCallback callback = new IFrameCallback() {
@override
public void onFrame(final ByteBuffer frame) {
new Thread(new Runnable() {
@override
public void run() {
byte[] bytes = new byte[frame.remaining()];
frame.get(bytes);
if(bytes.length > 0) {
YuvImage yuvImage = new YuvImage(bytes, ImageFormat.NV21, UVCCamera.DEFAULT_PREVIEW_WIDTH, UVCCamera.DEFAULT_PREVIEW_HEIGHT, null);
bytes = null;
if(yuvImage.getYuvData().length > 0) {
yuvImage.compressToJpeg(new Rect(0, 0, yuvImage.getWidth(), yuvImage.getHeight()), 80, stream);
Bitmap bitmap = BitmapFactory.decodeByteArray(stream.buffer().array(), 0, stream.buffer().array().length);
......
}
}
}
}).start();
}
}
读取javadoc:UnsupportedOperationException-如果此缓冲区没有可访问数组的支持。读取javadoc。这是针对Java10的<代码>抛出:ReadOnlyBufferException-如果此缓冲区由数组支持但为只读不支持操作Exception-如果此缓冲区不由可访问数组支持。问题是如何获得arrayOffset并避免异常@frankjorsn frame.get(字节);返回一个ByteBuffer。您必须将其分配给变量并对其进行操作:
private ChannelBufferOutputStream stream = new ChannelBufferOutputStream(MessageBuffers.dynamicBuffer());
......
private final IFrameCallback callback = new IFrameCallback() {
@override
public void onFrame(final ByteBuffer frame) {
new Thread(new Runnable() {
@override
public void run() {
byte[] bytes = new byte[frame.remaining()];
frame.get(bytes);
if(bytes.length > 0) {
YuvImage yuvImage = new YuvImage(bytes, ImageFormat.NV21, UVCCamera.DEFAULT_PREVIEW_WIDTH, UVCCamera.DEFAULT_PREVIEW_HEIGHT, null);
bytes = null;
if(yuvImage.getYuvData().length > 0) {
yuvImage.compressToJpeg(new Rect(0, 0, yuvImage.getWidth(), yuvImage.getHeight()), 80, stream);
Bitmap bitmap = BitmapFactory.decodeByteArray(stream.buffer().array(), 0, stream.buffer().array().length);
......
}
}
}
}).start();
}
}