[ naskovic @ 01.03.2009. 12:17 ] @
Poštovani, potrebna mi je procedura ili funkcija koja spaja više wav fajla u jedan.
ja sam našao na netu sledeću proceduru koja posle spajanja daje wav fajl u kome se čuje pucketanje.
Fajlovi su istog formata tako da ne znam kako da rešim problem. Molim za pomoć.

procedure JoinWaves(FileList: TStrings; OutputFile: string);
{All files must be of the same format}
var
I: Integer;
FileSize: LongInt;
InStream, OutStream: TFileStream;
begin
OutStream := TFileStream.Create(OutputFile, fmCreate);
try
for I := 0 to FileList.Count - 1 do
if FileExists(FileList[I]) then
begin
InStream := TFileStream.Create(FileList[I], fmOpenRead);
try
if I = 0 then
OutStream.CopyFrom(InStream, InStream.Size)
else if InStream.Size > 44 then
begin
InStream.Position := 44;
OutStream.CopyFrom(InStream, InStream.Size - 44);
end;
finally
InStream.Free;
end;
end;
OutStream.Position := 4;
FileSize := OutStream.Size - 8;
OutStream.WriteBuffer(FileSize, SizeOf(FileSize));
OutStream.Position := 40;
FileSize := OutStream.Size - 44;
OutStream.WriteBuffer(FileSize, SizeOf(FileSize));
finally
OutStream.Free;
end;
end;
[ Boris B. @ 01.03.2009. 16:43 ] @
Kod koji si postovao pretpostavlja da je velicina WAV header-a 44 bajta, sto ne mora uvek da bude slucaj. Iz koda se vidi da funkcija kopira header prvog fajla direktno u izlazni fajl i posle mu samo menja velicinu kada se zadnji fajl iskopira. Proveri prvo da li su wave-ovi koje hoces da spojis standardni (44 byte header) i zaista istog formata (sample rate i sample size, vidi se u properties->summary prozoru explorera). Ako jesu onda potrazi mogucu gresku u delu koda koji zapisuje velicinu fajla. Strukturu standardnog 44 byte header-a mozes da nadjes npr. na http://mathmatrix.narod.ru/Wavefmt.html

Ako ti nista od toga ne uspe ili ti wave-ovi imaju zaista nestandardne headere (mozda cak i non-audio data chunks, npr. cue points) mozes da probas sa NewAC Delphi komponentama, mislim da imaju bas komponentu za spajanje audio fajlova: http://symmetrica.net/newac/

Btw, kada postujes kod na forumu, postuj ga izmedju [ code ] i [/ code] tagova (samo bez razmaka, ne znam da escapujem), tako sacuvas identaciju i prikaze se sa monospace fontom


EDIT:
Izgleda da nema greske u delu koda koji zapisuje velicinu streama (a i kad bi je bilo ne bi sigurno prouzrokovala "pucketanje"). Proveri da li ti svi ulazni fajlovi sadrze rec "data" na tacno 36 bajtu.

[Ovu poruku je menjao Boris B. dana 01.03.2009. u 17:57 GMT+1]
[ naskovic @ 02.03.2009. 00:24 ] @
Hvala puno, mislim da sam resio problem