java.nio.ByteBuffer.arrayOffset和#xFF1F;

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预览中的帧,但有一个例外:

java.lang.UnsupportedOperationException位于 java.nio.ByteBuffer.arrayOffset

或者,如果我使用createBitmap而不是decodeByteArray,则会出现以下异常:

java.lang.RuntimeException:缓冲区不够大,无法容纳像素 android.graphics.Bitmap.copyPixelsFromBuffer

由于预览大小为1280 x 720
,因此可以忽略运行时异常的问题

对于从ByteBuffer获取数组偏移量的第一个异常,有什么想法吗

附言:我知道

UnsupportedOperationException-如果此缓冲区未由 可访问阵列


我的观点是:是否有其他方法获得数组偏移,或者如果无法获得,以及如何解决运行时异常?

好吧,既然没有好的解决方案,我已经改变了从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();
    }
}