Android PCM - > AAC = M4A与MPEG2-TS

时间:2014-09-03 13:39:36

标签: android http-live-streaming aac mpeg2-ts

如何将原始AAC数据打包成MPEG2-TS流?

我是连续录音(麦克风)&将Android内部的PCM音频压缩到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或Google音乐播放器。

现在我的问题:

我想将编码数据作为HTTP LIVE STREAM(HLS)发送给某些渲染器,就像我已经使用WAV和MP3流一样。

但是,如果我将其发送到Android应用程序,则流不会开始播放,直到我中断录制并因此刷新/完成流。没有MP3问题,这里播放在几秒钟后开始。

关于Android的&#34; Supported Media Types&#34; -page,仅支持HLS

  

HTTP / HTTPS直播流草稿协议:仅限MPEG-2 TS媒体文件

谁能告诉我,如何将原始AAC流打包成MPEG-2 TS流而不是像现在一样打包成MPEG4流?

我是这个地区的新人,请原谅错误。

1 个答案:

答案 0 :(得分:0)

你可以回答自己的问题。您需要将ADTS版本设置为MPEG2而不是MPEG4。 packet[1] = (byte) 0xF1;

除非您知道缓冲区充满度值,否则packet[6] = (byte) 0xFC;也是正确的。

在此处查看更多信息: http://wiki.multimedia.cx/index.php?title=ADTS