Как изменить скорость воспроизведения с помощью NAudio C # - PullRequest
2 голосов
/ 07 июля 2011

Я использую Media Player и использую NAudio для воспроизведения моих файлов.Есть ли способ увеличить скорость воспроизведения, например (2X или 4X) во время воспроизведения звука.Будем благодарны за примеры кода.

Спасибо за ура.

Ответы [ 3 ]

5 голосов
/ 07 июля 2011

NAudio не включает готовый компонент для изменения скорости воспроизведения звука. Однако это возможно, если вы создадите свой собственный производный WaveStream / IWaveProvider и самостоятельно внедрите алгоритм ускорения. Самый простой способ получить увеличение скорости в 2 или 4 раза - просто выбросить образцы. Однако качество не будет хорошим (будут представлены артефакты), поэтому от ваших потребностей зависит, сможете ли вы воспользоваться этим вариантом или нет.

Я сам однажды реализовал переменную скорость воспроизведения в NAudio, но, к сожалению, я не могу поделиться здесь кодом, так как он не с открытым исходным кодом. Юваль Наве, однако, реализовал переменную скорость воспроизведения как часть своего приложения PracticeSharp , которое использует NAudio, так что вы можете проверить, как он это сделал (я думаю, что он достигает этого, оборачивая SoundTouch ).

2 голосов
/ 11 июня 2013

Я недавно добавил воспроизведение с переменной скоростью в ispy - для воспроизведения используется naudio. PlaybackRate является двойным - установите его для замедления или ускорения звука:

if (WaveOutProvider != null)
{
    if (Math.Abs(PlaybackRate - 1) > double.Epsilon)
    {
    //resample audio if playback speed changed
    var newRate = Convert.ToInt32(_waveProvider.WaveFormat.SampleRate/PlaybackRate);
    var wf = new WaveFormat(newRate, 16, _waveProvider.WaveFormat.Channels);
    var resampleInputMemoryStream = new MemoryStream(data) {Position = 0};

    WaveStream ws = new RawSourceWaveStream(resampleInputMemoryStream, _waveProvider.WaveFormat);
    var wfcs = new WaveFormatConversionStream(wf,ws) {Position = 0};
    var b = new byte[ws.WaveFormat.AverageBytesPerSecond];

    int bo = wfcs.Read(b, 0, ws.WaveFormat.AverageBytesPerSecond);
    while (bo > 0)
    {
        WaveOutProvider.AddSamples(b, 0, bo);
        bo = wfcs.Read(b, 0, ws.WaveFormat.AverageBytesPerSecond);
    }
    wfcs.Dispose();
    ws.Dispose();

    }
    else
    {
    WaveOutProvider.AddSamples(data, 0, data.Length);    
    }

}
0 голосов
/ 05 августа 2011

Я прошел через PracticeSharp, они реализуют скорость на лету (во время воспроизведения аудио).но мое требование не соответствовалоЕсли какое-либо простое решение для работы со скоростью на лету, пожалуйста, предоставьте, например, для объема VolumeSampleProvider, как это есть какой-либо класс для изменения скорости.

...