2013-06-10 3 views
1

J'essaie de lire des échantillons audio PCM retournés dans des événements par une autre classe. Si je les enregistre dans un fichier et que je les joue en tant que flux, tout est OK. Mais en temps réel, rien ne se passe. PlaybackState est défini sur Arrêté. Voici le code:Lecture d'éléments audio pcm

WaveFormat wf = new WaveFormat(8000, 1); 
    MemoryStream ms; 
    WaveStream blockAlignedStream; 
    WaveOut waveOut; 
    short[] PCMSamples = new short[320]; 

    void StartPlayback() 
    { 
     ms = new MemoryStream(); 

     blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(new NAudio.Wave.RawSourceWaveStream(ms[1], wf))); 

     waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()); 
     waveOut.Init(blockAlignedStream); 
     waveOut.Play(); 
    } 

    public void PCMStreamEventHandler(byte[] data) 
    { 
     this.Invoke((MethodInvoker)delegate 
     { 
      var pos = ms.Position; 
      codec.Convert(data, PCMSamples); 
      ms.Position = ms.Length; 
      byte[] buffer = new byte[PCMSamples.Length * 2]; 
      Buffer.BlockCopy(PCMSamples, 0, buffer, 0, buffer.Length); 
      ms.Write(buffer, 0, buffer.Length); 
      ms.Position = pos; 
     }); 
    } 

Toute aide sur la lecture PCM en temps réel serait apprécié. Merci.

Répondre

1

Utilisez le BufferedWaveProvider pour cela. Il suffit de mettre les octets reçus dans le BufferedWaveProvider à leur arrivée. En outre, vous n'avez pas besoin de BlockAlignReductionStream, et je vous conseille vivement d'éviter les rappels de fonction. Utilisez WaveOutEvent à la place.