是的,編解碼器配置2個字節是您收到的初始值。是的,它是原始數據塊。你可以看到如何在編碼時導出下面的格式。我最初試圖按照文檔說,他們是在拉姆格式,並試圖解析。然後我在android文檔中發現了一些'diff',表示輸出確實是原始塊。那麼知道,這只是爲我的需求選擇一個容器的問題。特別是,我需要adts容器而不是flv或mp4。
將有效載荷數據複製到足夠容量的數組中,只需添加您的位。所以在網上淘了我的解決方案後,我產生了以下代碼:
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);
進一步的研究使我相信,CSD-0包含ESDS(基本流描述符)。查看Android源代碼中的avc_utils.cpp中的MakeAACCodecSpecificData,我發現前5位是對象類型(2),接下來的4位是頻率索引(4 = 48000),接下來的4位是通道配置(2)。 [此wiki頁面](http://wiki.multimedia.cx/index.php?title=Understanding_AAC)表示剩餘的比特是幀長度,取決於核心解碼器和擴展標誌。我正在使用MediaFormat.createAudioFormat(),它應該設置ESDS的重要元素。 –