Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #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 - лучше не придумали. Пока.

Последний раз редактировалось zip000, 19.05.2008 в 21:24.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:19.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025