Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.11;
Скачать: CL | DM;

Вниз

Как вырезать звуковой фрагмент из WAV потока?   Найти похожие ветки 

 
D. Andrew   (2004-04-23 09:30) [0]

Мастера! Подскажите! Как извлечь из wav потока (wav stream) необходимый фрагмент?
Задача:
Создан wav поток и в него занесена некая звуковая информация, например слова. Необходимо выделить фрагмент данных wav потока (например, вырезать необходимую звуковую информацию (нужное слово) из общей).
Как вырезать любой звуковой фрагмент из большого файла/потока формата MP3 либо WAV? Пожалуйста, практический пример! Спасибо!


 
uny   (2004-04-23 09:56) [1]

если из файла wav - взять формат wav файла, почитать. там заголовок+данные. отсчитываешь сколько надо от начала и извлекаешь


 
D. Andrew   (2004-04-23 10:05) [2]

Спасибо!
Но, можно хотя бы маленький пример!
Вот формат, конкретно, применяемый мною:
type
 WAVHDR = packed record
   Riff           : array[0..3] of Char;
   Len            : DWord;
   cWavFmt        : array[0..7] of Char;
   dwHdrLen       : DWord;
   wFormat        : Word;
   wNumChannels   : Word;
   dwSampleRate   : DWord;
   dwBytesPerSec  : DWord;
   wBlockAlign    : Word;
   wBitsPerSample : Word;
   cData          : array[0..3] of Char;
   dwDataLen      : DWord;
 end;
Еще раз спасибо за помощь и практический пример!


 
uny   (2004-04-23 11:48) [3]

делать было нечего, я вручную узнавал формат wav, может быть не верно:)
и давно это было:)
открывает wav файл, достаёт смещение заголовка и размер вроде

function openwave(df:string; var ofs:integer; var hh:integer):boolean;
type
 twave = packed record
 riff:longword;    //riff = 0x46464952
 len:integer;     //длина файла - 8
 wave:longword;    //wave = 0x45564157
 fmt:longword;     //fmt  = 0x20746D66
 lenkus:longword;  //длина этого куска wav - файла
 typewav:word;//тип звуковых данных (1 просто, 0x101 - IBM mu-law, 0x102 - IBM a-law; 0x103 - ADPCM.
 channels:word;//число каналов 1/2
 SamplesPerSec:longword; //частота выборки
 AvgBytesPerSec:longword;//частота выдачи байтов
 align:word; //выравнивание
 bits:word; //число бит на выборку
 end;
var deda:twave;
s:tsearchrec;
b,i:integer; buba:char; bu:longword;
label 100;
begin
if df="" then begin result:=false; goto 100; end;
if findfirst(df,faanyfile,s)<>0 then begin result:=false; goto 100; end;
b:=fileopen(df,fmopenread);
if b<0 then begin result:=false; goto 100; end;
fileread(b,deda,sizeof(deda));
ofs:=sizeof(deda);

if deda.riff<>$46464952 then begin result:=false; goto 100; end;
if deda.wave<>$45564157 then begin result:=false; goto 100; end;
if deda.fmt<>$20746D66 then begin result:=false; goto 100; end;
if s.Size<>deda.len+8 then begin result:=false; goto 100; end;

for i:=1 to deda.lenkus-16 do begin fileread(b,buba,1); ofs:=ofs+1; end;

fileread(b,bu,4); ofs:=ofs+4;
if bu<>$61746164 then begin result:=false; goto 100; end;
fileread(b,bu,4); //длительность

ofs:=ofs+4;

//упаковка = левый правый, 1 2

hh:=bu div 2;
fileclose(b);
findclose(s);
result:=true;
100:
end;


 
D.Andrew   (2004-04-23 13:21) [4]

function openwave(df:string; var ofs:integer; var hh:integer):boolean;

А что означают параметры df:string; var ofs:integer; var hh:integer?
Можно пример практического использования функции?
Если df - это имя файла, то у меня проблема именно из потока (WaveStream) извлечь фрагмент. Можно эту функцию как-то модифицировать под данную задачу (под поток)?
Спасибо!



Страницы: 1 вся ветка

Текущий архив: 2004.07.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.025 c
1-1088592098
plt
2004-06-30 14:41
2004.07.11
Выделение группы объектов


1-1087902478
cdadmitriy
2004-06-22 15:07
2004.07.11
Как перерисовать один NODE in TTreeView без изменения текста


1-1088177777
Lexa
2004-06-25 19:36
2004.07.11
как сделать текст в виде ссылки


1-1088246582
X9
2004-06-26 14:43
2004.07.11
CM_MOUSEENTER, CM_MOUSELEAVE и TSpeedButton


3-1086671031
Makyha
2004-06-08 09:03
2004.07.11
SQL in Delphi