2014-09-28 116 views
1

我已經使用MediaCodec成功實現了編碼/解碼原始AAC-LC。我使用了與here相同的技術來編碼數據。但是,我存儲原始AAC數據(不含標題),然後在傳送數據通過MediaCodec解碼器時即刻附加標題。這一切對於運行Android 4.4的Nexus 4和Nexus 5都非常完美。然而,在Galaxy Nexus的(運行Android 4.3),我得到:使用MediaCodec解碼原始AAC音頻數據可在Android 4.4上使用,但不能使用4.3

W/SoftAAC2(1234): AAC decoder returned error 16388, substituting silence 

錯誤16388意味着decode frame error

我試過了,沒有初始的MediaCodec.BUFFER_FLAG_CODEC_CONFIG,但是沒有什麼區別。

這裏是(使用配置數據包),以重現該錯誤最簡單的情況:

MediaFormat format = new MediaFormat(); 
format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100); 
format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1); 
format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm"); 
format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC); 
format.setInteger(MediaFormat.KEY_IS_ADTS, 1); 

byte[] bytes = new byte[]{(byte) 0x11, (byte)0x90}; 
ByteBuffer bb = ByteBuffer.wrap(bytes); 
format.setByteBuffer("csd-0", bb); 

MediaCodec codec = MediaCodec.createDecoderByType("audio/mp4a-latm"); 
codec.configure(format, null /* surface */, null /* crypto */, 0 /* flags */); 
codec.start(); 
ByteBuffer[] codecInputBuffers = codec.getInputBuffers(); 

int inputBufIndex = codec.dequeueInputBuffer(TIMEOUT_US); 
if (inputBufIndex >= 0) { 
    ByteBuffer dstBuf = codecInputBuffers[inputBufIndex]; 
    byte[] data = {-1, -7, 80, 0, 1, 63, -4, 18, 8}; // values taken from SO answer linked above (chanCfg = 1, packetLen = 9) 
    dstBuf.clear(); 
    dstBuf.put(data); 
    codec.queueInputBuffer(inputBufIndex, 0, data.length, 0, MediaCodec.BUFFER_FLAG_CODEC_CONFIG); 
} 

顯然有很多更的代碼比這一點,但是這包括所有的執行的代碼最多的點錯誤消息。

回答

2

解決方案是不是包含ADTS標頭。 4.3和4.4都支持沒有ADTS報頭的數據包。

相關問題