2014-09-03 144 views
0

如何將原始AAC數據打包成MPEG2-TS數據流?Android PCM - > AAC = M4A與MPEG2-TS

我連續重新編碼(麥克風)&壓縮PCM音頻內的Android到AAC:

encoder = MediaCodec.createEncoderByType("audio/mp4a-latm"); 
    MediaFormat format = new MediaFormat(); 
    format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm"); 
    format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 2); 
    format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100); 
    format.setInteger(MediaFormat.KEY_BIT_RATE, 64 * 1024); 
    format.setInteger(MediaFormat.KEY_AAC_PROFILE, 
      MediaCodecInfo.CodecProfileLevel.AACObjectLC); 
    encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); 

由於這產生了原始的,無頭AAC,我還添加必需的MPEG報頭的每個幀:

private void addADTStoPacket(byte[] packet, int packetLen) { 
    int profile = 2; // M4A LC 
         // 39=MediaCodecInfo.CodecProfileLevel.AACObjectELD; 
    int freqIdx = 4; // 44.1KHz 
    int chanCfg = 2; // CPE 

    // fill in ADTS data 
    packet[0] = (byte) 0xFF; 
    packet[1] = (byte) 0xF9; 
    packet[2] = (byte) (((profile - 1) << 6) + (freqIdx << 2) + (chanCfg >> 2)); 
    packet[3] = (byte) (((chanCfg & 3) << 6) + (packetLen >> 11)); 
    packet[4] = (byte) ((packetLen & 0x7FF) >> 3); 
    packet[5] = (byte) (((packetLen & 7) << 5) + 0x1F); 
    // packet[6] = (byte) 0xFC; 
    packet[6] = (byte) 0x00;// number of frames = 1; 
} 

這工作正常,我可以發揮創建的AAC文件例如。與VLC或谷歌音樂播放器。

現在我的問題:

我想發送的編碼數據作爲HTTP LIVE STREAM(HLS)一些渲染像我已經與WAV和MP3流這樣做。

但是,如果我將它發送到Android應用程序,則該流不會開始播放,直到我中斷錄製並因此刷新/結束流。 MP3沒有問題,這裏播放是在幾秒鐘後開始的。

關於安卓的 「Supported Media Types」 -page,HLS只支持

HTTP/HTTPS協議直播流媒體草案:MPEG-2 TS的媒體文件只

誰能告訴我如何將原始AAC流打包成MPEG-2 TS流,而不是像現在那樣打包成MPEG4流?

我是這方面的新手,請原諒錯誤。

回答

0

你有點回答你自己的問題。您需要將ADTS版本設置爲MPEG2而不是MPEG4。 packet[1] = (byte) 0xF1;

另外packet[6] = (byte) 0xFC;是正確的,除非你知道緩衝區充滿度值。

多看這裏: http://wiki.multimedia.cx/index.php?title=ADTS

+0

你的答案非常感謝,尤其是具體細節。令人遺憾的是,我意識到AAC流既不能在Android上播放,也不能在Windows媒體播放器和其他播放器上播放。一旦我將流下載到.m4a或.aac文件中,就可以在所有播放器上播放該文件。但這是另一個話題:) – 2014-09-04 07:28:50