如何复制 ByteBuffer 的内容?

How to copy the contents of ByteBuffer?

我从 MediaCodec 接收到 ByteBuffer 对象,目的是将 ByteBuffer 的内容复制到我的 ByteBuffer 对象,从而缩小容量。像这样:

// get the ByteBuffer from MediaCodec
// the capacity of encodedBufferFromMediaCodec is 12345678
encodedBufferFromMediaCodec = getByteBuffer();
// copy the content of encodedBufferFromMediaCodec to my ByteBuffer
// the capacity of myBuffer is 123456
// the content'size of encodedBufferFromMediaCodec is 123
myBuffer.put(encodedBufferFromMediaCodec);

以上是我的目标。但是我遇到了以下异常:

10-30 14:48:54.621 E/AndroidRuntime( 2999): Process: com.jerikc.demo, PID: 2999 
10-30 14:48:54.621 E/AndroidRuntime( 2999): java.nio.BufferOverflowException
10-30 14:48:54.621 E/AndroidRuntime( 2999):     at java.nio.ByteBuffer.put(ByteBuffer.java:753)

那么怎么做呢?

ByteBuffer myBuffer = ByteBuffer.allocate(123456);
encodedBufferFromMediaCodec.rewind();

int i = 0;
while (i < 123456) {
    myBuffer.put(encodedBufferFromMediaCodec.get());
    i++;
}

myBuffer.flip();

请注意,如果 encodedBuffer 包含 123456+ 处的数据,您将丢失该数据。

  1. 翻转源缓冲区。
  2. 将源缓冲区放入目标缓冲区。
  3. 压缩源缓冲区。

正如 EJP 所建议的,这应该涵盖大多数情况。如果 encodedBufferFromMediaCodec 超过 12345 字节,它将不起作用。在这种情况下,您将得到一个 BufferOverflowException。

    ByteBuffer myBuffer = ByteBuffer.allocate(12345);
    ByteBuffer encodedBufferFromMediaCodec = getByteBuffer();

    encodedBufferFromMediaCodec.flip();
    myBuffer.put(encodedBufferFromMediaCodec);
    encodedBufferFromMediaCodec.compact();