Re[2]: Как закодировать PCM-аудио в AAC-формат с помощью ffmpeg-API
От: Lexx47  
Дата: 25.06.13 10:33
Оценка:
Здравствуйте, 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, может для него есть какието особенности или нужно делать дополнительную обработку?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.