Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Слияние Wav файлов

1.2K
28 мая 2008 года
PAVEL BASIC
171 / / 24.07.2006
Хочу написать прогу для слияния двух файлов в один, написал код, но в результате выходной файл получается увеличенного объёма, но проигрывается только первая часть файла. Не могу найти ошибку...:(

Код:
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;
BlockAlign  : 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.BlockAlign:=WaveHeader.BlockAlign+WaveHeader3.BlockAlign;
WaveHeader2.BitsPerSample := WaveHeader.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.BlockAlign)+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.
1.9K
01 июня 2008 года
andriano
474 / / 10.01.2008
Код не смотрел.
wav-файл состоит из заголовка и тела. При объединении файлов (я так понял, для последовательного воспроизведения, для одновременного - иначе) нужно записать один заголовок, соответствующий суммарной длине, а затем тело, состоящее из тел обоих файлов.
Все это, естесвенно, если параметры звука (разрядность, частота дискретизации, количество каналов) у обоих файлов в точности совпадают.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог