type
TForm1 = class(TForm)
Button1: TButton;
Panel1: TPanel;
Panel2: TPanel;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TWaveHeader = record
Marker1: Array[0..3] of Char;
BytesFollowing: LongInt;
Marker2: Array[0..3] of Char;
Marker3: Array[0..3] of Char;
Fixed1: LongInt;
FormatTag: Word;
Channels: Word;
SampleRate: LongInt;
BytesPerSecond: LongInt;
BytesPerSample: Word;
BitsPerSample: Word;
Marker4: Array[0..3] of Char;
DataBytes: LongInt;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
fl: file of TWaveHeader;
fl3: file of TWaveHeader;
WaveHeader: TWaveHeader;
WaveHeader2: TWaveHeader;
WaveHeader3: TWaveHeader;
header:integer;
header2:integer;
header3:integer;
Buffer: pbyte;
I:longint;
c: longint;
v:longint;
begin
v:=0;
assignfile(fl, 'C:\bp.wav'); //Получаем заголовок файла
reset(fl);
read(fl, WaveHeader);
closefile(fl);
assignfile(fl, 'C:\SuJ.wav'); //Получаем заголовок файла
reset(fl);
read(fl, WaveHeader3);
closefile(fl);
GetMem(Buffer, WaveHeader.DataBytes);//Резервируем буфер для одной записи
header:=FileOPen('C:\SuJ.wav', fmOpenRead);
header3:=FileOPen('C:\bp.wav', fmOpenRead);
header2:=FileCreate('C:\magawave.wav', fmOpenWrite);
//Перекачиваем параметры
WaveHeader2.Marker1 := WaveHeader.Marker1 ;
WaveHeader2.BytesFollowing:=WaveHeader.BytesFollowing+WaveHeader3.BytesFollowing;
WaveHeader2.Marker2 := WaveHeader.Marker2;
WaveHeader2.Marker3 := WaveHeader.Marker3;
WaveHeader2.Fixed1 := WaveHeader.Fixed1;
WaveHeader2.FormatTag := WaveHeader.FormatTag;
WaveHeader2.SampleRate := WaveHeader.SampleRate;
WaveHeader2.Channels := WaveHeader.Channels;
WaveHeader2.BytesPerSecond := WaveHeader.BytesPerSecond;
WaveHeader2.BytesPerSample:=WaveHeader.BytesPerSample;
WaveHeader2.BitsPerSample := WaveHeader.BitsPerSample+WaveHeader3.BitsPerSample;
WaveHeader2.Marker4 := WaveHeader.Marker4;
WaveHeader2.DataBytes := WaveHeader.DataBytes;
v:=filewrite(header2, WaveHeader2, sizeof(WaveHeader2));
//Считываем первый файл
v:=fileseek(header, sizeOf(WaveHeader), 0);
//showmessage(inttostr(v));
c:=round(WaveHeader.BytesFollowing/WaveHeader.DataBytes);//Расчитываем количество блоков для считывания
//if c < WaveHeader.BytesFollowing/WaveHeader.DataBytes then c:=c+1;
I:=0;
while i<c do
begin
v:=fileread(header, Buffer^, WaveHeader.DataBytes);
//showmessage(inttostr(i));
v:=filewrite(header2, Buffer^, WaveHeader2.DataBytes);
i:=i+1;
end;
//Считываем второой файл
v:=fileseek(header3, sizeOf(WaveHeader3), 0);
c:=round(WaveHeader3.BytesFollowing/WaveHeader3.DataBytes);
//if c < WaveHeader3.BytesFollowing/WaveHeader3.DataBytes then c:=c+1;
I:=0;
while not(i=c) do
begin
v:=fileread(header3, Buffer^, WaveHeader3.DataBytes);
//showmessage(inttostr(v));
v:=filewrite(header2, Buffer^, WaveHeader2.DataBytes);
//showmessage(inttostr(v));
i:=i+1;
end;
fileclose(header);
fileclose(header3);
fileclose(header2);
end;
Программа для слияния файлов WAV(Delphi)
Код:
Но при работе этого кода, получается так что размер результирующего файла увеличивается, но прогрывается только часть первого файла. С чем это связано?