MediaMuxer.writedata вызывает только Illegal bufferInfo, но только с Android 9 и firebase - PullRequest
0 голосов
/ 21 апреля 2020

Я записываю немного аудио и хочу экспортировать его в файл, используя MediaCodec и MediaMuxer. Все отлично работает на всех моих устройствах, но когда я отправляю приложение на консоль google play и проверяю отчеты cra sh, странный cra sh продолжает возвращаться.

Любопытно, что это ошибка Поднимается только пожарными базами, когда используется конкретно Pixel 3 и Android 9. Он генерирует исключение незаконного аргумента из MediaMuxer.writedata(...) (подробности см. в коде ниже). Полное сообщение об ошибке выглядит следующим образом: IllegalArgument exception: bufferInfo must specify a valid buffer onset, size and presentation time

Я вставил собственное исключение и повторно отправил приложение, чтобы получить дополнительную информацию об исключении. Кажется, что проблема c BufferInfo имеет следующие атрибуты: info.offset = 0, info.size = 2 и info.presentationTimeUs = -1.

Конечно, время представления является проблемой, и этот буфер, кажется, не содержит очень полезные данные, но я хотел бы понять, что лучше перед тем, как приступить к исправлению spme hacky (которое я все равно не смог бы проверить очень безопасно, потому что это не происходит на моих устройствах).

fun processOutputBuffer(info: MediaCodec.BufferInfo, encoderOutputBuffer: Int) {

        val outputBuffer = encoder!!.outputBuffers.get(encoderOutputBuffer!!)
        val outputBufferSize = info.size

        if (outputBufferSize > 0) {

            outputBuffer.position(info.offset)
            outputBuffer.limit(info.offset + info.size)
            muxer.writeSampleData(0, outputBuffer, info)

        }

        if (info.flags == MediaCodec.BUFFER_FLAG_END_OF_STREAM){
            isOutputEOS = true
        }

        encoder!!.releaseOutputBuffer(encoderOutputBuffer, false)
    }
while (!isOutputEOS) {
            encoderOutputBufferIndex = encoder!!.dequeueOutputBuffer(info, TIMEOUT_SEC)

            if (encoderOutputBufferIndex === MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { 

                val newFormat = encoder!!.outputFormat
                val trackIndex = muxer.addTrack(newFormat)
                numTracksAdded++
                if (numTracksAdded === TOTAL_NUM_TRACKS) {
                    muxer.start()
                    mMuxerStarted = true
                    Log.i(TAG, "All tracks added. Muxer started")
                }
            }
            else if (encoderOutputBufferIndex!! >= 0){
                processOutputBuffer(info, encoderOutputBufferIndex)
            }
            else{
                // Sleep a bit, to wait for the next buffer
                sleep(1)
            }

        }

...