1

@Aegonisがこの投稿で尋ねたように

カメラを Android に接続してビデオ フレームをエンコードしようとしています。

問題は、彼と同じことをしようとして、この部分で、彼のトピックに投稿した別の 2 人のユーザーがクラッシュすることです。

// called from Camera.setPreviewCallbackWithBuffer(...) in other class
public void encoder(byte[] input) {
try {
    ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers();
    ByteBuffer[] outputBuffers = mediaCodec.getOutputBuffers();
    int inputBufferIndex = mediaCodec.dequeueInputBuffer(-1);
    if (inputBufferIndex >= 0) {
        ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
        inputBuffer.clear();
        inputBuffer.put(input);
        mediaCodec.queueInputBuffer(inputBufferIndex, 0, input.length, 0, 0);
    }
...

setPreviewCallbackWithBuffer からの呼び出しは次のようになります。

    int bufSize= 460800;
        camera.addCallbackBuffer(new byte[bufSize]);
        camera.setPreviewCallbackWithBuffer(new PreviewCallback() {

            public void onPreviewFrame(byte[] data, Camera arg1) {
                    codecs.encoder(data);
            }
        });
...

次のエラーメッセージが表示される

03-04 20:30:46.762: E/AndroidRuntime(26196): java.nio.BufferOverflowException
03-04 20:30:46.762: E/AndroidRuntime(26196): at java.nio.Buffer.checkPutBounds(Buffer.java:189)
03-04 20:30:46.762: E/AndroidRuntime(26196): at java.nio.ReadWriteDirectByteBuffer.put(ReadWriteDirectByteBuffer.java:100)
03-04 20:30:46.762: E/AndroidRuntime(26196): at java.nio.ByteBuffer.put(ByteBuffer.java:712)

さて、バイト バッファは非常に大きいですが、setPreviewCallbackWithBuffer は、サイズが 460800 のバッファを少なくとも 1 つ使用するように指示しています。では、この問題をどのように解決しますか?

4

1 に答える 1

1

これを試して

Parameters camParams = camera.getParameters();
int size = imageWidth * imageHeight;
size  = size * ImageFormat.getBitsPerPixel(camParams.getPreviewFormat()) / 8;
mBuffer = new byte[size]; // class variable
camera.addCallbackBuffer(mBuffer);
于 2013-06-03T12:50:51.160 に答える