Главная страница
    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.011 c
6-1132219975
ancara
2005-11-17 12:32
2006.03.12
Indy HTTPS


15-1140442412
7BB
2006-02-20 16:33
2006.03.12
Читал недавно что Борланд остановил работы над Дельфи и C++!


2-1140691792
VitV
2006-02-23 13:49
2006.03.12
Смена цвета кнопки


2-1140968384
DesertAlex
2006-02-26 18:39
2006.03.12
HTML-код в переменную


2-1140364917
Alsan
2006-02-19 19:01
2006.03.12
TListView - Поиск ???





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