![]() |
|
#1
|
|||
|
|||
![]() Здравствуйте, мне нужно слить два файла wav в один, я написал вот этот код:
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; 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; function GetFileInfo(Fn:string):string; var fl: file of TWaveHeader; WaveHeader: TWaveHeader; begin assignfile(fl, Fn); //Получаем заголовок файла reset(fl); read(fl, WaveHeader); closefile(fl); GetFileInfo:='Метка №1: '+WaveHeader.Marker1+chr(13)+'Количество байт в файле: '+inttostr(WaveHeader.BytesFollowing)+chr(13)+'Метка №2: '+WaveHeader.Marker2+chr(13)+'Метка №3:'+WaveHeader.Marker3+chr(13)+'Байт в секунду: '+inttostr(WaveHeader.BytesPerSecond)+chr(13)+'Фиксированный: '+inttostr(WaveHeader.Fixed1)+chr(13)+'Тэг формата: '+inttostr(WaveHeader.FormatTag)+chr(13)+'Частота: '+inttostr(WaveHeader.SampleRate)+chr(13)+'Количество каналов: '+inttostr(WaveHeader.Channels)+chr(13)+'Байт в сэмпле: '+inttostr(WaveHeader.BytesPerSample)+chr(13)+'Бит в сэмпле: '+inttostr(WaveHeader.BitsPerSample)+chr(13)+'Метка №4: '+WaveHeader.Marker4+chr(13)+'Байт в блоке: '+inttostr(WaveHeader.DataBytes); end; procedure TForm1.FormCreate(Sender: TObject); begin label1.Caption:=GetFileInfo('C:\bp.wav'); label2.Caption:=GetFileInfo('C:\SuJ.wav'); end; end. Но к сожалению при воспроизведении созданного файла, проигрывается только Первая часть файла. С чем это может быть связано? |