2011-08-22 1 views
3

donc ce que j'ai un tableau court [] qui représente les données brutes d'un fichier WAV. Cela signifie qu'il n'inclut aucune information d'en-tête ou de pied de page qui est généralement incluse. Pour lire cet audio, j'ai besoin de le convertir en un flux, malheureusement les données dans ce tableau court [] sont Int16 et beaucoup de valeurs dépassent 255, donc ne peuvent pas être converties en octets et ne peuvent pas être converties en un courant. Est-ce que quelqu'un a une idée de comment je serais capable de lire ces données audio?Convertir court [] en Stream qui peut être joué en tant que Audio

+0

si vous connaissez la disposition désirée, l'endianness, etc. - c'est-à-dire les entrées => sorties ... –

Répondre

9

Vous pouvez convertir le tableau court vers un tableau d'octets:

short[] sampleData = ... 
byte[] byteArray = new byte[sampleData.Length*2]; 
Buffer.BlockCopy(sampleData , 0, byteArray, 0, byteArray.Length); 

Ensuite, vous pouvez créer un flux d'ondes en utilisant la classe WaveMemoryStream ci-dessous - pour que vous aurez besoin de connaître le format d'onde de vos données d'échantillon . Ce flux peut ensuite être enregistré en tant que fichier WAV ou être lu par SoundPlayer. Un flux «d'une certaine sorte» est trop vague;

public class WaveMemoryStream : 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 WaveMemoryStream(byte[] sampleData, int audioSampleRate, ushort audioBitsPerSample, ushort audioChannels) 
    { 
     _waveStream = new MemoryStream(); 
     WriteHeader(_waveStream, sampleData.Length, audioSampleRate, audioBitsPerSample, audioChannels); 
     WriteSamples(_waveStream, sampleData); 
     _waveStream.Position = 0; 
    } 

    public void WriteHeader(Stream stream, int length, int audioSampleRate, ushort audioBitsPerSample, ushort audioChannels) 
    { 
     BinaryWriter bw = new BinaryWriter(stream); 

     bw.Write(new char[4] { 'R', 'I', 'F', 'F' }); 
     int fileSize = 36 + length; 
     bw.Write(fileSize); 
     bw.Write(new char[8] { 'W', 'A', 'V', 'E', 'f', 'm', 't', ' ' }); 
     bw.Write((int)16); 
     bw.Write((short)1); 
     bw.Write((short)audioChannels); 
     bw.Write(audioSampleRate); 
     bw.Write((int)(audioSampleRate * ((audioBitsPerSample * audioChannels)/8))); 
     bw.Write((short)((audioBitsPerSample * audioChannels)/8)); 
     bw.Write((short)audioBitsPerSample); 

     bw.Write(new char[4] { 'd', 'a', 't', 'a' }); 
     bw.Write(length); 
    } 

    public void WriteSamples(Stream stream, byte[] sampleData) 
    { 
     BinaryWriter bw = new BinaryWriter(stream); 
     bw.Write(sampleData, 0, sampleData.Length); 
    } 

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

    public virtual void WriteTo(Stream stream) 
    { 
     int bytesRead = 0; 
     byte[] buffer = new byte[8192]; 

     do 
     { 
      bytesRead = Read(buffer, 0, buffer.Length); 
      stream.Write(buffer, 0, bytesRead); 
     } while (bytesRead > 0); 

     stream.Flush(); 
    } 

    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

Merci l'homme ... cela aide beaucoup. – UNOWN301

Questions connexes