Проблема с BufferOverflow

Когда я запускаю код ниже, я получил эту ошибку java.nio.BufferOverflowException Я пытаюсь создать потоковое видео с камеры Предварительный просмотр в Android, я получаю байтовые данные NV21 с камеры, и я попытался преобразовать их в формат mp4. Когда я пробую это сделать, я получил ошибку при запуске строки inputBuffer.put (данные);, как ее решить? Могу я попробовать другой способ конвертировать байт в .mp4?

private void encode(byte[] data) {
    inputBuffers = mMediaCodec.getInputBuffers();
    outputBuffers = mMediaCodec.getOutputBuffers();

    int inputBufferIndex = mMediaCodec.dequeueInputBuffer(-1);
    if (inputBufferIndex >= 0) {
        ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
        inputBuffer.clear();
        inputBuffer.put(data);
        mMediaCodec.queueInputBuffer(inputBufferIndex, 0, data.length, 0, 0);
    } else {
        return;
    }

    MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
    int outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo, 0);
    Log.i(TAG, "outputBufferIndex-->" + outputBufferIndex);
    do {
        if (outputBufferIndex >= 0) {
            ByteBuffer outBuffer = outputBuffers[outputBufferIndex];
            System.out.println("buffer info-->" + bufferInfo.offset + "--"
                    + bufferInfo.size + "--" + bufferInfo.flags + "--"
                    + bufferInfo.presentationTimeUs);
            byte[] outData = new byte[bufferInfo.size];
            outBuffer.get(outData);
            try {
                if (bufferInfo.offset != 0) {
                    fos.write(outData, bufferInfo.offset, outData.length
                            - bufferInfo.offset);
                } else {
                    fos.write(outData, 0, outData.length);
                }
                fos.flush();
                Log.i(TAG, "out data -- > " + outData.length);
                mMediaCodec.releaseOutputBuffer(outputBufferIndex, false);
                outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo,
                        0);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
            outputBuffers = mMediaCodec.getOutputBuffers();
        } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
            MediaFormat format = mMediaCodec.getOutputFormat();
        }
    } while (outputBufferIndex >= 0);
}

private void initCodec() {
    try {
        fos = new FileOutputStream(mVideoFile, false);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    try {
        mMediaCodec = MediaCodec.createEncoderByType("video/avc");
    } catch (IOException e) {
        e.printStackTrace();
    }
    MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc",
            320,
            240);
    mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 125000);
    mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);
    mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,
            MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar);
    mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
    mMediaCodec.configure(mediaFormat,
            null,
            null,
            MediaCodec.CONFIGURE_FLAG_ENCODE);
    mMediaCodec.start();

}

Укажите, в какой строке происходит исключение, и добавьте свой код конфигурации MediaCodec.

greeble31 17.12.2018 15:08

У меня есть код конфигурации MediaCodec, который я редактировал выше, я получил ошибку в этом коде "inputBuffer.put (data);"

Diego 18.12.2018 07:20

Похоже, вы используете жестко заданные размеры (320x240). Вы уверены, что ваша камера не поддерживает больший размер кадра? Пожалуйста, также добавьте код конфигурации вашей камеры.

greeble31 18.12.2018 16:42

да, мой друг, моя проблема в том, что я решил, спасибо, но я не могу получить звук из h264, только воспроизводя видео, как я могу воспроизвести видео со звуком

Diego 19.12.2018 06:40

Вы можете задать новый вопрос. Ищите такие вещи, как AAC и MediaMuxer.

greeble31 19.12.2018 15:10
0
5
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш MediaCodec был настроен на использование фиксированных размеров, 320x240, которые явно меньше, чем используемые рамки камеры. Если MediaCodec ожидает меньшие кадры, он будет поставлять меньшие inputBuffers, что приводит к BufferOverflowException.

Чтобы исправить это, настройте камеру на использование размеров 320x240 или настройте MediaCodec динамически на основе текущего выбранного размера предварительного просмотра камеры.

Другие вопросы по теме