我尝试使用Android Media Codec解码mp3音频数据流。 采样率为44100,解码工作正常,但延迟太大。所以我将采样率设置为16000,但现在解码器不再工作了。我在dequeueOutputBuffer中遇到了非法状态异常。
这是代码中可能出现问题的部分:
bufferInfo = new MediaCodec.BufferInfo();
outputBufferIndex = decoder.dequeueOutputBuffer(bufferInfo, -1);
while (outputBufferIndex >= 0) {
outputBuffer = decoder.getOutputBuffer(outputBufferIndex);
outputBuffer.position(bufferInfo.offset);
outputBuffer.limit(bufferInfo.offset + bufferInfo.size);
outData = new byte[bufferInfo.size];
outputBuffer.get(outData);
track.write(outData, 0, outData.length);
decoder.releaseOutputBuffer(outputBufferIndex, false);
outputBufferIndex = decoder.dequeueOutputBuffer(bufferInfo, -1);
}
我还尝试将dequeueOutputBuffer的超时设置为0,但这不会改变任何内容。
这是我收到的错误:
E/SoftMP3: mp3 decoder returned error 1
E/ACodec: [OMX.google.mp3.decoder] ERROR(0x80001001)
E/ACodec: signalError(omxError 0x80001001, internalError -2147483648)
E/MediaCodec: Codec reported err 0x80001001, actionCode 0, while in state 6
E/AndroidRuntime: FATAL EXCEPTION: Thread-79054
Process: com.example.jonas.audio_client, PID: 26394
java.lang.IllegalStateException
at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)
at android.media.MediaCodec.dequeueOutputBuffer(MediaCodec.java:1107)
如果我打印提取器获取的音频格式,我看到采样率设置为16000。
D/Format:: {bitrate=32000, mime=audio/mpeg, durationUs=6509000, channel-count=1, sample-rate=16000, bit-rate=32000}
感谢您的帮助!
答案 0 :(得分:1)
如果您在模拟器上运行此功能,请确保在模拟器设置中选择图形作为硬件:GLES 2.0 。软件版本似乎存在一些问题。
答案 1 :(得分:0)
我有一个类似的问题,但有一个视频编码器。我解决了我的问题,弄乱了我的视频的比特率,直到它工作。目前,我已经以32 * width * height * frameRate / 100
的比特率解决了我的问题。所以我建议你试着弄乱你的比特率。
我受到this answer的影响才能达到此解决方案。