Форум: "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