Проблема NAudio - Управление несколькими звуковыми файлами, которые воспроизводятся один за другим. - PullRequest
1 голос
/ 13 октября 2010

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

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

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

Спасибо

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

Хорошо, поэтому следующий метод является методом воспроизведения.

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
        }
    }

1 Ответ

1 голос
/ 14 апреля 2011

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

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

...