2010-10-05 111 views
1

我一直在工作一段時間的圖像格式,我知道一個圖像是一個像素數組(24-也許32位長)。問題是:聲音文件的表現方式是什麼?說實話,我甚至不知道我應該使用Google搜索。另外我會感興趣你如何使用數據,我的意思是實際上播放文件中的聲音。對於一個圖像文件,你有各種抽象設備來繪製圖像(Graphics:java,c#,HDC:cpp(win32)等)。我希望我已經清楚了。原始聲音播放

回答

2

下面是如何存儲.wav的完美概述。我通過在Google中輸入「wave file format」找到了它。

http://www.sonicspot.com/guide/wavefiles.html

+0

謝謝你的答案。我發現wav相當於一個或多或少的BMP(沒有壓縮)。 – 2010-10-08 08:15:01

1

WAV文件也可以存儲壓縮的音頻,但我相信他們大多不壓縮的時間。但是WAV格式被設計成一個容器,用於存儲音頻的一些選項。

這裏是我在另一個問題在這裏找到的另一個問題,我喜歡在C#中構建一個WAV格式的音頻MemoryStream,然後播放該流(不保存到文件,像許多其他答案依賴)。但是如果你想把它保存到磁盤上,將它保存到一個文件中可以很容易地添加一行代碼,但是我認爲大多數情況下這是不可取的。

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Windows.Forms; 

public static void PlayBeep(UInt16 frequency, int msDuration, UInt16 volume = 16383) 
{ 
    var mStrm = new MemoryStream(); 
    BinaryWriter writer = new BinaryWriter(mStrm); 

    const double TAU = 2 * Math.PI; 
    int formatChunkSize = 16; 
    int headerSize = 8; 
    short formatType = 1; 
    short tracks = 1; 
    int samplesPerSecond = 44100; 
    short bitsPerSample = 16; 
    short frameSize = (short)(tracks * ((bitsPerSample + 7)/8)); 
    int bytesPerSecond = samplesPerSecond * frameSize; 
    int waveSize = 4; 
    int samples = (int)((decimal)samplesPerSecond * msDuration/1000); 
    int dataChunkSize = samples * frameSize; 
    int fileSize = waveSize + headerSize + formatChunkSize + headerSize + dataChunkSize; 
    // var encoding = new System.Text.UTF8Encoding(); 
    writer.Write(0x46464952); // = encoding.GetBytes("RIFF") 
    writer.Write(fileSize); 
    writer.Write(0x45564157); // = encoding.GetBytes("WAVE") 
    writer.Write(0x20746D66); // = encoding.GetBytes("fmt ") 
    writer.Write(formatChunkSize); 
    writer.Write(formatType); 
    writer.Write(tracks); 
    writer.Write(samplesPerSecond); 
    writer.Write(bytesPerSecond); 
    writer.Write(frameSize); 
    writer.Write(bitsPerSample); 
    writer.Write(0x61746164); // = encoding.GetBytes("data") 
    writer.Write(dataChunkSize); 
    { 
     double theta = frequency * TAU/(double)samplesPerSecond; 
     // 'volume' is UInt16 with range 0 thru Uint16.MaxValue (= 65 535) 
     // we need 'amp' to have the range of 0 thru Int16.MaxValue (= 32 767) 
     // so we simply set amp = volume/2 
     double amp = volume >> 1; // Shifting right by 1 divides by 2 
     for (int step = 0; step < samples; step++) 
     { 
      short s = (short)(amp * Math.Sin(theta * (double)step)); 
      writer.Write(s); 
     } 
    } 

    mStrm.Seek(0, SeekOrigin.Begin); 
    new System.Media.SoundPlayer(mStrm).Play(); 
    writer.Close(); 
    mStrm.Close(); 
} // public static void PlayBeep(UInt16 frequency, int msDuration, UInt16 volume = 16383) 

但這代碼顯示有點洞察WAV格式的,它甚至是代碼,允許一個人打造C#源代碼自己的WAV格式。