delphi 合并两个 Wav 文件流的函数

delphi 合并两个 Wav 文件流的函数

合并两个 Wav 文件的函数

实例一

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.

实例二

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.
时间: 2024-10-10 05:48:49

delphi 合并两个 Wav 文件流的函数的相关文章

合并两个yuv文件的C++代码

//将BasketballPass_416x240_50.yuv序列的前50帧和BlowingBubbles_416x240_50.yuv序列的前250帧合并成out.yuv //参数配置416 240 50 BasketballPass_416x240_50.yuv 416 240 250 BlowingBubbles_416x240_50.yuv out.yuv #include <iostream> #include <fstream> using namespace std

9、流类库与输入/输出2.3输出文件流成员函数

输出流成员函数有三种类型: 与操作符等价的成员函数: 执行非格式化写操作的成员函数 其他修改流状态且不同于操作符或插入运算符的成员函数 对于顺序的格式化输出,可以仅使用插入运算符和操作符.对于随机访问二进制磁盘输出,使用其他成员函数,使用或不使用插入运算符. 1.输出流的open函数 2.输出流的close函数 close成员函数关闭与一个输出文 件流关联的磁盘文件.文件使用完毕后必须将其关闭以完成所有磁盘输出.虽然ofstream析构函数会自动完成关闭,但如果在同一流对象上打开另外的文件,就需

RF合并多个output文件,并生成新的log和report文件

 合并两个output文件并生成新的log和report文件命令: rebot -d 合并生成的log和report文件保存路径 第1个output文件 第2个output文件 通过执行套件层.txt将结果生成第1个output文件,并存放在output1路径下: 通过执行套件层2.txt将结果生成第2个output文件,并存放在output2路径下: 将两次生成的output文件进行合并重新生成log和report文件,并存放在D:\testproject\project2\testoutpu

C语言中文件流操作基本函数总结

函数所在头文件:stdio.h 说明:前半部分主要为对各个文件流操作函数的例举,后半部分着重于 上机运行分析.文中部分引用自王桂林老师的C/C++课件. 1.FIELE *fopen(const char*filename,const char *mode) 以mode的方式,打开一个以filename(指针类型)命名的文件, 返回一个指向该文件缓冲区的指针,该指针是后续操作的句柄. 2.int fclose(FILE *stream) fclose()用来关闭先前用fopen()打开的文件.并

合并两个文件

原文:合并两个文件 源代码下载地址:http://www.zuidaima.com/share/1550463699438592.htm 使用java合并两个已存在的文件的内容到一个新的文件去 import java.io.*; package com.zuidaima.file.util; /** *@author www.zuidaima.com **/ class combinefile{ public static void main(String[] args) throws IOEx

delphi 基础之三 文件流操作

文件流操作 Delphi操作流文件:什么是流?流,简单来说就是建立在面向对象基础上的一种抽象的处理数据的工具.在流中,定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员是对流进行所有操作的,而不用关心流的另一头数据的真正流向.流不但可以处理文件,还可以处理动态内存.网络数据等多种数据形式.如果你对流的操作非常熟练,在程序中利用流的方便性,写起程序会大大提高效率的. 一.Delphi中流的基本概念及函数声明 在Delphi中,所有流对象的基类为TStream类,其中定义了所有流的共同属性

awk合并两个文件

awk 合并两个文件: awk 'NR==FNR{a[i]=$0;i++}NR>FNR{print a[j]"    "$0;j++}' template interface > interface_last template: Template Log tqt_url-response-code Template Log tqt_url-response-code Template Log tqt_url-response-code Template Log tqt_ur

通用静态库的生成,使用lipo将两个.a文件合并成一个

百度地图.支付宝用到过将2个.a文件合并 通用静态库的生成 打开命令行 (终端) 输入: lipo -create 然后依次把两个.a文件拖到终端窗口, 命令行会变成这样: lipo -create /Library/SDKs/CorePlotSDK/iphoneos.sdk/usr/lib/libCorePlot.a /Library/SDKs/CorePlotSDK/iphonesimulator.sdk/usr/lib/libCorePlot.a 然后接着输入 -output 目标文件路径

linux下合并两个文件夹

Linux下目录的合并以及文件的覆盖案例: 有两个目录test和new,test目录下有目录和文件,new目录下有更改过的一些test下的目录和文件,以及一些新增的文件,现在对两个目录进行合并以及覆盖test下的旧文件 cp -frap new/* test/ 命令其实非常简单,解释下: -f  强制覆盖,不询问yes/no(-i的默认的,即默认为交互模式,询问是否覆盖) -r  递归复制,包含目录 -a  做一个备份,这里可以不用这个参数,我们可以先备份整个test目录 -p  保持新文件的属