Я записываю немного аудио и хочу экспортировать его в файл, используя 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)
}
}