2010-11-24 12 views
3

関連するクラスをNAudioとそのWaveStreamで確認しましたが、提供するPCMサンプルに基づいてWaveStreamを作成する方法が見つかりませんでした。PCMサンプルからWaveStreamを作成する

byte[] samples = ... 
WaveFormat waveFormat = new WaveFormat(audioSampleRate, 
             audioBitsPerSample, 
             audioChannels); 
WaveStream waveStream = CreateWaveStreamfromSamples(waveFormat, 
                samples); 

NAudioを使用してこれを行う方法があります:

理想的には私はこのような何かをしたいですか?

編集ハンス、マーク(フィードバックに感謝)からの明確化後:

私はSoundPlayer.Playに渡すことができたストリームを必要に応じて、これはWaveStreamとうまく適合しません。私のプロジェクトでは、サンプルとWaveFormatを受け取り、SoundPlayerで再生できる次のクラスを実装しました。

public class MemoryWaveStream : Stream 
{ 
    public override bool CanSeek { get { return false; } } 
    public override bool CanWrite { get { return false; } } 
    public override bool CanRead { get { return true; } } 
    public override long Length { get { return _waveStream.Length; } } 
    public override long Position { get { return _waveStream.Position; } set { _waveStream.Position = value; } } 

    private MemoryStream _waveStream; 

    public MemoryWaveStream(byte[] sampleData, WaveFormat waveFormat) 
    { 
     _waveStream = new MemoryStream(); 
     BinaryWriter bw = new BinaryWriter(_waveStream); 
     bw.Write(new char[4] { 'R', 'I', 'F', 'F' }); 

     int length = 36 + sampleData.Length; 
     bw.Write(length); 

     bw.Write(new char[8] { 'W', 'A', 'V', 'E', 'f', 'm', 't', ' ' }); 

     waveFormat.Serialize(bw); 
     bw.Write(new char[4] { 'd', 'a', 't', 'a' }); 
     bw.Write(sampleData.Length); 
     bw.Write(sampleData, 0, sampleData.Length); 
     _waveStream.Position = 0; 
    } 

    public override int Read(byte[] buffer, int offset, int count) 
    { 
     return _waveStream.Read(buffer, offset, count); 
    } 

    public override void Flush() 
    { 
     _waveStream.Flush(); 
    } 

    public override long Seek(long offset, SeekOrigin origin) 
    { 
     return _waveStream.Seek(offset, origin); 
    } 

    public override void SetLength(long value) 
    { 
     throw new NotImplementedException(); 
    } 
    public override void Write(byte[] buffer, int offset, int count) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

カスタムクラスをご提供いただきありがとうございます。 –

答えて

2

いいえ、それは似ていません。しかし、自分で作成することもできます。 Wave \ wavestream \ wavefilereader.csソースコードファイルは、おそらく最善の方法です。あなたがそれから取り除くことができるものの束、適切に初期化されたMemoryStreamによってwaveStreamを置き換えます。

+0

yea私は自分自身で(内部でMemoryStreamを使ってStreamを実装し、Waveヘッダーで叩くだけで)、ホイールを再発明するのではなく、組み込みのものを好みました。 – BrokenGlass

+0

あなたの改善をチェックインしましたか?それはOSSの仕組みです... –

+0

私はパッチを提出しました - このクラスがプロジェクト全体に役立つかどうかわかりませんが、私たちは参照してください;-) – BrokenGlass

5

ここには、必要に応じてバイト配列に基づいてMemoryStreamを渡すことができるクラスがあります。私はおそらくこれを行う方法について多くのサポート要求を受けるので、NAudio 1.4にこのようなものを含めるでしょう。

public class RawSourceWaveStream : WaveStream 
{ 
    private Stream sourceStream; 
    private WaveFormat waveFormat; 

    public RawSourceWaveStream(Stream sourceStream, WaveFormat waveFormat) 
    { 
     this.sourceStream = sourceStream; 
     this.waveFormat = waveFormat; 
    } 

    public override WaveFormat WaveFormat 
    { 
     get { return this.waveFormat; } 
    } 

    public override long Length 
    { 
     get { return this.sourceStream.Length; } 
    } 

    public override long Position 
    { 
     get 
     { 
      return this.sourceStream.Position; 
     } 
     set 
     { 
      this.sourceStream.Position = value; 
     } 
    } 

    public override int Read(byte[] buffer, int offset, int count) 
    { 
     return sourceStream.Read(buffer, offset, count); 
    } 
} 
関連する問題