合并两个格式相同的WAV文件时间:2011-6-2来源:yang 作者: peng点击: 6次
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; |
|