2010-10-13 19 views
1

J'ai essayé de résoudre un problème sur lequel j'ai été bloqué pendant des semaines! Fondamentalement, le logiciel que je développe peut enregistrer de l'audio, puis le lire. Le logiciel peut enregistrer des fichiers audio multipules, puis les lire l'un après l'autre (ce qui donne l'impression qu'il s'agit d'un fichier son continu). Cependant, le problème que je rencontre est que depuis le deuxième fichier son, il semble y avoir un "ticking" au-dessus du second, troisième, quatrième (et ainsi de suite) fichier.Problème avec le NAudio - Gérer les fichiers multipules les uns après les autres

Ce tick est les dernières millisecondes du premier fichier son. Le «ticking» auquel je fais référence est similaire au son d'un disque vinyle qui saute très vite.

Jusqu'à présent, je n'ai pas été en mesure de trouver la racine du problème, est-ce que quelqu'un a des idées en ce qui concerne ce qui pourrait causer cela?

Merci

EDIT: Ajout de quelques méthodes ci-dessous. Ok, donc la méthode suivante est la méthode de relecture.

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(); 
       } 
      } 
     } 
    } 

La méthode suivante est la méthode d'enregistrement:

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

vous aurez besoin de montrer du code source afin de recevoir de l'aide. comment allez-vous enregistrer et lire l'audio? –

+0

Ajouté du code illistrating méthode de lecture et méthode d'enregistrement – Alex

Répondre

1

Je recommande WaveOut ne pas fermer et ouvrir, mais ayant une seule instance WaveOut toujours ouverte. Créez un nouveau IWaveProvider dont la méthode Read renvoie d'abord toutes les données du premier fichier WAV, puis toutes les données de la seconde.

Pour localiser la source du ticking, je vérifierais d'abord dans Windows Media Player que le fichier WAV enregistré lui-même n'a pas le bruit de ticking dedans.

+0

Depuis la publication, j'ai effectivement essayé de ne pas fermer l'objet WaveOut - Ne semble pas faire de différence du tout. J'ai également vérifié les fichiers WAV de WMP, le "ticking" n'étant pas enregistré dans le fichier audio lui-même (c'est-à-dire lors de la lecture à partir de WMP, il n'y a pas de ticking audible). – Alex

+0

Quel pilote de sortie utilisez-vous? Votre code montre NativeDirectSoundOut, qui n'a pas existé depuis un certain temps. –

+0

J'utilise une ancienne version de NAudio, le pilote NativeDirectSoundOut est toujours disponible (il ne me dit pas que ce n'est pas le cas, au moins). J'ai aussi essayé d'utiliser: waveOut = new NAudio.Wave.DirectSoundOut (null, latence); ainsi que WaveOut = new WaveOut(); Cependant, il ne cesse de me dire que j'ai besoin de lier un formulaire Windows à la classe WaveOut que je n'ai pas (je fais tout mon code UI ailleurs) – Alex