Здравствуйте. У меня возникла проблема с изменением частоты дискретизации и формата сэмпла после декодирования с использованием ffmpeg. А точнее, с понижением ее с 48000 до 44100. В звуке появляется фоновый треск.
(При повышении с 44100 до 48000 треска нету.)
После вызова функции:
ErrorCode := avcodec_decode_audio4(AudioCodecContext, AudioFrame,
@FrameFinished, @Packet);
У меня происходит следующее:
if FrameFinished = 1 then
begin
swr := swr_alloc;
try
av_opt_set_int(swr, 'in_channel_layout', AudioFrame.channel_layout, 0);
av_opt_set_int(swr, 'out_channel_layout', AV_CH_LAYOUT_STEREO, 0);
av_opt_set_int(swr, 'in_sample_rate', AudioFrame.sample_rate, 0);
av_opt_set_int(swr, 'out_sample_rate', 44100, 0);
av_opt_set_sample_fmt(swr, 'in_sample_fmt', TAVSampleFormat(AudioFrame.format), 0);
av_opt_set_sample_fmt(swr, 'out_sample_fmt', AV_SAMPLE_FMT_S16, 0);
swr_init(swr);
OutSample := av_rescale_rnd(
swr_get_delay(swr, AudioFrame.sample_rate) + AudioFrame.nb_samples,
44100, AudioFrame.sample_rate, AV_ROUND_UP );
av_samples_alloc(@OutputBuffer, nil, 2, OutSample,
AV_SAMPLE_FMT_S16, 0);
ConvertSize := swr_convert(swr, @OutputBuffer, OutSample,
@AudioFrame.data[0], AudioFrame.nb_samples);
finally
swr_free(@swr);
end;
ConvertSize := ConvertSize * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16) * 2 {channel numbers};
BufferDest.Write(OutputBuffer, ConvertSize);
av_free(outputBuffer);
OutputBuffer у меня объявлен как PByte.
Формат, который я пытаюсь получить на выходе:
Stereo (2 Канала), Signed 16 bit, 44100
Дальше, данные у меня отправляются в уже настроенный на эти параметры
DirectSound, но там слышны трески. Я пробовал сохранить конвертированный аудио поток в файл и скармливал его
Audacity - результат не изменился. В программе я использую сборку
ffmpeg-20150312-git-3bedc99-win32-shared с сайта.
В чем может быть проблема и где искать решение?
(Проверки на ошибки я в коде опустил)