2011-08-22 2 views
3

]로 재생할 수있는 short []를 Stream으로 변환하면 WAV 파일의 원시 데이터를 나타내는 short [] 배열이됩니다. 즉, 일반적으로 포함되는 머리글 또는 바닥 글 정보는 포함되지 않습니다. 이 오디오를 재생하려면 불행히도이 짧은 [] 배열의 데이터가 Int16이며 많은 값이 255를 초과하므로 바이트로 변환 할 수 없으므로이 유형의 스트림으로 변환해야합니다. 흐름. 누구든지이 오디오 데이터를 재생할 수있는 방법을 알고 있습니까?Audio [

+0

"일종의"스트림이 지나치게 모호합니다. 원하는 레이아웃, 엔디안 등을 알고있는 경우 입력 => 출력 ... –

답변

9

당신은 바이트 배열로 다시 short 배열을 변환 할 수 있습니다

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

그런 다음 아래의 WaveMemoryStream 클래스를 사용하여 웨이브 스트림을 생성 할 수 있습니다 - 당신이 샘플 데이터의 웨이브 형식을 알아야합니다 대한 . 이 스트림을 WAV 파일로 저장하거나 SoundPlayer으로 재생할 수 있습니다.

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

감사합니다 ... 많은 도움이됩니다. – UNOWN301