Я должен использовать чистое решение C # для передискретизации аудио, которое может дать мне те же самые результаты, что и FFmpeg.
FFmpeg сначала строит какой-то банк многофазных фильтров, а затем использует его для процесса выборки (извините за смутные выражения, но я не слишком знаком с этой темой). Согласно этому краткому документация, инициализация может быть настроена следующим образом:
AVResampleContext* av_resample_init(
int out_rate,
int in_rate,
int filter_length,
int log2_phase_count,
int linear,
double cutoff
)
Параметры:
Мне нужно использовать библиотеку C #, которая настраивается на той же глубине. Я пытался использовать NAudio (более конкретно, его WaveFormatConversionStream
класс), но там я мог только установить входную и выходную частоты дискретизации, поэтому я не получил ожидаемых результатов.
Итак, есть ли C # lib, которая может повторять выборку с теми же настройками, что и FFmpeg? Или тот, который имеет почти все эти настройки или подобные? Примечание: мне нужно решение на C #, а не оболочка!
В дополнение к 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).
Других решений пока нет …