Как разрезать wav файл?

Previous  Top  Next

    
 

 

 

Code:

type

TWaveHeader = record

   ident1: array[0..3] of Char;       // Must be "RIFF"

   len: DWORD;                        // remaining length after this header

   ident2: array[0..3] of Char;       // Must be "WAVE"

   ident3: array[0..3] of Char;       // Must be "fmt "

   reserv: DWORD;                     // Reserved Size

   wFormatTag: Word;                  // format type

   nChannels: Word;                   // number of channels (i.e. mono, stereo, etc.)

   nSamplesPerSec: DWORD;             //sample rate

   nAvgBytesPerSec: DWORD;            //for buffer estimation

   nBlockAlign: Word;                 //block size of data

   wBitsPerSample: Word;              //number of bits per sample of mono data

   cbSize: Word;                      //the count in bytes of the size of

   ident4: array[0..3] of Char;       //Must be "data"

end;

 

 

 

You can load the file header with this function:

 

Code:

function GetWaveHeader(FileName: TFilename): TWaveHeader;

const

riff = 'RIFF';

wave = 'WAVE';

var

f: TFileStream;

w: TWaveHeader;

begin

if not FileExists(Filename) then

   exit;

 

try

   f := TFileStream.create(Filename, fmOpenRead);

   f.Read(w, Sizeof(w));

 

   if w.ident1 <> riff then

   begin

     Showmessage('This is not a RIFF File');

     exit;

   end;

 

   if w.ident2 <> wave then

   begin

     Showmessage('This is not a valid wave file');

     exit;

   end;

 

finally

   f.free;

end;

 

Result := w;

end;

 

 

 

Now we have all for creating the code for spliting the wave file:

 

Code:

 

function SplitWave(Source, Dest1, Dest2: TFileName; Pos: Integer): Boolean;

var

f1, f2, f3: TfileStream;

w: TWaveHeader;

p: Integer;

begin

Result:=False

 

if not FileExists(Source) then

   exit;

 

try

   w := GetWaveHeader(Source);

 

   p := Pos - Sizeof(TWaveHeader);

 

   f1 := TFileStream.create(Source, fmOpenRead);

   f2 := TFileStream.create(Dest1, fmCreate);

   f3 := TFileStream.create(Dest2, fmCreate);

 

   {++++++++++Create file 1 ++++++++++++++++}

   w.len := p;

   f2.Write(w, Sizeof(w));

   f1.position := Sizeof(w);

   f2.CopyFrom(f1, p);

   {++++++++++++++++++++++++++++++++++++++++}

 

   {+++++++++++Create file 2 +++++++++++++++}

   w.len := f1.size - Pos;

   f3.write(w, Sizeof(w));

   f1.position := Pos;

   f3.CopyFrom(f1, f1.size - pos);

   {++++++++++++++++++++++++++++++++++++++++}

finally

   f1.free;

   f2.free;

   f3.free;

end;

 

Result:=True;

end;

©Drkb::04300

 

Взято с Delphi Knowledge Base: http://www.baltsoft.com/