![]() |
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 ?? |
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:
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ß. |
Re: Sound aufnehmen
Das mit dem dwUser verstehe ich nicht :oops:
Ich hab da nur das :
Delphi-Quellcode:
Oder wie kann ich das übergeben ??
procedure waveInProc(hwi: HWAVEIN; uMsg: UINT; dwInstance, dwParam1, dwParam2 : DWord); stdcall;
Sonst schreib ich da nachher noch den Falschen rein XD |
Re: Sound aufnehmen
Das kannst Du in der WAVEHDR Struktur angeben :wink:
Zb:
Delphi-Quellcode:
fWaveData[i].Header.dwUser := i;
|
Re: Sound aufnehmen
Ich verstehe es einfach nicht :wall: :wall: :wall:
Delphi-Quellcode:
Wie komm ich da an die Indexe von dem Array ??
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 |
Re: Sound aufnehmen
In dem Parameter dwParam1 steht die Adresse vom WAVEHDR, den kannste "anzapfen".
Delphi-Quellcode:
Eigentlich müsste das auc hfunktionieren, oder? :gruebel:
...
var pwh:TWaveHeader; ... pwh:=PWaveHeader(lParam)^; ... WaveInAddBuffer(fHandle, @fWaveData[pwh.dwUser], cWaveBufferSize));
Delphi-Quellcode:
Weiß grad net, ich mach das mit der Callback Procedure...
WaveInAddBuffer(fHandle, @pwh, cWaveBufferSize));
|
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 |
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: |
Re: Sound aufnehmen
Misst jetzt stürtzt mir immer Delphi ab sobalt ich das ding starte :( :( :(
|
Re: Sound aufnehmen
Willkommen im Club, das hat ich auch mal ne Zeit bei meinem Projekt, läuft es ohne die IDE?
|
Re: Sound aufnehmen
Kann es sein das ich den @fWaveData[pwh.dwUser].header erstmal leeren muss ??
|
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. |
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)^;
|
Re: Sound aufnehmen
Sag ich doch, Pointer Fehler, scheint bei der Nachrichtenmethode etwas anders zu funktionieren.
Definiere "Fehler" :wink: |
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; |
Re: Sound aufnehmen
1.8 MB Screenshot :shock:
Mit meinem Modem lad' ich mir das net runter :wink:
Delphi-Quellcode:
Ist IMHO nach unnötig.
waveInPrepareHeader(fHandle, @fWaveData[pwh.dwUser].Header, SizeOf(fWaveData[pwh.dwUser].data));
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. |
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:
und das ist eher bei mir im Moment ein ausprobieren als ein wissen. |
Re: Sound aufnehmen
Zitat:
Zitat:
Schau Dich mal bei ![]() Zitat:
|
Re: Sound aufnehmen
Kann man auch den Soundkartenausgang "abhören", d.h. aufnehmen???
|
Re: Sound aufnehmen
Was meinst Du?
WaveOut? Da kannst Du schon aufnehmen, Du brauchst nur die Quelle im Mixer einstellen. |
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.
|
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. |
Re: Sound aufnehmen
Kann ich das nicht einfach in der
Delphi-Quellcode:
machen ??
procedure waveInProc
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 |
Re: Sound aufnehmen
Nein, die WaveInProc ist ja die Callback procedure, die vom WaveIn Thread aufgerufen wird, darin gelten die gleichen Einschränkungen.
|
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. |
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! |
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? |
Re: Sound aufnehmen
Abend!
Du brauchst nur Dein Aufnahmeregler auf Wave setzen, vorausgesetzt Deine Soundkarte kann das. |
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 |
Re: Sound aufnehmen
|
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] |
Re: Sound aufnehmen
Hallo, I love Delphi
und herzlich willkommen in der :dp: Zitat:
Zitat:
Zitat:
Dies solltest Du generell tuen, dann kann man Dir leichter helfen, wenn man weiß, was Du genau meinst :zwinker: Mfg Sun |
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 |
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. |
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 |
Re: Sound aufnehmen
Wie das mit dem Windows Lautstärkeregelung funktioniert, schaust Du am Besten in der Windows Hilfe nach.
|
Re: Sound aufnehmen
Habe eine kurze Frage wenn man die Audio-Ausgabe mit
Delphi-Quellcode:
aufgezeichnet hat und dann gestoppt hat, wie kann man nun das Aufgezeichnete löschen ohne
mciSendString('RECORD mySound',nil,0,Handle);
Delphi-Quellcode:
zu benutzen?
mciSendString('CLOSE mySound',nil,,FHandle);
|
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:
Und eine Variable wo ein Pfad drin ist, wie kann ich die Datei jetzt in den Pfad speichern?
mciSendString('SAVE mySound "c:\one.wav"',nil,0,Handle);
Delphi-Quellcode:
Habe ich schon versucht, geht nicht.
mciSendString('SAVE mySound pfad+"one.wav"',nil,0,Handle);
|
Re: Sound aufnehmen
Delphi-Quellcode:
mciSendString(PChar('SAVE mySound '+pfad+'"\one.wav"'), nil, 0, Handle);
|
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:
Ich brauch das vox-Format ADPCM.
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; Weiß jemand wieso? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz