Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];

Вниз

Подскажите как склеить несколько 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 вся ветка

Форум: "Media";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.014 c
15-1139941157
YurikGL
2006-02-14 21:19
2006.03.12
Путь модератора...


15-1140453655
Михаил (Киров)
2006-02-20 19:40
2006.03.12
COM-порт


15-1139924462
Quasilamo
2006-02-14 16:41
2006.03.12
Фотик(цифра) в пределах 300$


2-1140430400
Елизавета
2006-02-20 13:13
2006.03.12
CheckBox как столбец компонента TStringGrid


3-1137783314
olevacho_
2006-01-20 21:55
2006.03.12
Ошибка cannot transliterate character between character sets





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский