Библиотека C# для передискретизации звука, имеющая те же возможности, что и FFmpeg.

Я должен использовать чистое решение C # для передискретизации звука, которое может дать мне те же результаты, что и выборка звука FFmpeg.

FFmpeg сначала создает какой-то многофазный банк фильтров, а затем использует его для процесса выборки (извините за расплывчатую формулировку, но я не слишком знаком с этой темой). Согласно этой краткой документации, инициализация может быть настроен таким образом:

AVResampleContext* av_resample_init(
    int     out_rate,
    int     in_rate,
    int     filter_length,
    int     log2_phase_count,
    int     linear,
    double  cutoff   
    )

Параметры:

  • out_rate: выходная частота дискретизации.
  • in_rate: входная частота дискретизации.
  • filter_length: длина каждого КИХ-фильтра в банке фильтров относительно частоты среза.
  • log2_phase_count: log2 количества записей в банке многофазных фильтров.
  • linear: если 1, то используемый КИХ-фильтр будет линейно интерполирован между двумя ближайшими, если 0, будет использоваться ближайший
  • cutoff: частота среза, 1,0 соответствует половине выходной частоты дискретизации.

Мне нужно было бы использовать библиотеку С#, которую можно настроить на той же глубине. Я пытался использовать NAudio (точнее, его класс WaveFormatConversionStream), но там я мог только установить частоту дискретизации ввода и вывода, поэтому я не получил ожидаемых результатов.

Итак, есть ли библиотека C #, которая может выполнять повторную выборку с теми же настройками, что и FFmpeg? Или тот, в котором есть почти все эти настройки или подобные? Примечание. Мне нужно решение C#, а не оболочка!


person Designation    schedule 20.04.2013    source источник
comment
libsoxr сделан на C, но это автономный ресемплер, который должно быть легче портировать, чем рассматривать весь ffmpeg.   -  person Cory Nelson    schedule 20.04.2013
comment
Спасибо за предложение. Если в конце концов мне понадобится написать его с нуля, я тоже рассмотрю этот вариант.   -  person Designation    schedule 29.04.2013


Ответы (1)


В дополнение к WaveFormatConversionStream (который использует кодеки ACM) NAudio включает еще один ресемплер, к которому можно получить доступ как к медиа-объекту DirectX (DMO) или (в последнем предварительном выпуске NAudio 1.7) как к Media Foundation Transform. Их можно использовать в Windows Vista и выше. К сожалению, я думаю, что они недоступны в XP (но я давно не пробовал).

Найденная версия DMO относится к классу Resampler (есть также класс ResamplerDmoStream), а версия Media Foundation относится к классу MediaFoundationResampler. На самом деле они оба создают один и тот же базовый объект, но в версии MFT я добавил свойство под названием ResamplerQuality, которое позволяет вам выбирать между 1 (линейная интерполяция) и 60 (максимальное качество). В этой статье Я включаю спектрограмму передискретизированной синусоидальной развертки, и вы увидите, что качество очень хорошее.

Вы можете легко внести те же изменения в класс Resampler, если хотите пойти по маршруту DMO, поскольку он имеет доступ к IWMResamplerProps, который позволяет установить половинную длину фильтра (одинаковое значение от 1 до 60).

person Mark Heath    schedule 21.04.2013
comment
Извините за поздний ответ, но тем временем я пытался решить другую проблему того же проекта, и я не хотел смешивать две вещи. Итак, я попробовал версию MFT, и результаты, которые я получил, были довольно близки к исходным, но я думаю, что мне все равно придется портировать исходный код FFmpeg. Я даже перебрал все возможные значения ResamplerQuality, чтобы увидеть, насколько результат будет таким же, как ожидалось, так как я надеялся на чудо :P - person Designation; 29.04.2013