我一直在工作一段時間的圖像格式,我知道一個圖像是一個像素數組(24-也許32位長)。問題是:聲音文件的表現方式是什麼?說實話,我甚至不知道我應該使用Google搜索。另外我會感興趣你如何使用數據,我的意思是實際上播放文件中的聲音。對於一個圖像文件,你有各種抽象設備來繪製圖像(Graphics:java,c#,HDC:cpp(win32)等)。我希望我已經清楚了。原始聲音播放
Q
原始聲音播放
1
A
回答
2
下面是如何存儲.wav的完美概述。我通過在Google中輸入「wave file format」找到了它。
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格式。
相關問題
- 1. 原始音頻播放5
- 2. 如何從聲音的開始播放/暫停聲音和聲音播放?
- 3. 聲音播放和播放聲音
- 4. 播放聲音?
- 5. 播放聲音
- 6. 播放聲音
- 7. 播放聲音
- 8. 播放聲音
- 9. 播放聲音
- 10. 從原始文件夾播放隨機聲音
- 11. AudioTrack Android從原始文件夾播放聲音
- 12. 如何正確知道聲音開始播放的原因?
- 13. Can DirectSound可以播放原始二進制聲音文件嗎?
- 14. 意圖從原始文件夾播放聲音
- 15. 播放聲音從原始文件在科特林
- 16. Android從C++端播放原始音頻
- 17. 無法播放原始音頻文件
- 18. 用QPython audiostream原始PCM音頻播放
- 19. 開始播放聲音文件
- 20. iOS:從背景開始播放聲音
- 21. 聲音播放的開始被切斷
- 22. 未播放聲音
- 23. 在播放聲音
- 24. 聲音未播放
- 25. VC++播放聲音
- 26. Ruby聲音播放
- 27. 聲音未播放
- 28. Javascript播放聲音
- 29. MonoTouch:播放聲音
- 30. 聲音播放viewpager
謝謝你的答案。我發現wav相當於一個或多或少的BMP(沒有壓縮)。 – 2010-10-08 08:15:01