Появляется треск в конвертированном звуке после его декодирования с использованием ffmpeg

Рейтинг: 2Ответов: 1Опубликовано: 19.03.2015

Здравствуйте. У меня возникла проблема с изменением частоты дискретизации и формата сэмпла после декодирования с использованием ffmpeg. В звуке появляется фоновый треск.

После вызова функции:

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 с сайта.

В чем может быть проблема и где искать решение? (Проверки на ошибки я в коде опустил)

Ответы

▲ 1

Возможно Вам поможет использование fifo. В моём случае, взяв код одного из примеров библиотеки, мне удалось снизить громкость этих щелчков и потрескивания, но, к сожалению, не устранить полностью. Параметры звука на входе и выходе те же, что и у Вас, правда, писал на C API, версия 2.6.1