Главная страница
    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.031 c
2-1140677728
Новочеркасский Волк
2006-02-23 09:55
2006.03.12
Перехват клавиш сервера., {TClientSocket. TServerSocket}


2-1140085820
PoetOfDelphi
2006-02-16 13:30
2006.03.12
Когда создать модуль данных


15-1140191596
Vendict
2006-02-17 18:53
2006.03.12
Передача параметра процедуре по ссылке в ассемблере


1-1139392424
ДенисНск
2006-02-08 12:53
2006.03.12
Очередь MSMQ


1-1138899629
Санек
2006-02-02 20:00
2006.03.12
Excel потеря фокуса





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