Android PCM - ›AAC = M4A против MPEG2-TS

Как я могу упаковать необработанные данные AAC в поток 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 или Google Music Player.

Теперь мой вопрос:

Я хотел бы отправить закодированные данные в виде HTTP LIVE STREAM (HLS) некоторым рендерерам, как будто я уже делаю это с WAV и MP3-потоками.

Но если я отправляю его в Android-приложение, поток не начинает воспроизводиться, пока я не прерву запись и, следовательно, не сброшу / не завершу поток. С МР3 проблем нет, здесь воспроизведение начинается через секунды.

Что касается страницы "Поддерживаемые типы мультимедиа" Android, HLS - это только поддерживается на

Черновик протокола прямой трансляции HTTP / HTTPS: только медиафайлы MPEG-2 TS

Кто подскажет, как упаковать необработанный AAC-поток в TS-поток MPEG-2, а не в MPEG4-поток, как сейчас?

Я новичок в этой области, прошу прощения за ошибки.


person Martin L.    schedule 03.09.2014    source источник


Ответы (1)


Вы как бы отвечаете на свой вопрос. Вам необходимо установить версию ADTS в MPEG2 вместо MPEG4. packet[1] = (byte) 0xF1;

Также packet[6] = (byte) 0xFC; является правильным, если вы не знаете значение заполнения буфера.

подробнее см. здесь: http://wiki.multimedia.cx/index.php?title=ADTS

person szatmary    schedule 03.09.2014
comment
Большое спасибо за ваш ответ, особенно за точные детали. К сожалению, я понял, что AAC-поток нельзя воспроизводить ни на Android, ни на Windows Media Player и других плеерах. Как только я беру поток, загружаю его в файл .m4a или .aac, файл можно будет воспроизвести на всех плеерах. Но это уже другая тема :) - person Martin L.; 04.09.2014