代码之家  ›  专栏  ›  技术社区  ›  BrokenGlass

从PCM采样创建WaveStream

  •  3
  • BrokenGlass  · 技术社区  · 14 年前

    我查过Naudio和它的 WaveStream 相关类,但我找不到一个内置的方法来创建 波流 基于我提供的PCM样本。

    理想情况下,我想这样做:

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

    有没有办法用纳乌迪奥来做这个?

    编辑 汉斯澄清后,马克(感谢反馈):

    我需要一条可以经过的小溪 SoundPlayer.Play 这个不太适合 波流 . 在我的项目中,我最终实现了下面的类,该类获取示例和 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();
        }
    }
    
    2 回复  |  直到 12 年前
        1
  •  2
  •   Hans Passant    14 年前

    不,什么都不像。但是,您可以创建自己的。wave\wavestream\wavefilereader.cs源代码文件可能是最好的开始。你可以从中剥离出一堆东西,用一个正确初始化的memorystream替换wavestream。

        2
  •  5
  •   Mark Heath    14 年前

    这门课你可以通过 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);
        }
    }