2016-12-07 56 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對於某些設備上的同一個文件。該應用程序正在生產中,並且我在armabi-v7a/armabi處理器設備上看到此錯誤,該設備的android API級別爲17,18和19,並且大多數這些錯誤都在三星設備上。這方面的任何方向?

回答

2

如果csd-0緩衝區爲空,那麼我認爲它傳遞到MediaCodec時仍然會正確解碼。是否,如果您只選擇不將csd-0數據設置爲MediaCodec的輸入,如果它爲空?一般來說,如果您直接將其傳輸到MediaCodec,您應該能夠解碼MediaExtractor輸出。

雖然MediaExtractor輸出的數據的實際格式並不是非常嚴格的規定,但實際上已知有些製造商(主要是三星)以只有他們自己的解碼器處理的方式改變了它。見例如https://code.google.com/p/android/issues/detail?id=74356另一種情況相同。

理想情況下,Android CTS測試將更加嚴格,以確保MediaExtractor的行爲一致,允許其在更通用的環境中使用,或者使用比MediaCodec更多的解碼器。 (例如,對於目前的三星問題,您不能在一臺設備上使用MediaExtractor,通過網絡將提取的數據發送到另一臺設備並在那裏解碼。)

+0

我也有一個自定義函數如http://stackoverflow.com/a/32154154/2606411中所述的「csd-0」緩衝區。我可以用它來手動設置信息嗎? – Swapnil

+0

您可能可以使用它。但是,如果你這樣做,你應該也可以從實際的音頻數據包中去掉ADTS頭。 IMO,如果MediaExtractor選擇以ADTS格式返回數據(即數據包中沒有'csd-0'和ADTS標頭),那麼MediaCodec應該能夠處理它,所以我認爲你不需要做任何編輯所有。 – mstorsjo

+0

我們自己對我們使用的文件進行了編碼,並且我們爲所有文件設置了ADTS標題,所以我想手動設置標題是有意義的。 – Swapnil

相關問題