合并两个 Wav 文件流的函数 - 回复 "刘文强" 的问题
2008-10-25 22:07
507 查看
问题来源: http://www.cnblogs.com/del/archive/2008/10/25/1069523.html#1351197
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} uses MMSystem; {合并两个 Wav 文件流的函数} function ConWavStream(AWavStream1, AWavStream2: TStream; var ANewStream: TStream): 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; vChunkSize1, vChunkSize2: Integer; begin Result := False; if AWavStream1.Read(vWavFormat1, SizeOf(TWavFormat)) <> SizeOf(TWavFormat) then Exit; if AWavStream2.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; {格式不同} vWavFormat1.ChunkSize := vChunkSize1 + vChunkSize2 + SizeOf(vWavFormat1) - 8; vWavFormat1.SubChunk2Size := vChunkSize1 + vChunkSize2; ANewStream.Write(vWavFormat1, SizeOf(TWavFormat)); ANewStream.CopyFrom(AWavStream1, vChunkSize1); ANewStream.CopyFrom(AWavStream2, vChunkSize2); Result := True; end; { ConWavStream End} var WavStream: TStream; {合并两个资源流; 之前要在资源中分别加载两个 WAV 文件, 并分别命名: wav1、wav2} procedure TForm1.FormCreate(Sender: TObject); var rs1,rs2: TResourceStream; begin rs1 := TResourceStream.Create(HInstance, 'wav1', RT_RCDATA); rs2 := TResourceStream.Create(HInstance, 'wav2', RT_RCDATA); WavStream := TMemoryStream.Create; ConWavStream(rs1, rs2, WavStream); rs1.Free; rs2.Free; end; procedure TForm1.FormDestroy(Sender: TObject); begin WavStream.Free; end; {循环播放} procedure TForm1.Button1Click(Sender: TObject); begin sndPlaySound(TMemoryStream(WavStream).Memory, SND_ASYNC or SND_MEMORY or SND_LOOP); end; {暂停} procedure TForm1.Button2Click(Sender: TObject); begin sndPlaySound(nil, 0); end; end.
相关文章推荐
- delphi 合并两个 Wav 文件流的函数
- delphi 合并两个 Wav 文件流的函数
- 合并两个 Wav 文件的函数
- mysql分库Max()函数出现两个值问题
- 给出一个函数来合并两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠
- php通过array_merge()函数合并两个数组的方法
- 重写一个字符串分割函数 - 回复 "tomzw" 的问题
- 如何比较两个二维数组是否相等 - 回复 "阿拉丁" 的问题
- 两个list合并的问题
- 获取多边形面积的函数 - 回复 "dacsd" 的问题
- 合并两个格式相同的wav文件
- 多个Excel文件中的多个Sheet合并到一个Excel文件中两个函数
- Oracle函数之单列合并函数WM_CONCAT问题记录
- PHP 函数之 array_merge_recursive,相同键合并问题
- 如何使用 URLOpenStream 函数 - 回复 "天泽" 的问题
- 关于sprintf函数——两个格式输出问题
- 给你两个有序链表,编写一个函数,把两个链表合并成一个新的有序链表,返回头指针
- php分割合并两个字符串的函数实例
- 合并两个数组的js函数
- 问题:求两个字符串的最长公共子串。 要求:输入两个字符串,输出它们的最长公共子串,包括长度。 设计: 设计一个类 String,包括一个 len(字符串长度)和字符串指针 s。另有如下成员函数: ·