2016-05-24 42 views
2

Ich versuche, einen MP3-Audio-Datenstrom mit Android Media Codec zu dekodieren. Mit einer Abtastrate von 44100 funktioniert die Decodierung gut, aber die Latenz ist zu groß. Also habe ich die Abtastrate auf 16000 gesetzt, aber jetzt funktioniert der Decoder nicht mehr. Ich erhalte eine ungültige Ausnahme bei dequeueOutputBuffer. Media Codec dequeueOutputBuffer IllegalStateException

Dies ist der Teil des Codes, wo das Problem sein könnte:

     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); 


         } 

ich auch das Timeout von dequeueOutputBuffer auf 0 zu setzen versucht, aber das ändert nichts.

Dies ist der Fehler, den ich erhalte:

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) 

Wenn ich das Audio-Format drucken, der Extractor wird, sehe ich, dass die Sample-Rate zu 16000.

D/Format:: {bitrate=32000, mime=audio/mpeg, durationUs=6509000, channel-count=1, sample-rate=16000, bit-rate=32000} 

Dank eingestellt ist für irgendeine Hilfe!

Antwort

0

Ich hatte ein ähnliches Problem, aber mit einem Video-Encoder. Ich löste mein Problem, indem ich mit der Bitrate meines Videos herumspielte, bis es funktionierte. Fürs Erste habe ich mein Problem mit einer Bitrate von 32 * width * height * frameRate/100 gelöst. Also würde ich empfehlen, mit Ihrer Bitrate zu versuchen.

Ich wurde von this answer beeinflusst, um zu dieser Lösung zu gelangen.

+0

Ich habe versucht, 'int bitrate = 450000;' zu 'int bitrate = 32 * resultHeight * resultWidth * 25/100;' zu ändern, aber es hat immer noch nicht funktioniert. Ich bekomme [diese] (https://github.com/Tourenathan-G5organisation/SiliCompressor/issues/16) gleichen Fehler. – NarendraJi

0

Wenn Sie dies auf einem Emulator sicher ausgeführt werden, dass Sie Graphics als Hardware ausgewählt haben: GLES 2.0 in Emulator-Einstellungen. Es gibt ein Problem mit der Softwareversion.