我試圖在我的應用程序中解碼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
對於某些設備上的同一個文件。該應用程序正在生產中,並且我在armabi-v7a/armabi
處理器設備上看到此錯誤,該設備的android API級別爲17,18和19,並且大多數這些錯誤都在三星設備上。這方面的任何方向?
我也有一個自定義函數如http://stackoverflow.com/a/32154154/2606411中所述的「csd-0」緩衝區。我可以用它來手動設置信息嗎? – Swapnil
您可能可以使用它。但是,如果你這樣做,你應該也可以從實際的音頻數據包中去掉ADTS頭。 IMO,如果MediaExtractor選擇以ADTS格式返回數據(即數據包中沒有'csd-0'和ADTS標頭),那麼MediaCodec應該能夠處理它,所以我認爲你不需要做任何編輯所有。 – mstorsjo
我們自己對我們使用的文件進行了編碼,並且我們爲所有文件設置了ADTS標題,所以我想手動設置標題是有意義的。 – Swapnil