2017-09-17 10 views
0

MediaCodecを使用してmp3ファイルのデコードに問題があります。 Logcatは問題が行codec.queueInputBuffer(inputBufferId, 0, data.length, 0, 0)であると言うが、それは私に公正に見える。MediaCodec IllegalArgumentException

コード:

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

MediaCodec.createByCodecName()を試してみてください。私もこの問題に直面し、私は上記の方法で解決しました。ほとんどのmediatekデバイスで気づいたcreateDecoderByTypeが正しく動作しません。 – Gautam

+0

@Gautam私はちょうどそれをチェックしました。 'MediaCodec.createByCodecName(" OMX.google.mp3.decoder ")'に対して 'MediaCodec.createDecoderByType(" audio/mpeg ")'を変更しましたが、残念ながらその効果は同じです。とにかく試してくれてありがとう。 – Kristopher

答えて

1

ここdata何である - 全体のmp3ファイル? MediaExtractorなどを使用して個別のパケットに分割する必要があります

入力バッファにデータを入力するときに、inputBuffer.wrap(data);は必要な処理を行いません。 wrapは、実際には新しいByteBufferを作成する静的メソッドです。あなたがしたいのはinputBuffer.clear(); inputBuffer.put(data);です。

+0

はい、「データ」はmp3ファイル全体でした。 「無欠のパケットに分割する」とはどういう意味ですか?パケットはサンプル、フレームなどを意味しますか? – Kristopher

+1

パケットは、個々のアクセスユニットまたはフレームを意味します。 – mstorsjo

+0

ありがとうございます。私は今別の問題がありますが、これは別の質問です:) – Kristopher

関連する問題