Почему NAudio читает нули в буфер после воспроизведения файла, но не раньше?

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

audioFile.Read(buffer, 0, numSamples);

привести к нулям.

Нужно ли как-то сбрасывать аудиофайл? Все примеры, которые я нашел, не упоминают о необходимости этого.

using System;
using NAudio.Wave;

namespace NAudioTest
{
class TestPlayer
{
    static void Main(string[] args)
    {
        string infileName = "c:\\temp\\pink.wav";
        string outfileName = "c:\\temp\\pink_out.wav";

        // load the file
        var audioFile = new AudioFileReader(infileName);

        // play the file
        var outputDevice = new WaveOutEvent();
        outputDevice.Init(audioFile);
        outputDevice.Play();
        //Since Play only means "start playing" and isn't blocking, we can wait in a loop until playback finishes....
        while (outputDevice.PlaybackState == PlaybackState.Playing) { System.Threading.Thread.Sleep(1000); }

        // edit the samples in file
        int fs = audioFile.WaveFormat.SampleRate;
        int numSamples = (int)audioFile.Length / sizeof(float); // length is the number of bytes - 4 bytes in a float

        float[] buffer = new float[numSamples];
        audioFile.Read(buffer, 0, numSamples);

        float volume = 0.5f;
        for (int n = 0; n < numSamples; n++) { buffer[n] *= volume; }

        // write edited samples to new file
        var writer = new WaveFileWriter(outfileName,audioFile.WaveFormat);
        writer.WriteSamples(buffer,0,numSamples);
    }
}

}

1 ответ

Решение

Вы должны позвонить Dispose на вашем писателе, прежде чем он является действительным файлом WAV. Я рекомендую вам положить его в using блок.

using(var writer = new WaveFileWriter(outfileName,audioFile.WaveFormat))
{
    writer.WriteSamples(buffer,0,numSamples);
}
Другие вопросы по тегам