我一直在使用this代碼來讀取delphi中的.wav數據,我一直在比較結果與我從matlab函數wavread得到的值。從中我可以說,matlab函數可以自動識別哪一個是樣本數據值,但不能用delphi(但matlab和delphi代碼的結果都是一樣的)。由於我的delphi代碼無法識別樣本數據值,因此我查看了數組,發現樣本數據值啓動的索引與每個.wav文件不同。舉一個例子我測試一些.wav文件,並獲得這樣的:.wav示例數據值起始索引?
- classic1.wav的採樣數據值開始上wavedata []數據[]索引號40
- classic2.wav的採樣數據值開始上wavedata []。Data [] index number 35
我通過查看結果y,[y,然後我去結果delphi返回一個數組中檢查它的值,並找到完全相同的值開始在索引40爲classic1.wav和35爲classic2.wav。我想知道是否有方法可以知道每個.wav文件的樣本數據值的起始索引?
編輯:我已更正類似reference給出的記錄,它是完全正確的頭(從ChunkID到Subchunk2size),但我仍然對後面的示例數據感到困惑,因爲從前面的結果沒有變化。
type
TWaveHeader = packed record
Marker_RIFF: array [0..3] of char;
ChunkSize: cardinal;
Marker_WAVE: array [0..3] of char;
Marker_fmt: array [0..3] of char;
SubChunkSize: cardinal;
FormatTag: word;
NumChannels: word;
SampleRate: longint;
ByteRate: longint;
BlockAlign:word;
BitsPerSample: word;
Marker_data: array [0..3] of char;
DataBytes: longint;
end;
TChannel = record
Data : array of smallint;
end;
IIRC一個簡單的WAVE文件以RIFF塊描述符開頭,後面跟着一個RIFF子標題,後面跟着一個[WAVEFORMATEX](http://msdn.microsoft.com/en-us/library/windows/desktop/dd390970( v = vs.85).aspx)結構。 [我已經寫了真正的WAVE編碼器/解碼器,但那是幾年前,我不記得所有的細節。我所知道的其實很簡單。] – 2013-04-26 17:09:10
Andreas提出了一個很好的觀點,你應該重新訪問你的結構聲明並根據[規範]進行拆分(https://ccrma.stanford.edu/courses/422/projects/ WaveFormat /) – OnTheFly 2013-04-26 17:32:46
是的,我已根據規格進行重構,它至少直到Subchunk2Size,但沒有跟隨它的數據。我不知道我在做什麼錯誤 – 2013-04-27 01:42:24