2013-01-14 91 views
1

我試圖使用Android的MediaCodec將原始音頻數據編碼爲aac。 我通過缺乏很多Andoid文檔工作。我目前能夠使用AudioRecord來錄製音頻,並在飛行中進行編碼。Android MediaCodec - 將音頻動態編碼爲aac

問題是生成的輸出似乎不是有效的。沒有播放機可以播放,MediaExtractor無法打開文件。後者可能是因爲輸出未被封裝到有效的容器中。沒有關於如何處理編碼器輸入緩衝區大小的明確文檔。所以我試圖完全填充每個輸入緩衝區,然後再次排隊,但沒有成功。我也嘗試提交END_OF_STREAM_FLAG和最後一個緩衝區也沒有成功。

有人成功地使用過MediaEncoder,並且可以提供一些關於如何正確使用它的信息嗎?是否有可能生成像mpeg4這樣的有效媒體容器?

在此先感謝!

回答

2

中提到的爲其選擇容器。我更喜歡adts。

將有效載荷數據複製到一個足夠大的容器中,只需添加你的位。所以在網上淘了我的解決方案後,我工作的一些片斷到位

profile =(configParams[0]>>3)&0x1f; 

    frequency_index = (this.configParams[0]&0x7) <<1 | (this.configParams[1]>>7) &0x1; 

    channel_config = (this.configParams[1]>>3) &0xf; 

    int finallength = encoded_length + 7;  
    ENCodedByteArray[0] = (byte) 0xff; 
    ENCodedByteArray[1] = (byte) 0xf1; 
    ENCodedByteArray[2] = (byte) (((profile - 1) << 6) + (frequency_index << 2) +(channel_config >> 2)); 
    ENCodedByteArray[3] = (byte) (((channel_config & 0x3) << 6) + (finallength >> 11)); 
    ENCodedByteArray[4] = (byte)((finallength & 0x7ff) >> 3); 
    ENCodedByteArray[5] = (byte) (((finallength & 7) << 5) + 0x1f) ; 
    ENCodedByteArray[6] = (byte) 0xfc; 

使用類似

  byte chunkADTS[]=new byte[info.size + 7]; 
      fillInADTSHeader(chunkADTS,info.size); 
      outputBuffers[bR].get(chunkADTS,7,info.size); 
      buffer.pushData(chunkADTS); 
+0

在Android 4.3及以上版本,你可以使用[MediaMuxer](http://developer.android .com/reference/android/media/MediaMuxer.html)將MediaCodec的輸出打包到MPEG-4容器中。作爲獎勵,當AAC包含在.MP4中時,它不需要每個數據包的ADTS標頭。我有一個快速n'髒的例子[這裏](https://github.com/OnlyInAmerica/HWEncoderExperiments/blob/audioonly/HWEncoderExperiments/src/main/java/net/openwatch/hwencoderexperiments/AudioEncoder.java)。 – dbro

+0

你能提供一個更詳細的例子嗎?我想實施這個解決方案,但我不清楚它是如何融合在一起的。我正在下載AAC-ATDS音頻文件並嘗試在本地播放。如果我使用MediaCodec解碼器將aac解碼成PCM,然後將其饋送到音軌中,我可以在本地播放它。我寧願將其重新編碼爲可與常規媒體播放器一起播放的格式。 (我不知道爲什麼下載的文件上的ATDS標題不起作用,但我相信MediaCodec解碼器會去除它們;如果它們真的存在的話)。 – user1743524

相關問題