Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
FreePascal / Lazarus
|
Re: WAV-Datei: Header auslesen
11. Mär 2009, 12:38
Hallo CARSTEN1234
vielleicht hilft Dir das hier:
Delphi-Quellcode:
type
{ prototyp für einen chunk in einer RIFF-Datei: }
T_chunkproto=packed record
name:array[0..3] of char;
lang:integer;
end;
T_RIFF_HEAD=packed record
name : Array [0..3] of char;
lange: integer;
name0: array[0..3] of char; { 'WAVE' }
end;
T_WAVE_FMThead=packed record
name : array[0..3] of char; {'fmt ' }
lang : integer; {4Byte }
ST_M : word; {2Byte - ST=1 Mono=0 }
Kanalanz : word; {2Byte }
SamplRate: integer; {4Byte }
Byte_sec : integer; {4Byte }
Byte_sample:word; {2Byte 1=8BMono; 2=8B St oder 16B Mono; 4=16B Stereo }
Bits_sample:word; {2Byte }
end;
T_fact_head=packed record
name : array[0..3] of char; { 'fact' }
lang : integer; {4Byte }
{daten.....lang Byte}
end;
t_data_head=packed record
name : array[0..3] of char; { 'data ' }
lang : integer; {4Byte }
{Daten....Lang Byte }
end;
var
riff_head: T_RIFF_HEAD;
wav_head : t_wave_fmthead;
data16ST : array of word;
data16MO : array of word;
data8ST : array of byte;
data8MO : array of byte;
pre_data : integer; { Anzahl Daten vor dem Data-Chunk }
function READ_HEADER(efile:string):boolean;
procedure READ_DATA(efile:string;cv:tcanvas;labl:tlabel);
function GET_PRE_DATA(efile:string):integer;
implementation
function GET_PRE_DATA(efile:string):integer;
var
edat : file;
buffer : array [0..$FFFF] of byte;
tb : t_chunkproto absolute buffer;
lies : integer;
gelesen : integer;
ende : boolean;
begin
result:=0;
assignfile(edat,efile);
reset(edat,1);
blockread(edat,buffer,sizeof(riff_head),gelesen); { RIFF-Header lesen}
repeat
blockread(edat,buffer,8,gelesen); { 4 char+ 4Byte länge}
if tb.name<>'data' then begin
lies:=tb.lang;
seek(edat,filepos(edat)+lies);
end
else begin
lies:=0;
result:=filepos(edat)-8;
end;
until eof(edat) or (tb.name='data');
closefile(edat);
end;{-- GET_PRE_DATA -----------------------------------------------------}
function READ_HEADER(efile:string):boolean;
var
edat : file;
buffer : array [0..$FFFF] of byte;
gelesen : integer;
begin
result:=false;
assignfile(edat,efile);
reset(edat,1);
blockread(edat,buffer,sizeof(riff_head),gelesen);
move(buffer[0],riff_head,sizeof(riff_head));
if (riff_head.name='RIFF') and (riff_head.name0='WAVE') then begin
result:=true;
blockread(edat,buffer,sizeof(wav_head),gelesen);
move(buffer[0],wav_head,sizeof(wav_head));
end;
closefile(edat);
end;
Gruß
K-H
|
|
Zitat
|