为什么流式传输的AAC音频不起作用,但一旦下载工作正常?

时间:2014-09-04 07:38:33

标签: audio-streaming aac mpeg

为什么Windows Media Player,PowerDVD和任何Android应用既不能播放我的AAC流,也不能播放一次(手动)下载?!

我是连续录音(麦克风)&将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;
}

我通过HTTP套接字和以下Content-Type(每个测试)发布它: audio / mp4a-latm,audio / aac,audio / mp4

没有连接的播放器会以播放开始,但如果我下载该文件并将其提供给同一播放器,则它可以正常工作。

套接字部分工作得非常好,因为它已经用于例如。 WAV和MP3流,但我不能让它为AAC运行。

有人有想法吗?我也很好奇。

0 个答案:

没有答案