2017-09-17 8 views
0

J'ai un problème avec le décodage du fichier mp3 en utilisant MediaCodec. Logcat dit que le problème est avec la ligne codec.queueInputBuffer(inputBufferId, 0, data.length, 0, 0) mais ça me semble juste.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

essayez d'utiliser MediaCodec.createByCodecName(). Même j'ai fait face à ce problème et je l'ai résolu en utilisant la méthode ci-dessus. J'ai remarqué dans la plupart des périphériques mediatek createDecoderByType ne fonctionne pas correctement. – Gautam

+0

@Gautam Je viens de le vérifier. Changé 'MediaCodec.createDecoderByType (" audio/mpeg ")' pour 'MediaCodec.createByCodecName (" OMX.google.mp3.decoder ")' mais l'effet est malheureusement le même. Merci d'essayer quand même. – Kristopher

Répondre

1

Ce qui est data ici - l'ensemble du fichier mp3? Vous devez le diviser en paquets individuels (par exemple en utilisant MediaExtractor)

Ensuite, lors de l'alimentation des données dans le tampon d'entrée, inputBuffer.wrap(data); ne fait pas ce que vous voulez. wrap est en fait une méthode statique qui crée un nouveau ByteBuffer. Ce que vous voulez, c'est inputBuffer.clear(); inputBuffer.put(data);.

+0

Oui, 'data' était un fichier mp3 entier. Que voulez-vous dire en écrivant "divisé en paquets individuels"? Les paquets signifient des échantillons, des cadres ou quelque chose d'autre? – Kristopher

+1

Les paquets désignent les unités d'accès individuelles ou les cadres. – mstorsjo

+0

Merci. J'ai un autre problème maintenant mais c'est pour une autre question :) – Kristopher