如何將原始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流?
我是這方面的新手,請原諒錯誤。
你的答案非常感謝,尤其是具體細節。令人遺憾的是,我意識到AAC流既不能在Android上播放,也不能在Windows媒體播放器和其他播放器上播放。一旦我將流下載到.m4a或.aac文件中,就可以在所有播放器上播放該文件。但這是另一個話題:) – 2014-09-04 07:28:50