NAudio Проблема - Управление несколькими звуковыми файлами, воспроизводимыми один за другим

Я пытался решить проблему, над которой я застрял в течение нескольких недель! По сути, программное обеспечение, которое я разрабатываю, может записывать звук, а затем воспроизводить его. Программное обеспечение может записывать несколько звуковых файлов, а затем воспроизводить их один за другим (создавая впечатление, что это один непрерывный звуковой файл). Однако проблема, с которой я сталкиваюсь, заключается в том, что, начиная со второго звукового файла, кажется, что «тикает» поверх второго, третьего, четвертого (и так далее) файла.

Это тиканье - последние несколько миллисекунд первого звукового файла. «Тик», о котором я говорю, похож на звук очень быстро скачущей виниловой пластинки.

До сих пор я не смог найти корень проблемы, у кого-нибудь есть идеи относительно того, что может быть причиной этого?

Спасибо

РЕДАКТИРОВАТЬ: добавлены некоторые методы ниже.

Итак, следующий метод — это метод воспроизведения.

public override void Replay(long time)
    {
        if(this.StartTime <= time && this.EndTime >= time && (Speed >= 0.95 && Speed <= 1.05))
        {
            if (!locked)
            {
                locked = true;
                //close the previous stream
                CloseWaveOut();
                //open the file
                waveOut = new NativeDirectSoundOut(latency);
                mainOutputStream = CreateInputStream(outputFilename);
                if (waveOut != null && mainOutputStream != null)
                {
                    //set the time position
                    long offset = time - StartTime;
                    if (offset > 0)
                    {
                        mainOutputStream.CurrentTime = TimeSpan.FromMilliseconds(Convert.ToDouble(offset));
                    }
                    //CurrentTime = TimeSpan.FromMilliseconds(Convert.ToDouble(time - StartTime));
                    waveOut.Init(mainOutputStream);
                    ((WaveChannel32)mainOutputStream).Volume = Volume;
                    Console.WriteLine("waveOut Playing");  // Debugging purposes
                    waveOut.Play();
                }
            }
        }
    }

Следующий метод является методом записи:

        public override void Record(long time)
    {
        if (waveInStream == null && writer == null && !recorded)
        {
            //for record 
            writer = new WaveFileWriter(outputFilename, recordingFormat);
            waveInStream = new WaveInStream(deviceNumber, recordingFormat, null);
            waveInStream.DataAvailable += new EventHandler<WaveInEventArgs>(waveInStream_DataAvailable);

            waveInStream.StartRecording();
            this.StartTime = time;

            Console.Out.WriteLine("Record Method called"); // Debugging Purposes
        }
    }

person Alex    schedule 13.10.2010    source источник
comment
вам нужно будет показать исходный код, чтобы получить любую помощь. как вы записываете и воспроизводите звук?   -  person Mark Heath    schedule 14.10.2010
comment
Добавлен код, иллюстрирующий метод воспроизведения и метод записи.   -  person Alex    schedule 26.10.2010


Ответы (1)


Я бы рекомендовал не закрывать и не открывать WaveOut, а иметь всегда открытым один экземпляр WaveOut. Создайте новый IWaveProvider, метод Read которого сначала возвращает все данные из первого файла WAV, а затем все данные из второго.

Чтобы найти источник тиканья, я бы сначала дважды проверил в проигрывателе Windows Media, что в самом записанном файле WAV нет тикающего шума.

person Mark Heath    schedule 14.04.2011
comment
После публикации я действительно пытался не закрывать объект WaveOut - похоже, это не имеет никакого значения. Я также проверил файлы WAV из WMP, «тиканье» не записывается в самом звуковом файле (т. Е. При воспроизведении из WMP тиканье не слышно). - person Alex; 30.05.2011
comment
Какой выходной драйвер вы используете? Ваш код показывает NativeDirectSoundOut, которого не существует уже некоторое время. - person Mark Heath; 30.05.2011
comment
Я использую более старую версию NAudio, драйвер NativeDirectSoundOut все еще доступен (по крайней мере, он не говорит мне, что это не так). Я также пробовал использовать: waveOut = new NAudio.Wave.DirectSoundOut(null, latency); а также WaveOut = new WaveOut(); Тем не менее, он продолжает говорить мне, что мне нужно связать форму окна с классом WaveOut, которого у меня нет (я делаю весь свой код пользовательского интерфейса в другом месте) - person Alex; 07.06.2011