Как создать элементарный поток AAC ADTS с помощью Android MediaCodec

Что я пытаюсь сделать: использовать Android '• MediaCodec для кодирования необработанных аудиосэмплов PCM в необработанный файл AAC.

У меня проблема: Когда я использую FFMPEG для упаковки сгенерированного необработанного файла AAC в контейнер M4A, FFMPEG жалуется на отсутствие параметров кодека в файле.

Подробности:

Так как я могуЧтобы найти пример кода MediaCodec для аудиокодера, который генерирует выходной файл AAC, я попытался преобразовать видеокодер в аудиокодер. Оригинальный код здесь:исходный код

Я настроил аудио кодер так:

    mEncoderFormat = MediaFormat.createAudioFormat("audio/mp4a-latm", (int)mAudioSampleRate, 2);

    // redundant?
    mEncoderFormat.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
    mEncoderFormat.setInteger(MediaFormat.KEY_AAC_PROFILE, 
                      MediaCodecInfo.CodecProfileLevel.AACObjectELD);
    mEncoderFormat.setInteger(MediaFormat.KEY_SAMPLE_RATE, kSampleRates);
    mEncoderFormat.setInteger(MediaFormat.KEY_BIT_RATE, kBitRates);
    mEncoderFormat.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 2);
    testEncoderWithFormat("audio/mp4a-latm", mEncoderFormat);

    try {
        codec.configure(
                mEncoderFormat,
                null /* surface */,
                null /* crypto */,
                MediaCodec.CONFIGURE_FLAG_ENCODE);
    } catch (IllegalStateException e) {
        Log.e(TAG, "codec '" + componentName + "' failed configuration.");
        return;
    }
    Log.d(TAG, "  testEncoder configured with format = " + format);

Затем я добавляю кодировщику по 10 мсек отсчетов ИКМ на кадр. Кодер берет каждый кадр, генерирует кадр битового потока, и я записываю битовый поток в FileOutputStream. Цикл продолжается до конца входного файла.

Код работает до конца. Я делаю 'adb pull ' чтобы получить сгенерированный файл AAC с устройства на мой ПК и использовать FFMPEG для его чтения. Ниже приведена команда и выдается ошибка FFMPEG:

$ ffmpeg -f aac -i BlessedNoColor_nexus7_api18.aac
ffmpeg version N-45739-g04bf2e7 Copyright (c) 2000-2012 the FFmpeg developers
  built on Oct 20 2012 00:20:36 with gcc 4.7.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-pthreads --enable-runt
ime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libass -
-enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enab
le-libgsm --enable-libmp3lame --enable-libnut --enable-libopenjpeg --enable-libo
pus --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheo
ra --enable-libutvideo --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-li
bvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --ena
ble-zlib
  libavutil      51. 76.100 / 51. 76.100
  libavcodec     54. 67.100 / 54. 67.100
  libavformat    54. 33.100 / 54. 33.100
  libavdevice    54.  3.100 / 54.  3.100
  libavfilter     3. 19.103 /  3. 19.103
  libswscale      2.  1.101 /  2.  1.101
  libswresample   0. 16.100 /  0. 16.100
  libpostproc    52.  1.100 / 52.  1.100
[aac @ 00000000002efae0] channel element 2.0 is not allocated
[aac @ 00000000003cf520] decoding for stream 0 failed
[aac @ 00000000003cf520] Could not find codec parameters for stream 0 (Audio: aac, 0 channels, s16): unspecified sample rate
Consider increasing the value for the 'analyzeduration' and 'probesize' options
[aac @ 00000000003cf520] Estimating duration from bitrate, this may be inaccurate

BlessedNoColor_nexus7_api18.aac: could not find codec parameters

Мои вопросы: я

мы настроили кодировщик перед вызовом codec.start (). Почему в сгенерированном файле AAC отсутствуют параметры кодека?В исходном примере видеокодека «Параметры»CSD-0" передаются из кодера в декодер, но явно не записываются в файл битового потока. Нужно ли записывать их в файл AAC явно?Я делю входные выборки PCM на 10 мс на кадр, что не обязательно дает полный выходной пакет. Для каждого входного кадра я просто записываю то, что кодировщик выводит в файл. Это повод для беспокойства?

Любая помощь будет высоко оценена. Это'было бы здорово, если бы есть пример проекта, который делает то, что яЯ пытаюсь сделать здесь. Если мой исходный код может помочь вам помочь мне, явыложу. Мне нужно сделать уборку. Спасибо!

редактировать: Изменил название с "Элементарный файл AAC, сгенерированный MediaCodec без параметров кодека " к "Как создать элементарный поток AAC ADTS с помощью Android MediaCodec "

Ответы на вопрос(1)

Ваш ответ на вопрос