Здравствуйте, roro,спасибо за ответ!
Вы писали:
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> а вы из нее вычитали количество семплов.
Меня это тоже несколько встревожило, но такой вариант пересчета количества выходных семплов я обнаружил на
оф. документации ffmpeg'а.
L>>Камера отдает мне аудио в виде 16-бит PCM буферами по 512 семплов в каждом (причем не зависимо от выбранного на камере семлпрейта (выбрать можно 16, 24,32 и 48 кГц)). Если я беру эти данные и кодирую ААС енкодером настроенным на соответствующий семплрейт (через libfaac), то на выходе слышу сильно замедленный и прерывистый звук (как будто после каждого аудио фрейма добавляют кусок тишины).
R>Это очень странно, проверьте правильно ли вытаскивается буфер, там либо пакеты должны чаше приходить либо размер буфера не 512.
R>проверьте внимательно параметры, скорее всего ошибка в какой-нибудь мелочи.
Проверил настройки кодека и информацию из семпл-буффера — пока ничего нового не нашел. Еще провел такой тест: попробовал кодировать всё с такими же параметрами, но в mp3 ( через libmp3lame). Тоесть поменял только инициализацию аудио кодека на:
//oc->oformat->audio_codec = AV_CODEC_ID_AAC;
oc->oformat->audio_codec = AV_CODEC_ID_MP3;
...
//audio_st->codec->sample_fmt = AV_SAMPLE_FMT_S16;
audio_st->codec->sample_fmt = AV_SAMPLE_FMT_S16P;
//audio_st->codec->sample_rate = 48000;
audio_st->codec->sample_rate = 44100; // семплрейт поменял из за того что flv контейнер не захотел принимать mp3 c 48 kHz.
В таком случае аудио воспроизводиться нормально, причем для любого входного семплрейта. Тоесть выходит ресемплер и рамзмер буффера всетаки правильны, а проблема либо в настройках AAC енкодера, либо в самом енкодере? Я использую libfaac, может для него есть какието особенности или нужно делать дополнительную обработку?