Здравствуйте, Lexx47, Вы писали:
L>Здравствуйте, roro,спасибо за ответ!
L>Вы писали:
R>>вот тут вообще нипонятно,
L>>> int out_samples = av_rescale_rnd(swr_get_delay(swr, in_smprt) +in_samples, (int)audio_st->codec->sample_rate, in_smprt, AV_ROUND_UP);
R>>av_rescale_rnd — Rescales a 64-bit integer with specified rounding.
R>> а вы из нее вычитали количество семплов.
L>Меня это тоже несколько встревожило, но такой вариант пересчета количества выходных семплов я обнаружил на оф. документации ffmpeg'а.
Посчитал на калькуляторе, да правильно сходится.
Заметил что в коде swr context создается на каждом фрейме, обычно его один раз инициализируют, возможно он накапливает какие-то данные, между вызовами ресемплинга.
L>>>Камера отдает мне аудио в виде 16-бит PCM буферами по 512 семплов в каждом (причем не зависимо от выбранного на камере семлпрейта (выбрать можно 16, 24,32 и 48 кГц)). Если я беру эти данные и кодирую ААС енкодером настроенным на соответствующий семплрейт (через libfaac), то на выходе слышу сильно замедленный и прерывистый звук (как будто после каждого аудио фрейма добавляют кусок тишины).
R>>Это очень странно, проверьте правильно ли вытаскивается буфер, там либо пакеты должны чаше приходить либо размер буфера не 512.
R>>проверьте внимательно параметры, скорее всего ошибка в какой-нибудь мелочи.
L>Проверил настройки кодека и информацию из семпл-буффера — пока ничего нового не нашел. Еще провел такой тест: попробовал кодировать всё с такими же параметрами, но в mp3 ( через libmp3lame). Тоесть поменял только инициализацию аудио кодека на:
L>L> //oc->oformat->audio_codec = AV_CODEC_ID_AAC;
oc->>oformat->audio_codec = AV_CODEC_ID_MP3;
L>...
L> //audio_st->codec->sample_fmt = AV_SAMPLE_FMT_S16;
L> audio_st->codec->sample_fmt = AV_SAMPLE_FMT_S16P;
L> //audio_st->codec->sample_rate = 48000;
L> audio_st->codec->sample_rate = 44100; // семплрейт поменял из за того что flv контейнер не захотел принимать mp3 c 48 kHz.
L>
L>В таком случае аудио воспроизводиться нормально, причем для любого входного семплрейта. Тоесть выходит ресемплер и рамзмер буффера всетаки правильны, а проблема либо в настройках AAC енкодера, либо в самом енкодере? Я использую libfaac, может для него есть какието особенности или нужно делать дополнительную обработку?
Насчет енкодера не знаю, сталкивались что на многоканальном звуке AAC декодер иногда хрипит.