gpt4 book ai didi

Java 如何将 java.nio.Buffer 转换为 ByteBuffer

转载 作者:搜寻专家 更新时间:2023-11-01 03:34:05 26 4
gpt4 key购买 nike

我遇到了一个小问题,我有两个库,一个将输出作为 java.nio.Buffer 发送给我,另一个将输入作为 java.nio.ByteBuffer 接收,我该如何进行转换?

谢谢

缓冲区来自这段代码的javaCV:

private BytePointer[]   image_ptr;
private Buffer[] image_buf;

// Determine required buffer size and allocate buffer
int size = avpicture_get_size(fmt, width, height);
image_ptr = new BytePointer[] { new BytePointer(av_malloc(size)).capacity(size) };
image_buf = new Buffer[] { image_ptr[0].asBuffer() };

// Assign appropriate parts of buffer to image planes in picture_rgb
// Note that picture_rgb is an AVFrame, but AVFrame is a superset of AVPicture
avpicture_fill(new AVPicture(picture_rgb), image_ptr[0], fmt, width, height);
picture_rgb.format(fmt);
picture_rgb.width(width);
picture_rgb.height(height);

最佳答案

首先,由于 Buffer 是一个抽象类,而 ByteBuffer 是它的子类之一,因此您从第一个库获得的输出实际上是一个 ByteBuffer 是完全可能的。如果可能,请检查库返回的是哪个 Buffer 实现,因为如果它实际上返回的是 ByteBuffer,您只需将输出转换为 ByteBuffer 即可。

如果您不知道库返回 Buffer 的哪个实现,您将不得不求助于 instanceof 测试来确定它是什么子类,并将数据从返回的 Buffer 复制到将其向下转换为子类后的新 ByteBuffer。这是因为 Buffer 接口(interface)实际上并没有提供任何方法来从缓冲区读取数据;只有子类(ByteBuffer、ShortBuffer、LongBuffer 等)可以。幸运的是,Buffer 只有 7 个可能的子类,每个基本类型一个。

一旦确定了您拥有的 Buffer 子类,就可以使用 this answer 中描述的“asXXXBuffer()”方法将数据复制到 ByteBuffer。 ,正如@Tunaki 指出的那样。

代码看起来像这样:

Buffer outputBuffer = library.getBuffer();
ByteBuffer byteBuffer;
if (outputBuffer instanceof ByteBuffer) {
byteBuffer = (ByteBuffer) outputBuffer;
} else if (outputBuffer instanceof CharBuffer) {
byteBuffer = ByteBuffer.allocate(outputBuffer.capacity());
byteBuffer.asCharBuffer().put((CharBuffer) outputBuffer);
} else if (outputBuffer instanceof ShortBuffer) {
byteBuffer = ByteBuffer.allocate(outputBuffer.capacity() * 2);
byteBuffer.asShortBuffer().put((ShortBuffer) outputBuffer);
} else if (outputBuffer instanceof IntBuffer) {
byteBuffer = ByteBuffer.allocate(outputBuffer.capacity() * 4);
byteBuffer.asIntBuffer().put((IntBuffer) outputBuffer);
} else if (outputBuffer instanceof LongBuffer) {
byteBuffer = ByteBuffer.allocate(outputBuffer.capacity() * 8);
byteBuffer.asLongBuffer().put((LongBuffer) outputBuffer);
} else if (outputBuffer instanceof FloatBuffer) {
byteBuffer = ByteBuffer.allocate(outputBuffer.capacity() * 4);
byteBuffer.asFloatBuffer().put((FloatBuffer) outputBuffer);
} else if (outputBuffer instanceof DoubleBuffer) {
byteBuffer = ByteBuffer.allocate(outputBuffer.capacity() * 8);
byteBuffer.asDoubleBuffer().put((DoubleBuffer) outputBuffer);
}

请注意,您分配的 ByteBuffer 的大小取决于您从哪个 Buffer 子类复制,因为不同的基本类型使用不同的字节数存储。例如,由于一个 int 是 4 个字节,如果你的库给你一个 IntBuffer,你需要分配一个 4 倍容量的 ByteBuffer。

关于Java 如何将 java.nio.Buffer 转换为 ByteBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37145258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com