Как разрезать 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/