Главная страница
    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.012 c
15-1139920034
Alexey V.
2006-02-14 15:27
2006.03.12
Как такое делается? Впервые такое встретил


15-1140097645
Loginov Dmitry
2006-02-16 16:47
2006.03.12
Синхронизация таблиц БД


8-1128313266
ZSOmega
2005-10-03 08:21
2006.03.12
выравнивание 16 байт для SSE


10-1114366435
ink
2005-04-24 22:13
2006.03.12
Как в TWebBrowser поменять путь загрузки рисунка.


2-1140889474
Vitalik__
2006-02-25 20:44
2006.03.12
Неподскажите как сделать паузу 1 сек в программе?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский