合并两个格式相同的wav文件

碰到这个问题也是照常搜索一下历史的资料

发现一条线索:“通过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;