WAV文件的格式,通过mmtools转换后的问题。 (50分)

  • 主题发起人 主题发起人 oldsheep35
  • 开始时间 开始时间
O

oldsheep35

Unregistered / Unconfirmed
GUEST, unregistred user!
这是我定义的wav头文件
TWAVRecord = record
{ RIFF file header }
RIFFHeader: array [1..4] of Char;
FileSize: Integer;
WAVEHeader: array [1..4] of Char;
{ Format information }
FormatHeader: array [1..4] of Char;
FormatSize: Integer;
FormatCode: Word;
ChannelNumber: Word;
SampleRate: Integer;
BytesPerSecond: Integer;
BytesPerSample: Word;
BitsPerSample: Word;
{ Data area }
DataHeader: array [1..4] of Char;
DataSize: Integer;

end;


通过mmtools转换
with WaveFile.Wave.PWaveFormat^do

pcmBuildWaveHeader(@wfx,wBitsPerSample,nChannels,7812);
WaveFile.Wave.EndPos := WaveFile.Wave.DataSize-1;
WaveFile.Wave.ConvertFile(MMWaveSaveDialog1.FileName,@wfx);
end;
之后
为什么头文件中的 FormatSize 由16—〉18;
DataHeader 由“Data”—〉“#0#0Da”
DataSize 变成 负值?
难道mmtools定义的头文件格式和我的不一样?
有mmtools定义的头文件格式吗?

这样转换之后文件正常可以听,但是无法跟其他WAV文件合并!
请高手指点一下!
 
procedure ReadWavInfo(fs: TMemoryStream);//fs is the wav file stream
var
i, j: Integer;
begin

fs.Position := 0;
i:= 0;
fs.Read(i, 4);//i shoule be $46464952 'RIFF'
fs.Read(i, 4);//i is (filesize - 8)
fs.Read(i, 4);//i shoule be $45564157 'WAVE'
fs.Read(i, 4);//i shoule be $20746D66 'fmt '
fs.Read(i, 4);//i is the size of chunk 'fmt '
//i值一般是16,从这里开始的i个字节,描述了下面一些信息
{FormatCode: Word;
ChannelNumber: Word;
SampleRate: Integer;
BytesPerSecond: Integer;
BytesPerSample: Word;
BitsPerSample: Word;
}
//如果是18,则表示这些信息用18个字节来描述,多出来的字节描述的是一些其他的信息
fs.Position := fs.Position + i;//move the postion to the next chunk;
i := 0;
j := 0;
while i <> $61746164do
//'data'
begin

if fs.Postion >= fs.Size then
Break;
fs.Read(i, 4);//i is the chunk flag of the this chunk
fs.Read(j, 4);//j is the size og this chunk
fs.Position := fs.Position + j;//move the postion to the next chunk;
end;

if j = 0 then
Exit;
//j = 0: no sound data found
//现在如果j = 0 则表示没有找到声音数据部分
//i should be $61746164 'data'
//j is the size of sound data也就是你的DataSize
//and now fs.Position is the offset of the sound data
//fs.Postion 才是声音数据在wav文件中的开始位置
end;

 
虽然你的回答没有实现我的要求!但是还是要谢谢你!
 
自已定义wav文件头是一个愚蠢的行为,因为在MMSystem里面有相关的定义。
你可以看看PWAVEFORMATEX的定义。

非常奇怪的是网上有大量有关wav操作的文章都是自已定义的,包括一个非常有名的人写的
有关录音的那篇文章,faint!
 
呵呵。每个人的思路不一样嘛!
 
接受答案了.
 
后退
顶部