Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Sound aufnehmen (https://www.delphipraxis.net/7803-sound-aufnehmen.html)

Tropby 6. Dez 2006 17:23

Re: Sound aufnehmen
 
Wie geht denn das mit dem einzufügen ??

So ? :

Delphi-Quellcode:
 
Result := waveInOpen(@fHandle, aDevice, @Format, Cardinal(@waveInProc), cardinal(self), CALLBACK_FUNCTION);
for I := 1 to 5 do
  begin
    fWaveData := TWaveData.Create;
    fWaveData.Header.lpData := fWaveData.Data;
    fWaveData.Header.dwBufferLength := cWaveBufferSize;
    fWaveData.Header.dwFlags := 0;
    Result := waveInPrepareHeader(fHandle, @fWaveData.Header,cWaveBufferSize);
    Result := waveInAddBuffer(fHandle, @fWaveData.Header, cWaveBufferSize);
  end;

Und dann noch mal da wo ich die daten auswerte oder wie ??

Sunlight7 6. Dez 2006 17:40

Re: Sound aufnehmen
 
Jepp:
Delphi-Quellcode:
 
Result := waveInOpen(@fHandle, aDevice, @Format, Cardinal(@waveInProc), cardinal(self), CALLBACK_FUNCTION);
for I := 1 to 5 do
  begin
    fWaveData[i] := TWaveData.Create;
    fWaveData[i].Header.lpData := fWaveData[i].Data;
    fWaveData[i].Header.dwBufferLength := cWaveBufferSize;
    fWaveData[i].Header.dwFlags := 0;
    Result := waveInPrepareHeader(fHandle, @fWaveData[i].Header,cWaveBufferSize);
    Result := waveInAddBuffer(fHandle, @fWaveData[i].Header, cWaveBufferSize);
    // Aber eigentlich sollte man das Ergebnis vom Result prüfen ;)
  end;

Zitat:

Zitat von Tropby
Und dann noch mal da wo ich die daten auswerte oder wie ??

Noch n Jepp
In der WIM_DATA Nachricht steht drinne, welcher Buffer es ist, den schickste zurück in die Liste.

Am besten, Du machst Dir ein Array mit den Buffern.
Ich nutzte immer den dwUser, um einen Index vom Array zu setzen, so weiß ich einfach, welcher Buffer zurück in die Liste muß.

Tropby 6. Dez 2006 18:04

Re: Sound aufnehmen
 
Das mit dem dwUser verstehe ich nicht :oops:

Ich hab da nur das :
Delphi-Quellcode:
procedure waveInProc(hwi: HWAVEIN; uMsg: UINT; dwInstance, dwParam1, dwParam2 : DWord); stdcall;
Oder wie kann ich das übergeben ??

Sonst schreib ich da nachher noch den Falschen rein XD

Sunlight7 6. Dez 2006 18:11

Re: Sound aufnehmen
 
Das kannst Du in der WAVEHDR Struktur angeben :wink:

Zb:
Delphi-Quellcode:
fWaveData[i].Header.dwUser := i;

Tropby 6. Dez 2006 18:20

Re: Sound aufnehmen
 
Ich verstehe es einfach nicht :wall: :wall: :wall:

Delphi-Quellcode:
procedure waveInProc(hwi: HWAVEIN; uMsg: UINT; dwInstance, dwParam1, dwParam2 : DWord); stdcall;
var
  classinstance: TWaveIn absolute dwInstance;
begin
 if umsg = WIM_DATA then
 begin
   with classinstance do
   begin
     if fWaveData[???].Header.dwBytesRecorded = 0 then exit;
     fWaveData[???].Stream.Write(fWaveData[???].Data, fWaveData[???].header.dwBytesRecorded);
     if fWaveData[???].Header.dwFlags and MHDR_DONE = MHDR_DONE then
     begin
Wie komm ich da an die Indexe von dem Array ??

Sunlight7 6. Dez 2006 18:36

Re: Sound aufnehmen
 
In dem Parameter dwParam1 steht die Adresse vom WAVEHDR, den kannste "anzapfen".

Delphi-Quellcode:
...
var pwh:TWaveHeader;
...
pwh:=PWaveHeader(lParam)^;
...
WaveInAddBuffer(fHandle, @fWaveData[pwh.dwUser], cWaveBufferSize));
Eigentlich müsste das auc hfunktionieren, oder? :gruebel:
Delphi-Quellcode:
WaveInAddBuffer(fHandle, @pwh, cWaveBufferSize));
Weiß grad net, ich mach das mit der Callback Procedure...

Tropby 6. Dez 2006 18:45

Re: Sound aufnehmen
 
Das geht bei mir nicht da kommt immer :

Delphi-Quellcode:
pwh:=PWaveHeader(lParam)^;

Klammer auf erwartet aber Klammer zu gefunden ^^

Edit : PWaveHeader gibts bei mir nicht :( bei mir gibts nur PWaveHdr

Sunlight7 6. Dez 2006 18:57

Re: Sound aufnehmen
 
Jepp, dann mach dwParam1 draus, bei mir heißen die lParam und wParam, deshalb, hab nur von meinem Code rauskopiert :mrgreen:

Edit: Dann nimm den, PWaveHdr, is eh das gleiche :wink:

Edit: Fix, immer diese Tippfehler :roll:

Tropby 6. Dez 2006 19:05

Re: Sound aufnehmen
 
Misst jetzt stürtzt mir immer Delphi ab sobalt ich das ding starte :( :( :(

Sunlight7 6. Dez 2006 19:12

Re: Sound aufnehmen
 
Willkommen im Club, das hat ich auch mal ne Zeit bei meinem Projekt, läuft es ohne die IDE?

Tropby 6. Dez 2006 19:21

Re: Sound aufnehmen
 
Kann es sein das ich den @fWaveData[pwh.dwUser].header erstmal leeren muss ??

Sunlight7 6. Dez 2006 19:34

Re: Sound aufnehmen
 
Was willst Du da ausleeren?

Evtl. ein Un/PrepareHeader.
Ich mach das nicht, aber wie gesagt, ich mach es mit der CallBack.

Aber eher denke ich an einen Pointer Fehler.

Tropby 6. Dez 2006 20:04

Re: Sound aufnehmen
 
Hm gut dass ich mich damit nicht so gut auskenne XD

Edit : Wenn ich langsam durch gehe kommt kein Fehler aber wenn ich das Programm einfach laufen lasse dann kommt der Fehler :wall:

Edit 2 :

Der Fehler leigt bei :
Delphi-Quellcode:
   pwh:=PWaveHdr(dwParam1)^;

Sunlight7 6. Dez 2006 20:40

Re: Sound aufnehmen
 
Sag ich doch, Pointer Fehler, scheint bei der Nachrichtenmethode etwas anders zu funktionieren.

Definiere "Fehler" :wink:

Tropby 6. Dez 2006 20:49

Re: Sound aufnehmen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Also wenn ich das Projekt starte kommt da so nen Fehler (siehe Bilder)

Und dann geht halt nichts mehr. Könnte aber auch an diesem Code liegen :

Delphi-Quellcode:
procedure waveInProc(hwi: HWAVEIN; uMsg: UINT; dwInstance, dwParam1, dwParam2 : DWord); stdcall;
var
  classinstance: TWaveIn absolute dwInstance;
  pwh:TWaveHdr;
begin
 if umsg = WIM_DATA then
 begin
   pwh:=PWaveHdr(dwParam1)^;
   with classinstance do
   begin
     fWaveData[pwh.dwUser].Stream.Write(fWaveData[pwh.dwUser].Data, fWaveData[pwh.dwUser].header.dwBytesRecorded);

     if fWaveData[pwh.dwUser].Header.dwFlags and MHDR_DONE = MHDR_DONE then
     begin
       fWaveData[pwh.dwUser].Stream.Position := 0;
       if Assigned(fOnData) then
         fOnData(fWaveData[pwh.dwUser].Stream);
       fWaveData[pwh.dwUser].Stream.Clear;
     end;

//     fWaveData[pwh.dwUser].Header.lpData := fWaveData[pwh.dwUser].Data;
     fWaveData[pwh.dwUser].Header.dwBufferLength := cWaveBufferSize;
     fWaveData[pwh.dwUser].Header.dwFlags := 0;
     fWaveData[pwh.dwUser].Header.dwBytesRecorded := 0;


     waveInPrepareHeader(fHandle, @fWaveData[pwh.dwUser].Header, SizeOf(fWaveData[pwh.dwUser].data));
     waveInAddBuffer(fHandle, @fWaveData[pwh.dwUser].Header, SizeOf(fWaveData[pwh.dwUser].data));
   end;
 end;
end;

Sunlight7 6. Dez 2006 21:15

Re: Sound aufnehmen
 
1.8 MB Screenshot :shock:
Mit meinem Modem lad' ich mir das net runter :wink:

Delphi-Quellcode:
waveInPrepareHeader(fHandle, @fWaveData[pwh.dwUser].Header, SizeOf(fWaveData[pwh.dwUser].data));
Ist IMHO nach unnötig.

Hmm, hab jetzt den Code kompiliert, läuft ohne Fehler :gruebel:
Mal abgesehen von den Compilermeldungen, etwas sehr nachlässig programmiert...

Edit: Was machste eigentlich in der OnData?
Genaugenommen darfste da nicht auf die VCL Zugreifen und (fast) keine API Funktionen aufrufen.

Tropby 7. Dez 2006 10:29

Re: Sound aufnehmen
 
Oh hab vergessen die Screenshots zu komprimieren


Das ist mein OnData :


Delphi-Quellcode:
procedure TForm1.OnData(const aStream: TMemoryStream);
var header: TWaveHdr;
begin
  header.lpData := aStream.Memory;
  header.dwBufferLength := cWaveBufferSize;
  header.dwFlags := 0;
  waveOutPrepareHeader(fhandle, @header, cWaveBufferSize);
  waveOutWrite(fhandle, @header, cWaveBufferSize);
end;
Zitat:

Hmm, hab jetzt den Code kompiliert, läuft ohne Fehler Grübelnd...
Mal abgesehen von den Compilermeldungen, etwas sehr nachlässig programmiert...
Ähm ja ich bin ja noch nicht wirklich drin was das alles mit den pointern und so angeht ^^
und das ist eher bei mir im Moment ein ausprobieren als ein wissen.

Sunlight7 7. Dez 2006 13:57

Re: Sound aufnehmen
 
Zitat:

Zitat von Tropby
Oh hab vergessen die Screenshots zu komprimieren

Dann mach es jetzt noch :wink:

Zitat:

Zitat von Tropby
Ähm ja ich bin ja noch nicht wirklich drin was das alles mit den pointern und so angeht ^^
und das ist eher bei mir im Moment ein ausprobieren als ein wissen.

Der Original Source ist nachlässig programmiert, das war nicht gegen Dich, ich weiß, das Du n Neuling bist :wink:
Schau Dich mal bei Hier im Forum suchenResult um, Rückgabewerte sollten überprüft werden, sonst hat es gar keinen Sinn diese zu speichern.

Zitat:

Zitat von Tropby
Das ist mein OnData :
Delphi-Quellcode:
procedure TForm1.OnData(const aStream: TMemoryStream);
var header: TWaveHdr;
begin
  header.lpData := aStream.Memory;
  header.dwBufferLength := cWaveBufferSize;
  header.dwFlags := 0;
  waveOutPrepareHeader(fhandle, @header, cWaveBufferSize);
  waveOutWrite(fhandle, @header, cWaveBufferSize);
end;

Ich meine, genau da hakts, Editiere mal da alles raus, obs dann auch zu nem Fehler kommt, IMHO darfste genau das nicht machen.

zahor 7. Dez 2006 16:15

Re: Sound aufnehmen
 
Kann man auch den Soundkartenausgang "abhören", d.h. aufnehmen???

Sunlight7 7. Dez 2006 16:51

Re: Sound aufnehmen
 
Was meinst Du?
WaveOut?

Da kannst Du schon aufnehmen, Du brauchst nur die Quelle im Mixer einstellen.

Tropby 7. Dez 2006 17:59

Re: Sound aufnehmen
 
Hm dann kommt kein Fehler mehr aber ich höre dann ja auch nichts mehr. Und wenn ich das in die Anderen Sachen Kopiere wo ich die Buffer add. gehts auch nicht... Irgendwie kann ich das nicht verstehen :wall: der Anfangscode war irgendwie nicht der Wahre.

Sunlight7 7. Dez 2006 18:12

Re: Sound aufnehmen
 
Hätt' mich gewundert, wenn das funktioniert hätte.

Du mußt Dir die Daten kopieren, und sie von der VCL, oder nem Thread aus in die WaveOut schicken.
Genau genommen sollte man nicht mal CopyMemory verwendet, aber es funktioniert doch.

Alles was Du in dem Rumpf von OnData machst wird aus dem Thread heraus ausgeführt, welcher von WaveInOpen geöffnet wurde.

Tropby 7. Dez 2006 18:36

Re: Sound aufnehmen
 
Kann ich das nicht einfach in der

Delphi-Quellcode:
procedure waveInProc
machen ??
Wenn nicht muss ich mir wohl unbedingt noch mal das ganze Wave out ansehen.
Da hab ich wohl irgendwas noch nicht verstanden :(

Ich glaub wenn ich das alles verstanden hab schreib ich mir erstmal
selber ein Tutorial damit ich das später auch noch mal schaffe XD

Sunlight7 7. Dez 2006 19:08

Re: Sound aufnehmen
 
Nein, die WaveInProc ist ja die Callback procedure, die vom WaveIn Thread aufgerufen wird, darin gelten die gleichen Einschränkungen.

zahor 8. Dez 2006 08:16

Re: Sound aufnehmen
 
Ich weiß nicht wie das genau heißt.
Ich mein nur das, was aus dem Lautsprecher kommt.
Ob man das aufnehmen kann.

Sunlight7 8. Dez 2006 18:48

Re: Sound aufnehmen
 
Das solltest Du schon wissen, was Du aufnehmen willst.

Das was aus dem Lautsprecher kommt kann eine Wave oder MIDI Wiedergabe sein, Vom Line-In, CD, DAT, ... Was halt Deine Soundkarte so kann.

Im Prinzip kannst Du von allen Eingängen aufnehmen, wenn es Deine Soundkarte kann und Du den gewünschten Input im Mixer einstellst.

Grüßle!

jansie 22. Mai 2007 16:26

Re: Sound aufnehmen
 
Hallo,
ist es möglich das Programm so anzuändern das nicht nur sound über micro sondern jeglicher Sound (z.b. von anderen mediaplayer) aufgenommen wird? Wenn ja wie?

Sunlight7 22. Mai 2007 21:54

Re: Sound aufnehmen
 
Abend!

Du brauchst nur Dein Aufnahmeregler auf Wave setzen, vorausgesetzt Deine Soundkarte kann das.

WS1976 23. Mai 2007 04:57

Re: Sound aufnehmen
 
Hallo,

weisst du wie man direkt an die aufgenommenen Daten kommt?
Ich will die Daten vor dem Abspeichern verändern, z.B. die Lautstärke reduzieren.

Grüsse

Sunlight7 23. Mai 2007 05:26

Re: Sound aufnehmen
 
Moin!

Lies hier weiter

I love Delphi 24. Jun 2008 19:44

Re: Sound aufnehmen
 
Bin mal wieder erstaunt wie einfach manche Sachen in Delphi funktionieren. :hello:

Kann man den Ton auch direkt von der Soundkarte abgreifen, so dass das aufgenommen wird, was gerade läuft?
Und wie ging das mit der Wait-Funktion die im Tutorial genannt wurde???

MfG Florian

[Ich habe schon bemerkt, dass dieser Thread uralt ist]

Sunlight7 24. Jun 2008 21:08

Re: Sound aufnehmen
 
Hallo, I love Delphi
und herzlich willkommen in der :dp:


Zitat:

Zitat von I love Delphi
Kann man den Ton auch direkt von der Soundkarte abgreifen, so dass das aufgenommen wird, was gerade läuft?

Jein, es kommt auf Deine Soundkarte an, was die alles kann, bzw ...
Zitat:

Zitat von Sunlight7
Das was aus dem Lautsprecher kommt kann eine Wave oder MIDI Wiedergabe sein, Vom Line-In, CD, DAT, ... Was halt Deine Soundkarte so kann.

Starte einfach mal den Windows Mixer (sndvol32.exe /r) und schaue, was Du alles aufnehmen kannst.



Zitat:

Zitat von I love Delphi
Und wie ging das mit der Wait-Funktion die im Tutorial genannt wurde???

Ich mag jetzt grad nicht den ganzen Thread nochmals durchlesen, zitiere bitte den Beitrag oder verlinke dorthin, was Du meinst ;)
Dies solltest Du generell tuen, dann kann man Dir leichter helfen, wenn man weiß, was Du genau meinst :zwinker:

Mfg Sun

I love Delphi 25. Jun 2008 08:46

Re: Sound aufnehmen
 
sndvol32.exe gibt es unter Vista anscheinend nicht mehr. Auch der interne Audiorecorder von Vista ist für den A... . Optionen bietet der nämlich auch keine mehr an. Wo kann ich denn dan rausfinden was meine Soundkarte alles kann?

Im ersten Beitrag dieses Threads ging es ja hauptsächlich ums aufnehmen. Es wurde aber auch erwähnt, dass man Sound abspielen kann und, so nehme ich an, mit WAIT pausieren kann. Das mit dem Abspielen ist kein Problem, WAIT will nicht so wie ich will.

Danke,
I Love Delphi

Sunlight7 25. Jun 2008 16:15

Re: Sound aufnehmen
 
Ich rate mal, in Vista heißt das dann sndvol.exe, egal, schau Dich einfach mal durchs Startmenü nach einer Lautstärkeregelung.
Oder Du guckst ob sich ein kleiner Lautprecher auf Deiner Taskliste befindet (Doppelklicken)

Der Befehl WAIT in MCI bedeutet nicht, das eine Pause gemacht werden soll, sondern, das die Steuerung erst an Dein Programm zurück gegeben wird, sobald der MCI Befehl ausgeführt wurde.
D.h. wenn Du etwas abspielst mit MCI und WAIT angibst reagiert Dein Programm solange nicht mehr, bis das abspielen fertig ist.

I love Delphi 25. Jun 2008 16:27

Re: Sound aufnehmen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wie ich die Lautstärkeregelung finde, war mir klar. Ich dachte jedoch, dass du etwas anderes meinst, dass dieser LAutstärkeregelung echt nichts zu entnehmen ist. Habe mal einen Screenshot angehängt.

Da mit Wait ist mir peinlich...

MfG,
I love Delphi

Sunlight7 26. Jun 2008 02:38

Re: Sound aufnehmen
 
Wie das mit dem Windows Lautstärkeregelung funktioniert, schaust Du am Besten in der Windows Hilfe nach.

Jeff93 14. Okt 2008 16:13

Re: Sound aufnehmen
 
Habe eine kurze Frage wenn man die Audio-Ausgabe mit
Delphi-Quellcode:
mciSendString('RECORD mySound',nil,0,Handle);
aufgezeichnet hat und dann gestoppt hat, wie kann man nun das Aufgezeichnete löschen ohne
Delphi-Quellcode:
mciSendString('CLOSE mySound',nil,,FHandle);
zu benutzen?

dutyfree 9. Mär 2009 16:34

Re: Sound aufnehmen
 
Hallo,
mal ne kurze Frage, wie kann ich denn zwischen Mikrofon und Stereo Mix wechseln?
Wenn ich jetzt aufnehme nimmt er halt mein Mikro auf, wie wechsel ich zum Stereo mix (Also, dass er das aufnimmt, was aus der Soundkarte rauskommt)
Thx

Edit:

Noch eine Frage:

Ich hab halt diesen Code:

Delphi-Quellcode:
mciSendString('SAVE mySound "c:\one.wav"',nil,0,Handle);
Und eine Variable wo ein Pfad drin ist, wie kann ich die Datei jetzt in den Pfad speichern?

Delphi-Quellcode:
mciSendString('SAVE mySound pfad+"one.wav"',nil,0,Handle);
Habe ich schon versucht, geht nicht.

Sunlight7 9. Mär 2009 23:20

Re: Sound aufnehmen
 
Delphi-Quellcode:
mciSendString(PChar('SAVE mySound '+pfad+'"\one.wav"'), nil, 0, Handle);

DevStar 26. Mai 2009 22:58

Re: Sound aufnehmen
 
Habe den Beispiel-Code mal getestet. Funktioniert auch.

Allerdings gibt es keine Änderung der wav-Datei, wenn ich hier die Werte ändere:

Delphi-Quellcode:
procedure TForm2.FormCreate(Sender: TObject);
var
  Format: tWAVEFORMATEX;
begin
  with Format do
  begin
    wFormatTag := WAVE_FORMAT_PCM;
    nChannels := 1;
     wBitsPerSample := 8;
     nSamplesPerSec := 44100;
      nBlockAlign := nChannels * (wBitsPerSample div 8);
     nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
    cbSize := 0;
  end;
 wave := TWaveIn.Create;
 wave.OnData := OnData;
 wave.open(0);
 waveOutOpen(@fHandle, 0, @format, 0, 0, CALLBACK_NULL);
end;
Ich brauch das vox-Format ADPCM.

Weiß jemand wieso?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:52 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz