私のアプリケーションで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デバイスにあります。これの方向は?
私は、 "csd-0"バッファ(http://stackoverflow.com/a/32154154/2606411に記載されています)。これを使って手動で情報を設定することはできますか? – Swapnil
これを使用できるかもしれません。しかし、そうした場合は、実際のオーディオパケットからADTSヘッダを取り除くべきでしょう。 IMO、MediaExtractorがADTS形式のデータを返すことを選択した場合(つまり、パケットに 'csd-0'とADTSヘッダーがない場合)、MediaCodecはそれを処理できるはずなので、編集する必要はないと思いますすべて。 – mstorsjo
私たちは私たちが使用しているファイルをエンコードしており、ADTSヘッダーをすべてに設定しているので、手動でそのヘッダーを設定するのが理にかなっています。 – Swapnil