2017-09-17 6 views
0

Ich habe ein Problem mit der Decodierung von MP3-Dateien mit MediaCodec. Logcat sagt das Problem ist mit der Linie codec.queueInputBuffer(inputBufferId, 0, data.length, 0, 0), aber es sieht fair zu mir.MediaCodec IllegalArgumentException

Code:

if(Build.VERSION.SDK_INT >= 21) { 

     try { 
      codec = MediaCodec.createDecoderByType("audio/mpeg"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     codec.setCallback(new MediaCodec.Callback() { 

      @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) 
      @Override 
      public void onInputBufferAvailable(MediaCodec mc, int inputBufferId) { 
       ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferId); 

       inputBuffer.wrap(data); 
       codec.queueInputBuffer(inputBufferId, 0, data.length, 0, 0); // java.lang.IllegalArgumentException 

      } 
     } 
} 

logcat:

FATAL EXCEPTION: main 
Process: pl.test.projectx, PID: 18252 

java.lang.IllegalArgumentException 

at android.media.MediaCodec.native_queueInputBuffer(Native Method) 

at android.media.MediaCodec.queueInputBuffer(MediaCodec.java:2334) 

at pl.test.projectx.Decoder$2.onInputBufferAvailable(Decoder.java:107) 

at android.media.MediaCodec$EventHandler.handleCallback(MediaCodec.java:1663) 

at android.media.MediaCodec$EventHandler.handleMessage(MediaCodec.java:1621) 

at android.os.Handler.dispatchMessage(Handler.java:105) 

at android.os.Looper.loop(Looper.java:164) 

at android.app.ActivityThread.main(ActivityThread.java:6541) 

at java.lang.reflect.Method.invoke(Native Method) 

at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
+1

versuchen Sie es mit MediaCodec.createByCodecName(). Obwohl ich mit diesem Problem konfrontiert war, löste ich es mit der oben genannten Methode. Mir ist aufgefallen, dass in den meisten Mediatek-Geräten createDecoderByType nicht richtig funktioniert. – Gautam

+0

@Gautam Ich habe es gerade überprüft. Changed 'MediaCodec.createDecoderByType (" audio/mpeg ")' für 'MediaCodec.createByCodecName (" OMX.google.mp3.decoder ")' aber der Effekt ist leider der selbe. Danke für den Versuch trotzdem. – Kristopher

Antwort

1

Was ist data hier - die ganze mp3-Datei? Sie müssen es in einzelne Pakete aufteilen (z. B. mit MediaExtractor)

Dann, wenn die Daten in den Eingangspuffer, inputBuffer.wrap(data); nicht tun, was Sie wollen. wrap ist eigentlich eine statische Methode, die eine neue ByteBuffer erstellt. Was Sie wollen, ist .

+0

Ja, 'Daten' waren ganze MP3-Dateien. Was meinst du mit "in einzelne Pakete aufgeteilt"? Pakete bedeuten Samples, Frames oder etwas anderes? – Kristopher

+1

Pakete bedeutet einzelne Zugangseinheiten oder Rahmen. – mstorsjo

+0

Danke. Ich habe jetzt ein anderes Problem, aber das ist für eine andere Frage :) – Kristopher