Тема: Слияние Wav
Показать сообщение отдельно
  #4  
Старый 19.05.2008, 17:05
Аватар для zip000
zip000 zip000 вне форума
Начинающий
 
Регистрация: 24.07.2007
Сообщения: 194
Репутация: 25
По умолчанию

PvP, вы немного напутали с форматом файла, дело в том, что ваше последнее поле DataBytes как раз и есть размер данных wav файла. А вот второе поле BytesFollowing это размер всего файла (или что-то другое, точно не помню уже). Попробуйте сделать как я написал. А вот за размер блока данных отвечает поле Block Align, которого у вас нет, точнее есть, но почему-то называется BytesPerSample.

UPD Вот посидел чуток, все работает. Обработку ошибок сами сделаете.
Код:
type
  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;

procedure JoinWAVEFiles(FileIn1, FileIn2, FileOut : String);
var
  f1, f2, fo : TFileStream;
  h1, h2, ho : TWaveHeader;
begin
  f1 := TFileStream.Create(FileIn1, fmOpenRead);
  f2 := TFileStream.Create(FileIn2, fmOpenRead);
  f1.Read(h1, SizeOf(h1));
  f2.Read(h2, SizeOf(h2));
  if (h1.Channels = h2.Channels) and
     (h1.SampleRate = h2.SampleRate) and
     (h1.BitsPerSample = h2.BitsPerSample) then begin
    ho := h1;
    ho.BytesFollowing := h1.BytesFollowing + h2.DataBytes;
    ho.DataBytes := h1.DataBytes + h2.DataBytes;
    fo := TFileStream.Create(FileOut, fmCreate);
    fo.Write(ho, SizeOf(ho));
 {  f1.Position := SizeOf(h1);
    f2.Position := SizeOf(h2); } как-то не обратил внимания, что эти строки можно убрать.
    fo.CopyFrom(f1, h1.DataBytes);
    fo.CopyFrom(f2, h2.DataBytes);
    fo.Free;
  end;
  f1.Free;
  f2.Free;
end;
__________________
Не профи, но и не чайник . D6 - лучше не придумали. Пока.
Ответить с цитированием