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

Вниз

запись звукового потока   Найти похожие ветки 

 
mstitel   (2006-10-07 22:35) [0]

подскажите как записать все звуки, которые в данный момент проигрываются на компе.


 
Eraser ©   (2006-10-08 15:13) [1]

> [0] mstitel   (07.10.06 22:35)

waveInAddBuffer
waveInClose
waveInGetDevCaps
waveInGetErrorText
waveInGetID
waveInGetNumDevs
waveInGetPosition
waveInMessage
waveInOpen
waveInPrepareHeader
waveInProc
waveInReset
waveInStart
waveInStop
waveInUnprepareHeader
+ F1


 
Проггер из библиотеки   (2006-10-08 15:17) [2]

> [1]
А оно поможет отловить, например, те звуки, которые в это время играет какой-нибудь WinAmp или Windows Media Player? Насколько я понимаю, автор именно это прости...


 
Vovan#1   (2006-10-08 15:37) [3]

>А оно поможет отловить, например, те звуки, которые в это время играет какой-нибудь WinAmp или Windows Media Player? Насколько я понимаю, автор именно это прости..

Может.


 
Сергей М. ©   (2006-10-09 08:28) [4]


> Проггер из библиотеки   (08.10.06 15:17) [2]
>
> > [1]
> А оно поможет


Нет, не поможет.


 
ProgRAMmer Dimonych ©   (2006-10-09 18:49) [5]

> [3] и [4]
Так да или нет? :)


 
Сергей М. ©   (2006-10-10 08:23) [6]


> ProgRAMmer Dimonych ©   (09.10.06 18:49) [5]


Точнее поможет лишь в частном случае, когда микшер аудиокарты поддерживает запись от источника "What you hear".


 
S0ldier ©   (2006-10-10 18:28) [7]

http://delphimaster.net/view/8-1154023549/


 
Vovan#1   (2006-10-10 20:57) [8]

2 Сергей М:

Похоже, за Вами правда. Но как тогда работают программы, которые грабят любой звук, производимый системой?


 
Eraser ©   (2006-10-11 01:08) [9]

> [8] Vovan#1   (10.10.06 20:57)

и midi тоже? )

большенство современных звуковых карт (я б сказал 95%) позволяют "перехватывать" микшер.


 
Сергей М. ©   (2006-10-11 08:28) [10]


> Vovan#1   (10.10.06 20:57) [8]



> программы, которые грабят любой звук


Таких программ нет и быть не может.


 
zorgens   (2006-10-11 14:08) [11]


> Таких программ нет и быть не может.


Это точно.
В свойствах записи выбирай стереомикшер и всё будешь писать.


 
Сергей М. ©   (2006-10-11 14:39) [12]


> zorgens   (11.10.06 14:08) [11]


Аудиодивйс не обязан иметь такое свойство.


 
zorgens   (2006-10-11 14:53) [13]


> Аудиодивайс не обязан иметь такое свойство.


ну это уже риторический пошёл разговор.
давайте ещё вспомним когда софт на спикер что-то там синтезировал,
помню был у меня типа spechApi под DOS, мда было время...

вот мститель, разбирайся если хочешь:

uses MMSystem, wavfile;

procedure TForm1.Button1Click(Sender: TObject);
const
 fr = 11025; {Частота в герцах}
 len = 1; {Длина звука в секундах}

 procedure GetData(ch: smallint; index: integer; var res);
 var
   v: smallint absolute res; // конечное значение
   amp: single; // амплитуда
 begin
   if ch = 0
     then amp := sin(index * 2 * Pi / (fr * len))
     else amp := cos(index * 2 * Pi / (fr * len));
   v := round(amp * (random(60000) - 30000));
 end;

var
 M: TMemoryStream; // поток для хранения информации в памяти
 F: TFileStream; // Поток для созранения файла
begin
 M := nil; F := nil;
 try
   M := TMemoryStream.Create;
   randomize;
   SaveSound(M {Куда записывать}, round(fr * len) {len секунд},
     fr {частота}, 16 {16 бит}, 2 {2 каналла}, @GetData);
   // Воспроизведение звука:
   if not playsound(M.Memory, 0, SND_MEMORY or SND_LOOP or SND_ASYNC)
     then ShowMessage("Can not play the sound");

   F := TFileStream.Create("ex.wav", fmCreate);
   M.Position := 0;
   F.CopyFrom(M, M.Size);
 finally
   M.Free; F.Free;
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 playsound(nil, 0, 0); // Остановка воспроизведения
end;

procedure TForm1.Button3Click(Sender: TObject);
var
 SampleCount, SamplesPerSec: integer;
 BitsPerSample, Channeles: smallint;
 F: TFileStream;
 Volume: array [0..1] of single;
 ToPercent: single;
 buf: pointer;
 buf8: ^shortint;
 buf16: ^smallint;
 i, ch: integer;
begin
 F := nil; buf := nil;
 try
   Volume[0] := 0; Volume[1] := 0;
   F := TFileStream.Create("ex.wav", fmOpenRead);
   ReadWaveHeader(F, SampleCount, SamplesPerSec,
     BitsPerSample, Channeles);

   // Чтение данных:
   GetMem(buf, SampleCount * Channeles * BitsPerSample);
   F.Read(buf^, SampleCount * Channeles * BitsPerSample);
   if BitsPerSample = 8 then begin
     buf8 := buf;
     for i := 0 to SampleCount - 1 do
       for ch := 0 to Channeles - 1 do begin
         Volume[ch] := Volume[ch] + abs(buf8^);
         inc(buf8); // Переход к следующему элементу
       end
   end else begin
     buf16 := buf;
     for i := 0 to SampleCount - 1 do
       for ch := 0 to Channeles - 1 do begin
         Volume[ch] := Volume[ch] + abs(buf16^);
         inc(buf16); // Переход к следующему элементу
       end;
   end;

   // Вывод результатов:
   ToPercent := (1 shl BitsPerSample) / 100 * SampleCount;
   if Channeles = 1
     then Form1.Caption := Format("volume: %2.2f%%",
       [Volume[0] / ToPercent])
     else Form1.Caption := Format("left: %2.2f%%, right: %2.2f%%",
       [Volume[0] / ToPercent, Volume[1] / ToPercent]);
 finally
   F.Free;
   FreeMem(buf);
 end;
end;

--------------------------------------------------------------------------------

unit wavfile;

interface

uses classes, sysutils;

type
 TWaveHeader = record
   idRiff: array [0..3] of char;
   RiffLen: longint;
   idWave: array [0..3] of char;
   idFmt: array [0..3] of char;
   InfoLen: longint;
   WaveType: smallint;
   Ch: smallint;
   Freq: longint;
   BytesPerSec: longint;
   align: smallint;
   Bits: smallint;
 end;

 TDataHeader = record
   idData: array [0..3] of char;
   DataLen: longint;
 end;

 TGetData = procedure(ch: smallint; index: integer; var res);
 TSetData = procedure(ch: smallint; index: integer; data: smallint);

procedure CreateWaveHeader(SampleCount, SamplesPerSec: integer;
 BitsPerSample, Channeles: smallint; var WaveHeader: TWaveHeader;
 var DataHeader: TDataHeader);
procedure ReadWaveHeader(Stream: TStream;
 var SampleCount, SamplesPerSec: integer;
 var BitsPerSample, Channeles: smallint);
procedure SaveSound(Stream: TStream; SampleCount, SamplesPerSec: integer;
 BitsPerSample, Channeles: smallint; GetData: TGetData);

implementation

procedure Creat
 BitsPerSample, Channeles: smallint; var WaveHeader: TWaveHeader;
 var DataHeader: TDataHeader);
var
 len: integer;
begin
 if (SampleCount <  0) or (SamplesPerSec <  1) or
   (not BitsPerSample in [8, 16]) or
   (not Channeles in [1, 2])
   then raise Exception.Create("Wrong params");

 len := SampleCount * BitsPerSample div 8 * Channeles;
 with WaveHeader do begin
   idRiff := "RIFF";
   RiffLen := len + 38;
   idWave := "WAVE";
   idFmt := "fmt ";
   InfoLen := 16;
   WaveType := 1;
   Ch := Channeles;
   Freq := SamplesPerSec;
   BytesPerSec := SamplesPerSec * BitsPerSample div 8 * Channeles;
   align := Channeles * BitsPerSample div 8;
   Bits := BitsPerSample;
 end;
 with DataHeader do begin
   idData := "data";
   DataLen := len;
 end;
end;

procedure ReadWaveHeader(Stream: TStream;
 var SampleCount, SamplesPerSec: integer;
 var BitsPerSample, Channeles: smallint);
var
 WaveHeader: TWaveHeader;
 DataHeader: TDataHeader;
begin
 Stream.Read(WaveHeader, sizeof(TWaveHeader));
 with WaveHeader do begin
   if idRiff < >  "RIFF" then raise EReadError.Create("Wrong idRIFF");
   if idWave < >  "WAVE" then raise EReadError.Create("Wrong idWAVE");
   if idFmt < >  "fmt " then raise EReadError.Create("Wrong idFmt");
   if WaveType < >  1 then raise EReadError.Create("Unknown format");
   Channeles := Ch;
   SamplesPerSec := Freq;
   BitsPerSample := Bits;
   Stream.Seek(InfoLen - 16, soFromCurrent);
 end;
 Stream.Read(DataHeader, sizeof(TDataHeader));
 if DataHeader.idData = "fact" then begin
   Stream.Seek(4, soFromCurrent);
   Stream.Read(DataHeader, sizeof(TDataHeader));
 end;
 with DataHeader do begin
   if idData < >  "data" then raise EReadError.Create("Wrong idData");
   SampleCount := DataLen div (Channeles * BitsPerSample div 8)
 end;
end;

procedure SaveSound(Stream: TStream; SampleCount, SamplesPerSec: integer;
 BitsPerSample, Channeles: smallint; GetData: TGetData);
var
 WaveHeader: TWaveHeader;
 DataHeader: TDataHeader;
 buf: smallint;
 BytesPerSample: smallint;
 i: integer;
begin
 CreateWaveHeader(SampleCount, SamplesPerSec, BitsPerSample,
   Channeles, WaveHeader, DataHeader);
 Stream.Write(WaveHeader, sizeof(TWaveHeader));
 Stream.Write(DataHeader, sizeof(TDataHeader));
 BytesPerSample := BitsPerSample div 8;
 if Channeles = 1
 then
   for i := 0 to SampleCount - 1 do begin
     GetData(0, i, buf);
     Stream.Write(buf, BytesPerSample);
   end
 else
   for i := 0 to SampleCount - 1 do begin
     GetData(0, i, buf);
     Stream.Write(buf, BytesPerSample);
     GetData(1, i, buf);
     Stream.Write(buf, BytesPerSample);
   end;
end;

end.


 
Сергей М. ©   (2006-10-11 15:09) [14]


> zorgens   (11.10.06 14:53) [13]
> ну это уже риторический пошёл разговор


Это, увы и ах, далеко не "риторика" - в эксплуатации находится еще немало карт, не поддерживающих WUH-ф-цию микшера в принципе.



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

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

Наверх




Память: 0.51 MB
Время: 0.016 c
3-1174471411
jiny
2007-03-21 13:03
2007.06.24
Как создать таблицы в Advantage Local Server


15-1180449317
Грициан
2007-05-29 18:35
2007.06.24
Абрамович перестанет спонсировать «Челси»


15-1180521426
lopi
2007-05-30 14:37
2007.06.24
Как это делается?


2-1180433592
The X
2007-05-29 14:13
2007.06.24
При выполнении запроса на ALTER TABLE получаю "Table is busy"


8-1159901234
Ah
2006-10-03 22:47
2007.06.24
Просмотр изображений в отдельной папке