2016-12-07 6 views
1

私のアプリケーションでAACでエンコードされたファイルをデコードし、MediaCodecオブジェクトの初期化に使用されるMediaFormatオブジェクトを初期化しようとしています。 MediaFormatオブジェクト一部のデバイスでMediaFormat.getByteBuffer( "csd-0")がnullを返す

MediaExtractor mediaExtractor = new MediaExtractor(); 
     try { 
      mediaExtractor.setDataSource(audioFilePath); 
     } catch (IOException e) { 
      return false; 
     } 
     Log.d(TAG, "Number of tracks in the file are:" + mediaExtractor.getTrackCount()); 

     MediaFormat mediaFormat = mediaExtractor.getTrackFormat(0); 

     Log.d(TAG, "mediaFormat:" + mediaFormat.toString()); 

     mSampleRate = mediaFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE); 
     Log.d(TAG, "mSampleRate: " + mSampleRate); 


     mChannels = mediaFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT); 

     Log.d(TAG, "mChannels number of channels: " + mChannels); 

     // Reading the duration from the file and converting from micro seconds to milliseconds. 
     mDuration = (int) (mediaFormat.getLong(MediaFormat.KEY_DURATION)/1000); 

     Log.d(TAG, "duration: " + mDuration); 

     // Getting the csd-0 info from the file .. 
     mCSDBuffer = mediaFormat.getByteBuffer("csd-0"); 

の変数私が直面しています問題は、文mCSDBuffer = mediaFormat.getByteBuffer("csd-0")は、一部のデバイスで同じファイルを掲載しnullフェッチということです。アプリケーションが稼働しており、アンドロイドAPIレベルが17,18、および19のarmabi-v7a/armabiプロセッサデバイスでこのエラーが発生しています。これらのエラーのほとんどはSamsungデバイスにあります。これの方向は?

答えて

2

csd-0バッファがヌルの場合、MediaCodecに渡されたときに正しくデコードすることが期待されます。 MediaCodecへの入力としてcsd-0のデータを設定しないことを選択した場合、nullの場合はそれを行いますか?一般的には、MediaCodecに直接パイプすれば、MediaExtractorの出力をデコードすることができます。

MediaExtractorからのデータ出力の実際のフォーマットはあまり厳密には規定されていませんので、実際にはメーカーによっては(主にサムスン)、独自のデコーダだけが処理する方法でこれを変更することが知られています。例えば、別の場合はhttps://code.google.com/p/android/issues/detail?id=74356です。

Android CTSテストは、MediaExtractorが一貫して動作するように、より一般的なコンテキストで使用できるように、またはMediaCodec以外のデコーダを使用するように厳密にテストするのが理想的です。 (たとえば、現在のサムスンの問題では、MediaExtractorを1つのデバイスで使用することはできません。ネットワーク経由で別のデバイスにデータを送信し、そこからデコードすることはできません)。

+0

私は、 "csd-0"バッファ(http://stackoverflow.com/a/32154154/2606411に記載されています)。これを使って手動で情報を設定することはできますか? – Swapnil

+0

これを使用できるかもしれません。しかし、そうした場合は、実際のオーディオパケットからADTSヘッダを取り除くべきでしょう。 IMO、MediaExtractorがADTS形式のデータを返すことを選択した場合(つまり、パケットに 'csd-0'とADTSヘッダーがない場合)、MediaCodecはそれを処理できるはずなので、編集する必要はないと思いますすべて。 – mstorsjo

+0

私たちは私たちが使用しているファイルをエンコードしており、ADTSヘッダーをすべてに設定しているので、手動でそのヘッダーを設定するのが理にかなっています。 – Swapnil

関連する問題