Re[3]: Как закодировать PCM-аудио в AAC-формат с помощью ffmpeg-API
От: roro  
Дата: 26.06.13 19:53
Оценка:
Здравствуйте, 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 декодер иногда хрипит.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.