Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.12;
Скачать: CL | DM;

Вниз

Подскажите как склеить несколько wav - файлов в один?   Найти похожие ветки 

 
new___   (2005-09-28 17:08) [0]

сабж собственно


 
Jeer ©   (2005-09-28 17:29) [1]

1. "выдрать"  "чистые" данные
2. сконвертировать в единообразный формат
3. "сложить" по временной оси в нужной последовательности
4. расписать header в соответствии с 3

Вуа-ля.


 
New__   (2005-09-29 13:12) [2]

поскольку вопросов таких в инете полно, а ответа нет, выложу свое решение


// склеивает файлы с именами, перечисленными в SourceFiles, формирует файл с именем Destination
// рассчитана только(!) на файлы с одинаковыми заголовками(т.е. характеристиками сэмплирования итп)

function MergeWavFiles(const SourceFiles: TStringList; const Destination: string): boolean;

// для склейки однородных файлов имеют значение только FileLength и DataLength
 TWaveHeader = packed record    // всего-то 44 байта
   dummy1: array[1..4] of byte; //"RIFF"
   FileLength: cardinal;        // ну не длина файла, а длина файла минус 8 байт
   dummy2: array[1..8] of byte; //"WAVEfmt "
   ChunkLength: cardinal;       //
   dummy3: array[1..20] of byte;//
   DataLength: cardinal;
 end;

function MergeWavFiles(const SourceFiles: TStringList; const Destination: string): boolean;
var
 i, HeaderSize: integer;
 fssrc, fsdest: TFileStream;
 destheader: TWaveHeader;
begin
 try
   fsdest := TFileStream.Create(Destination, fmCreate);
   HeaderSize := sizeof(TWaveHeader);
   try
     for i := 0 to SourceFiles.Count - 1 do
       if FileExists(SourceFiles[i]) then
       begin
         fssrc := TFileStream.Create(SourceFiles[i], fmOpenRead);
         try
           if fsdest.Size = 0 then  // копируем заголовок первого существующего файла в заголовок суммы
           begin
             fssrc.Seek(0, soFromBeginning);
             fssrc.Read(destheader, HeaderSize);
           end;
           fssrc.Seek(HeaderSize, soFromBeginning);
           fsdest.CopyFrom(fssrc, fssrc.Size - HeaderSize); // копируем только данные(без заголовков)
           // потом модифицируем счетчики размера
           destheader.DataLength := destheader.DataLength + fssrc.Size - HeaderSize;
           destheader.FileLength := destheader.FileLength + fssrc.Size - HeaderSize;
         finally
           fssrc.Free;
         end;
       end;
     fsdest.Seek(0, soFromBeginning);
     fsdest.Write(destheader, HeaderSize);
     Result := true;
   finally
     fsdest.Free;
   end;
 except
   Result := false;
 end;
end;


вуа - ля(привет и спасибо Jeer)


 
New__   (2005-09-29 13:12) [3]

поскольку вопросов таких в инете полно, а ответа нет, выложу свое решение


// склеивает файлы с именами, перечисленными в SourceFiles, формирует файл с именем Destination
// рассчитана только(!) на файлы с одинаковыми заголовками(т.е. характеристиками сэмплирования итп)

function MergeWavFiles(const SourceFiles: TStringList; const Destination: string): boolean;

// для склейки однородных файлов имеют значение только FileLength и DataLength
 TWaveHeader = packed record    // всего-то 44 байта
   dummy1: array[1..4] of byte; //"RIFF"
   FileLength: cardinal;        // ну не длина файла, а длина файла минус 8 байт
   dummy2: array[1..8] of byte; //"WAVEfmt "
   ChunkLength: cardinal;       //
   dummy3: array[1..20] of byte;//
   DataLength: cardinal;
 end;

function MergeWavFiles(const SourceFiles: TStringList; const Destination: string): boolean;
var
 i, HeaderSize: integer;
 fssrc, fsdest: TFileStream;
 destheader: TWaveHeader;
begin
 try
   fsdest := TFileStream.Create(Destination, fmCreate);
   HeaderSize := sizeof(TWaveHeader);
   try
     for i := 0 to SourceFiles.Count - 1 do
       if FileExists(SourceFiles[i]) then
       begin
         fssrc := TFileStream.Create(SourceFiles[i], fmOpenRead);
         try
           if fsdest.Size = 0 then  // копируем заголовок первого существующего файла в заголовок суммы
           begin
             fssrc.Seek(0, soFromBeginning);
             fssrc.Read(destheader, HeaderSize);
           end;
           fssrc.Seek(HeaderSize, soFromBeginning);
           fsdest.CopyFrom(fssrc, fssrc.Size - HeaderSize); // копируем только данные(без заголовков)
           // потом модифицируем счетчики размера
           destheader.DataLength := destheader.DataLength + fssrc.Size - HeaderSize;
           destheader.FileLength := destheader.FileLength + fssrc.Size - HeaderSize;
         finally
           fssrc.Free;
         end;
       end;
     fsdest.Seek(0, soFromBeginning);
     fsdest.Write(destheader, HeaderSize);
     Result := true;
   finally
     fsdest.Free;
   end;
 except
   Result := false;
 end;
end;


вуа - ля(привет и спасибо Jeer)


 
new___   (2005-09-29 13:13) [4]

что такое? убейте дубли


 
wicked ©   (2005-09-29 23:21) [5]

код неверен.... более того, глюкав, так как будет верно работать на бОльшей части файлов....
поэтому - читать мсдн, там всё написано...



Страницы: 1 вся ветка

Текущий архив: 2006.03.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.046 c
3-1137486166
mss
2006-01-17 11:22
2006.03.12
Sql ошибка


2-1140599091
ttt_111
2006-02-22 12:04
2006.03.12
Почему не запусается прграмма


8-1127912924
new___
2005-09-28 17:08
2006.03.12
Подскажите как склеить несколько wav - файлов в один?


15-1140429844
isasa
2006-02-20 13:04
2006.03.12
Конвертация данных - стоимость


2-1140813780
TStas
2006-02-24 23:43
2006.03.12
В каком модуле описана DeleteFolder