У меня есть аудио приложение .NET, которое позволяет пользователю независимо регулировать темп и высоту воспроизводимого аудио. Я в настоящее время использую NAudio.
Чтобы включить настройку темпа и высоты тона, я использую следующий код.
class NativeAudioPlayer
{
readonly NAudio.Wave.AudioFileReader _audioFileReader;
readonly WaveOutEvent _waveOutEvent;
readonly SoundTouchWaveStream _tempoControl;
readonly SmbPitchShiftingSampleProvider _pitchControl;
public NativeAudioPlayer(string filePath)
{
_audioFileReader = new NAudio.Wave.AudioFileReader(filePath);
var stream16 = new Wave32To16Stream(_audioFileReader);
_tempoControl = new SoundTouchWaveStream(stream16);
var sampleProvider = NAudioConverter.ConvertWaveProviderIntoSampleProvider(_tempoControl);
_pitchControl = new SmbPitchShiftingSampleProvider(sampleProvider);
_waveOutEvent = new WaveOutEvent { DesiredLatency = 150, NumberOfBuffers = 3 };
_waveOutEvent.Init(_pitchControl);
}
}
На одной из моих машин (Windows 10 x64 i7-6820HQ CPU @ 2,70 ГГц, 2701 МГц, 4 ядра (-ей), 8 логических процессоров (-ей)), это, кажется, работает нормально при загрузке процессора около 7%.
Однако на другом компьютере с более низкой спецификацией (процессор Windows 10 x64 i3-3120M @ 2,50 ГГц, 2500 МГц, 2 ядра (-ей), 4 логических процессора (-ов)) при воспроизведении звука наблюдаются заметные сбои. На этой машине плохое воспроизведение связано с использованием ЦП около 20%. При удалении как темпа, так и высоты тона воспроизведение нормальное, а загрузка процессора составляет около 2,5%.
Увеличение задержки до 300 мс улучшает воспроизведение, но увеличивает проблемы с мониторингом текущей позиции воспроизведения.
В какой-то момент я захочу добавить другие компоненты обработки звука, например, EQ. Как увеличить производительность воспроизведения без увеличения задержки каждый раз, когда я добавляю новый компонент обработки?