Что я пытаюсь сделать: использовать MediaCodec для Android, чтобы кодировать необработанные образцы аудио PCM в исходный файл AAC.Как создать элементарный поток AAC ADTS с Android MediaCodec
Проблема: У меня есть:, когда я использую FFMPEG для упаковки сгенерированного необработанного файла AAC в контейнер M4A, FFMPEG жалуется на отсутствие параметров кодека в файле.
Деталь:
Так как я не могу найти MediaCodec пример кода для аудио кодера, который генерирует выходной файл AAC, я попытался изменить кодировщик видео в аудио кодера. Исходный код здесь: source_code
Я настроил аудио кодер, как это:
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»
FWIW, тест аудиокодера CTS - https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/EncoderTest.java – fadden
@fadden: Я тоже посмотрел на этот тест. Он не генерирует выходной файл AAC. Я попытался добавить код для записи потока бит в файл. Сгенерированный файл имеет ту же проблему: ffmpeg не распознает его как файл AAC. Я только что отредактировал свой вопрос, чтобы добавить, что я не могу найти образец кода, который генерирует бит-файл (AAC в моем случае). – hubeir
После прочтения [этого сообщения] (http://stackoverflow.com/questions/12942201/decoding-aac-using-mediacodec-api-on-android) и [этот пост] (http://stackoverflow.com/questions/18784781/how-to-initialize-mediaformat-to-configure-a-mediacodec-to-decode-raw-aac-data), я проверил вывод энкодера, когда _italic_ ** bold ** '(info.flags & MediaCodec. BUFFER_FLAG_CODEC_CONFIG)! = 0'. Выходной сигнал составляет 4 байта: 0xF8, 0xE8, 0x40, 00. Они не являются ESDS (дескриптор элементарного потока). Кто они такие? – hubeir