合并两个格式相同的wav文件
碰到这个问题也是照常搜索一下历史的资料
发现一条线索:“通过Wav文件的格式合并”
那就按线索先看看Wav文件的格式
明显SubChunk2Size就是音频数据的大小
那么只要格式相同,合并Data区试试
当然SubChunk2Size音频数据大小和文件大小ChunkSize需要重新计算
type
TWavFormat = packed record
ChunkID: array[0..3] of Char; //'RIFF'
ChunkSize: Longword; // file size - 8 [bytes]
Format: array[0..3] of Char; // 'WAVE'
SubChunk1ID: array[0..3] of Char; // 'fmt ' mind the space!
SubChunk1Size: Longword; // hex10
AudioFormat: Word; // hex 01
NumOfChannels: Word; //1 mono, 2 stereo
SampleRate: Longword; // number of samples/sec
ByteRate: Longword; // samplerate* num of channels*
// bytes per (mono) sample
BytesperSample: Word; // size of (mono) sample [bytes]
BitsPerSample: Word; // BytesperSample *8
SubChunk2ID: array[0..3] of Char; //'data'
SubChunk2Size: Longword; //number of data bytes
end;
function ConcatWavFile(AWavFile1, AWavFile2, ANewFile: string): Boolean;
var
vWavFormat1: TWavFormat;
vWavFormat2: TWavFormat;
vFileHandle1: THandle;
vFileHandle2: THandle;
vFileStream1: TFileStream;
vFileStream2: TFileStream;
vChunkSize1, vChunkSize2: Integer;
begin
Result := False;
if not FileExists(AWavFile1) then Exit;
if not FileExists(AWavFile2) then Exit;
vFileHandle1 := _lopen(PChar(AWavFile1), OF_READ or OF_SHARE_DENY_NONE);
vFileHandle2 := _lopen(PChar(AWavFile2), OF_READ or OF_SHARE_DENY_NONE);
if (Integer(vFileHandle1) <= 0) or (Integer(vFileHandle2) <= 0) then
begin
_lclose(vFileHandle1);
_lclose(vFileHandle2);
Exit;
end;
vFileStream1 := TFileStream.Create(vFileHandle1);
vFileStream2 := TFileStream.Create(vFileHandle2);
try
if vFileStream1.Read(vWavFormat1, SizeOf(TWavFormat)) <>
SizeOf(TWavFormat) then Exit;
if vFileStream2.Read(vWavFormat2, SizeOf(TWavFormat)) <>
SizeOf(TWavFormat) then Exit;
if vWavFormat1.ChunkID <> 'RIFF' then Exit;
if vWavFormat1.SubChunk2ID <> 'data' then Exit;
vChunkSize1 := vWavFormat1.SubChunk2Size;
vChunkSize2 := vWavFormat2.SubChunk2Size;
vWavFormat1.ChunkSize := 0;
vWavFormat1.SubChunk2Size := 0;
vWavFormat2.ChunkSize := 0;
vWavFormat2.SubChunk2Size := 0;
if not CompareMem(@vWavFormat1, @vWavFormat2, SizeOf(TWavFormat)) then Exit; //格式不相同
with TMemoryStream.Create do try
vWavFormat1.ChunkSize := vChunkSize1 + vChunkSize2 +
SizeOf(vWavFormat1) - 8;
vWavFormat1.SubChunk2Size := vChunkSize1 + vChunkSize2;
Write(vWavFormat1, SizeOf(TWavFormat));
CopyFrom(vFileStream1, vChunkSize1);
CopyFrom(vFileStream2, vChunkSize2);
try
SaveToFile(ANewFile);
except
Exit;
end;
finally
Free;
end;
finally
vFileStream1.Free;
vFileStream2.Free;
end;
Result := True;
end; { ConcatWavFile }
procedure TForm1.Button1Click(Sender: TObject);
begin
ConcatWavFile('c:/windows/media/chord.wav', 'c:/windows/media/chimes.wav',
'c:/temp/temp.wav');
end;