![]() |
|
#4
|
||||
|
||||
![]() 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; Не профи, но и не чайник ![]() ![]() Последний раз редактировалось zip000, 19.05.2008 в 21:24. |