【问题标题】:Android PCM -> AAC = M4A vs. MPEG2-TSAndroid PCM -> AAC = M4A 与 MPEG2-TS
【发布时间】:2014-10-28 01:08:48
【问题描述】:

如何将原始 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的“Supported Media Types”页面,HLS仅支持

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

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

我是这个领域的新手,请原谅错误。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢您的回答,尤其是确切的细节。遗憾的是,我意识到 AAC 流既不能在 Android 上播放,也不能在 Windows Media Player 和其他播放器上播放。一旦我获取流,将其下载到 .m4a 或 .aac 文件中,该文件就可以在所有播放器上播放。但这是另一个话题:)
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2019-06-27
    • 2013-01-28
    • 2012-06-05
    • 1970-01-01
    • 2012-12-31
    • 2012-01-16
    相关资源
    最近更新 更多