合并两个 Wav 文件的函数
2008-10-25 21:54
441 查看
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} {合并两个 Wav 文件的函数} function ConWavFile(AWavFile1, AWavFile2, ANewFile: string): Boolean; type TWavFormat = packed record ChunkID: array[0..3] of AnsiChar; {'RIFF'} ChunkSize: Longword; {size-8} Format: array[0..3] of AnsiChar; {'WAVE'} SubChunk1ID: array[0..3] of AnsiChar; {'fmt '} 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} BitsPerSample: Word; {BytesperSample *8} SubChunk2ID: array[0..3] of AnsiChar; {'data'} SubChunk2Size: Longword; {number of data bytes} end; 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(PAnsiChar(AnsiString(AWavFile1)), OF_READ or OF_SHARE_DENY_NONE); vFileHandle2 := _lopen(PAnsiChar(AnsiString(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; { ConWavFile End} {测试} procedure TForm1.Button1Click(Sender: TObject); var Wav1,Wav2,WavDest: string; begin Wav1 := 'c:\temp\1.wav'; Wav2 := 'c:\temp\2.wav'; WavDest := 'c:\temp\12.wav'; if ConWavFile(Wav1, Wav2, WavDest) then ShowMessageFmt('''%s'' 和 ''%s'' 已成功合并到 ''%s''', [Wav1,Wav2,WavDest]); end; end.
相关文章推荐
- 将两个Wav文件合并为一个
- 合并两个 Wav 文件流的函数 - 回复 "刘文强" 的问题
- delphi 合并两个 Wav 文件流的函数
- 合并两个格式相同的wav文件
- 多个Excel文件中的多个Sheet合并到一个Excel文件中两个函数
- delphi 合并两个 Wav 文件流的函数
- 合并两个yuv文件的C++代码
- 有两个磁盘文件 A,B 各放一行字母,要求把两文件信息合并(按字母排序),输出到C 中
- 写.wav文件的三个关键函数
- 对比两个文件是否相同的函数
- python学习:两个py文件间的函数调用
- Dos命令将两个文本文件内容合并
- PHP将两个关联数组合并函数---提高函数效率
- Js $.merge() 函数(合并两个数组内容到第一个数组)
- 怎样在wincam中合并两个文件
- 用shell 或者 awk 合并两个文件
- xml文件生成的两个函数
- Wave 文件(11): 使用 waveIn...函数录制 wav 文件
- PHP 合并两个PDF成一个PDF文件利器 FPDI
- python实现合并两个文件并打印输出