Delphi-PRAXiS
Seite 1 von 3  1 23      

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)

overmoon 21. Aug 2003 17:35


Sound aufnehmen
 
:idea: Sound aufnehmen :idea:

Auf den Vorschlag von Matze habe ich aus zwei meiner Beiträge ein Tutorial zusammengebastelt. Vielleicht kann es irgendjemand irgendwann irgendwozu brauchen. :roll:

Also Dinge aufnehmen geht mit Delphi und der Unit mmSystem richtig einfach. :spin:

Der Schlüssel ist die Prozedur "mciSendString". Über diese Prozedur kann man die Komplette Aufnahme des Wave-Files machen.

1.) Wir müssen ein Audiogerät öffnen. Ich nenne es einfach mal "mySound".

Delphi-Quellcode:
mciSendString('OPEN NEW TYPE WAVEAUDIO ALIAS mySound',nil,0,Handle);

2.) Nun müssen wir die Optionen für die Audioaufnahme einstellen. Da für gibt es einige Einstellungen:

- BitsPerSample (Wie genau wird ein analoger Wert abgetastet; meist 8 oder 16)

- Channels (Mono(1) oder Stereo (2))

- SamplesPerSec (Abtastungen pro Sekunde; 800,11025,22050,44100)

Damit wäre eigentlich alles angegeben, was man braucht. Damit es funktioniert, müssen noch zwei weitere Dinge angegeben werden. Lässt man diese weg, gibt es Probleme.

- BytesPerSec (= (BitsPerSample div 8)*Channels*SamplesPerSec )

- Alignment (= Channels*(BitsPerSample div 8) )

Die Prozedur zum Einstellen der Einstellungen sieht dann folgendermaßen aus:

Delphi-Quellcode:
mciSendString('SET mySound ' + 
                   'TIME FORMAT MS ' + 
                   'BITSPERSAMPLE 16 ' + 
                   'CHANNELS 2 ' + 
                   'SAMPLESPERSEC 44100 ' + 
                   'BYTESPERSEC 176400 ' + 
                   'ALIGNMENT 4',
                   nil,0,handle);
3.) Das Starten der Aufnahme:

Das folgende erklärt sich eigentlich von selbst:

Delphi-Quellcode:
mciSendString('RECORD mySound',nil,0,Handle);

4.) Genauso einfach ist das Stoppen der Aufnahme:

Delphi-Quellcode:
mciSendString('STOP mySound',nil,0,Handle);

5.) Nach erfolgter Aufnahme wollen wir die Datei natürlich nicht im Nirvana des OS verschwinden lassen... wir müssen sie speichern.

Das geht folgendermaßen:

Delphi-Quellcode:
mciSendString('SAVE mySound "c:\datei.wav"',nil,0,Handle);


6.) Schließlich muss man noch das Audiogerät "mySound", welches man am Anfang geöffnet hatte, schließen.

Delphi-Quellcode:
mciSendString('CLOSE mySound',nil,0,Handle);

Und wir sind fertig mit der Aufnahme.

7.) Weitere Aufgaben, die man über "mciSendString" machen kann sind z.B. noch: PLAY, WAIT und LOAD


8.) Die Aufnahmen werden nur leider recht groß, deshalb macht sich eine Konvertierung zu Mp3 recht gut.

Dazu bietet sich der lame - Encoder an.

Den bekommst du hier:
http://lame.sourceforge.net/

Dort bekommst du die lame_enc.dll und die lame.exe .
Kannst du eigentlich nehmen, was du willst, konvertieren beide brav waves nach Mp3.

Die lame.exe musst du z.B. einfach mit entsprechenden Parametern aufrufen.


Zur Lizenz vom Lame_Ecoder:

Zitat:

Can I use LAME in my commercial program?

Yes, you can, under the restrictions of the LGPL. The easiest
way to do this is to:

1. Link to LAME as separate library (libmp3lame.a on unix or
lame_enc.dll on windows)

2. Fully acknowledge that you are using LAME, and give a link
to our web site, www.mp3dev.org

3. If you make modifications to LAME, you *must* release these
these modifications back to the LAME project, under the LGPL.

overmoon

overmoon 21. Aug 2003 20:31

Re: Sound aufnehmen
 
9.) Und zum Abschluss nun den ganzen Code in einem Stück:

Delphi-Quellcode:
//==============================================================================

// OnClick-Event des Buttons zum Starten der Aufnahme
procedure TFormMain.ButtonAufnahmeStartenClick(Sender: TObject);
begin
     mciSendString('OPEN NEW TYPE WAVEAUDIO ALIAS mySound',nil,0,Handle);
     mciSendString('SET mySound ' +
                   'TIME FORMAT MS ' +
                   'BITSPERSAMPLE 16 ' +
                   'CHANNELS 2 ' +
                   'SAMPLESPERSEC 44100 ' +
                   'BYTESPERSEC 176400 ' +
                   'ALIGNMENT 4',
                   nil,0,handle);
     mciSendString('RECORD mySound',nil,0,Handle);
end;

//==============================================================================

// OnClick-Event des Buttons zum Beenden und Speichern der Aufnahme.
procedure TFormMain.ButtonAufnahmeAnhaltenClick(Sender: TObject);
begin
     mciSendString('STOP mySound',nil,0,Handle);
     mciSendString('SAVE mySound "c:\datei.wav"',nil,0,Handle);
     mciSendString('CLOSE mySound',nil,0,Handle);
end;

//==============================================================================
Wie man sieht, ist das Aufnehmen eigentlich super-einfach. :coder:

10.) Anmerkung (aus eigener Erfahrung)

- Man sollte verhindern, dass der Benutzer das Programm beenden kann, während die Aufnahme läuft.

- Die Umwandlung nach Mp3 sollte man in extra-Threads auslagern, damit gleich wieder mit der Aufnahme begonnen werden kann und nicht erst auf die MP3 gewartet werden muss. (Und auch hier gilt: Das Programm sollte nicht beendet werden solange der Thread noch läuft; aber das eklärt sich ja von selbst.)

11.) Bye :witch:

Meflin 15. Jul 2004 15:49

Re: Sound aufnehmen
 
hi,
ich bekomm das gnze zwar ohne fehler zum laufen, allerdings herrsch in der erstellten wav datei nur eisernes schweigen. ich habe versucht, ein abgespieltes winamp lied aufzunehmen. in der systemsteuerung habe ich die lautstärke bei der aufnahme auch schon hochgeschruabt, aber es tut sich nix. woran könnte das liegen?

*MFG*

Ultimator 15. Jul 2004 16:35

Re: Sound aufnehmen
 
Klick mal mit der rechten Maustaste auf das Lautsprecher-Symbol in der TNA und geh dann auf "Lautstärkeregelung öffnen".
Dann gehst du im aufpoppenden Fenster auf "Optionen|Eigenschaften". Daraufhin wählst du den RadioBuitton "Aufnahme" und drückst OK. Zurück im Hauptfenster kannst du mit Hilfe der CheckBoxen die Aufnahmequelle auswählen. Dann machst du das Fenster mit dem "X" zu und bist glücklich! ;-)

atreju2oo0 15. Jul 2004 16:36

Re: Sound aufnehmen
 
Ich würde schätzen Du nimmst von der falschen Quelle auf.
Ich denke der Code ist für Line-In ( also Mikro)...
Dann würde es also an der ersten Zeile liegen:

Delphi-Quellcode:
mciSendString('OPEN NEW TYPE WAVEAUDIO ALIAS mySound',nil,0,Handle);
Statt WAVEAUDIO muss was anderes hin... :mrgreen:

Meflin 15. Jul 2004 19:29

Re: Sound aufnehmen
 
Zitat:

Zitat von Ultimator
Klick mal mit der rechten Maustaste auf das Lautsprecher-Symbol in der TNA und geh dann auf "Lautstärkeregelung öffnen".
Dann gehst du im aufpoppenden Fenster auf "Optionen|Eigenschaften". Daraufhin wählst du den RadioBuitton "Aufnahme" und drückst OK. Zurück im Hauptfenster kannst du mit Hilfe der CheckBoxen die Aufnahmequelle auswählen. Dann machst du das Fenster mit dem "X" zu und bist glücklich! ;-)

wie schon gesagt, ide habe ich schon alle ganz hoch gedreht. es tut sich aber nix. aber was statt wavaaudio sollte da hin und vor allem warum sollte waveaudio nicht stimmen??
:cry:

Meflin 16. Jul 2004 15:42

Re: Sound aufnehmen
 
^^ :? ^^

Ultimator 16. Jul 2004 16:42

Re: Sound aufnehmen
 
Zitat:

Ich denke der Code ist für Line-In ( also Mikro)...
Das muss ich dich korrigieren, denn man hat doch separate Eingänge für Line-In und Mikrofon. ;-)

Meflin 17. Jul 2004 19:04

Re: Sound aufnehmen
 
^^ seufz ^^

Kernel32.DLL 17. Jul 2004 19:11

Re: Sound aufnehmen
 
Zitat:

Zitat von Meflin
Zitat:

Zitat von Ultimator
Klick mal mit der rechten Maustaste auf das Lautsprecher-Symbol in der TNA und geh dann auf "Lautstärkeregelung öffnen".
Dann gehst du im aufpoppenden Fenster auf "Optionen|Eigenschaften". Daraufhin wählst du den RadioBuitton "Aufnahme" und drückst OK. Zurück im Hauptfenster kannst du mit Hilfe der CheckBoxen die Aufnahmequelle auswählen. Dann machst du das Fenster mit dem "X" zu und bist glücklich! ;-)

wie schon gesagt, ide habe ich schon alle ganz hoch gedreht. es tut sich aber nix. aber was statt wavaaudio sollte da hin und vor allem warum sollte waveaudio nicht stimmen??
:cry:

Ich denke mal, was er meinte war, dass du die richtige Aufnahmequelle, in diesem Fall anscheinend den Line-In Eingang deiner Soundkarte, auswähltst. Wenn nämlich vor "Auswählen..." kein Häckchen ist, kannste die Lautstärkeregler so hoch schrauben wie du willst... :wink:

Ultimator 17. Jul 2004 19:11

Re: Sound aufnehmen
 
Exakt :-)

Meflin 17. Jul 2004 19:44

Re: Sound aufnehmen
 
tja das hat immernoch nix geholfen :|

Kernel32.DLL 17. Jul 2004 19:49

Re: Sound aufnehmen
 
Zitat:

Zitat von Meflin
tja das hat immernoch nix geholfen :|

Hab's befürchtet...

*mit dem latein schon am ende sei*

Meflin 19. Jul 2004 16:48

Re: Sound aufnehmen
 
^^ seufz ^^

Ultimator 19. Jul 2004 17:40

Re: Sound aufnehmen
 
1.) Bitte hör auf mit Latein :mrgreen:
2.)
Zitat:

Statt WAVEAUDIO muss was anderes hin...
War' schön, wenn er das mal näher erklären könnte :?
3.)Wäre hierfür nicht eher ein neuer Thread geeignet? Das hat nämlich irgendwie nicht mehr viel mit Kritik und Vorschlägen an einem Tutorial zu tun :|

sCrAPt 20. Jul 2004 14:49

Re: Sound aufnehmen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Systemsteuerung (unter XP die klassische Ansicht) > Sounds und Audiogeräte > Audiotab > Soundaufnahmegroup > Lautstärke > Optionen > Eigenschaften > Andere auswählen > Stereomix aktivieren...
Und jetzt sollte es funktionieren :D

Anbei noch n Screenshot

http://www.og4all.de/meindphase, sCrAPt

Ultimator 20. Jul 2004 15:05

Re: Sound aufnehmen
 
SChlechter ging die Wualität nicht, oder? :xmas:

sCrAPt 20. Jul 2004 15:07

Re: Sound aufnehmen
 
ich stehe auf kleine Datengröße :stupid:

http://og4all.de/meindphase, sCrAPt

Ultimator 20. Jul 2004 15:10

Re: Sound aufnehmen
 
Du hättests ja auch schwarz-weiß machen können um so noch weniger Platz zu beanspruchen :duck:

franktron 20. Jul 2004 15:16

Re: Sound aufnehmen
 
Das problem liegt daran das das Prog den Eingang umschlten tut und da kann man soviel hin und herstellen wie man will.
Also Ultimator ändere die erste Zeile von mciSendString('OPEN NEW TYPE WAVEAUDIO ALIAS mySound',nil,0,Handle);
nach z.b. mciSendString('OPEN NEW TYPE LINEIN ALIAS mySound',nil,0,Handle);

Meflin 20. Jul 2004 15:16

Re: Sound aufnehmen
 
@scrapt: thx! endlich! es geht.... man glaubt es kaum! :cheers:

Jarmen_Kell 21. Mai 2005 16:11

Re: Sound aufnehmen
 
Das kann ich wirklich gut gebrauchen, jedoch ist die erstellte Datei leider sehr mit Rauschen überzogen und die Qualität ist nicht annähernd so gut, wie die des Originals :(
Das kann man doch bestimmt ändern, oder?^^

PS: Habe ein Lied aufgenommen, das ich mit Winamp 5.0 abgespielt habe.

Meflin 22. Mai 2005 12:31

Re: Sound aufnehmen
 
Zitat:

Zitat von Jarmen_Kell
Das kann ich wirklich gut gebrauchen, jedoch ist die erstellte Datei leider sehr mit Rauschen überzogen und die Qualität ist nicht annähernd so gut, wie die des Originals :(
Das kann man doch bestimmt ändern, oder?^^

PS: Habe ein Lied aufgenommen, das ich mit Winamp 5.0 abgespielt habe.

dann hst du vermutlich den stereomix regler zu weit aufgedreht. spiel mal ein bisschen damit rum, ich muss den nur minimal über null stellen, um eine saubere aufnahme zu bekommen.


Jarmen_Kell 22. Mai 2005 13:22

Re: Sound aufnehmen
 
Ah ja, das war es.
Jetzt ist immernoch etwas rauschen da, aber das geht fort, wenn man mit nem EQ den 14K-Bereich auf's Minimum setzt!

Danke!

Nils_13 13. Nov 2005 17:39

Re: Sound aufnehmen
 
Ich hab die Zeile verändert, aber jetzt wird die Datei nicht mehr erstellt.

benst 9. Sep 2006 11:59

Re: Sound aufnehmen
 
Stimmt, dass geht ja wirklich ganz einfach....
Ich möchte folgendes machen:
Ein Programm welches Musik aufnehmen kann. Jedoch soll es schon ca. 20Sekunden bevor man auf den Knopf drückt aufnehmen.
Dazu sind mir zwei Lösungsideen gekommen:
1. Musik wird in einer "Schleife" aufgenommen, die 20Sekunden lang ist (ältere Sachen werden immer weggeschmissen) und das wird dann vor die eigentliche Aufnahme gepackt.
2. Es wird zwei Mal immer wieder 40 Sekunden aufgenommen (20 Sekunden überschneiden sich immer)...
---40---|---40---|---40---|-...
---|---40---|---40---|---40---|-...
Wenn man dann auf Aufnahme drück läuft eine von beiden weiter.
Kann man mit der vorgestellten Lösung zwei Mal gleichzeitig aufnehmen? Wie?

Gruß
Ben

benst 9. Sep 2006 16:27

Re: Sound aufnehmen
 
Achso noch zwei kurze Anliegen:
  • Alternativ würde mich auch ein kostenloses Programm, welches die Funktion bietet, interessieren - jedoch habe ich so etwas noch nicht gefunden.
  • Werden bei der vorgestellten Lösung die Daten eigentlich auf der Festplatte oder im Arbeitsspeicher abgelegt. Gibt es Probleme, wenn ich sehr lange etwas aufnehme?

Ben

benst 10. Sep 2006 10:36

Re: Sound aufnehmen
 
Ich habe das perfekte Programm gefunden... :-D
Es kommt aus Schweden und heißt Screamer. Keine Angst, es ist u.a. in deutsch. Es bietet die Funktion, dass schon für vor Druck auf Rec aufgenommen wird (Puffergröße kann man selbst einstellen). (Es bietet noch mehr, aber ich beschränke mich in meiner Beschreibung nur auf mein Anliegen.)
Es ist wirklich das beste Programm für Internet-Radio, welches ich gefunden habe (ich habe viele ausprobiert), wenn es einem darum geht einen (oder mehr) Sender zu hören und ggf. aufzunehmen (und nicht gezielt nach Titeln suchen möchte, worauf viele andere Programm spezialisiert sind).
Ben

Sunlight7 9. Okt 2006 04:55

Re: Sound aufnehmen
 
Zitat:

Zitat von benst
* Werden bei der vorgestellten Lösung die Daten eigentlich auf der Festplatte oder im Arbeitsspeicher abgelegt. Gibt es Probleme, wenn ich sehr lange etwas aufnehme?

MCI spechert die Daten zuerst in den Temp Ordner und kopiert das erst beim Speichern dorthin wo es dann sein soll.
Bei sehr langen aufnahmen kann das verschieben (auf eine andere Platte zB) etwas dauern.

Zacherl 16. Okt 2006 22:11

Re: Sound aufnehmen
 
Kann man den Sound auch direkt in einen Stream schreiben, welcher dann ständig aktualisiert wird? Ich will versuchen immer die neuen Teile des Streams an einen anderen Computer zu senden ...

Oder kann ich einfach hintereinader mehrere wav Files aufnehmen, diese zum Server senden, welcher diese immer wieder zum Stream hinzufügt und den Stream kontinuierlich abspielt?

Florian

Sunlight7 16. Okt 2006 22:37

Re: Sound aufnehmen
 
Zitat:

Zitat von FlorianBernd
Kann man den Sound auch direkt in einen Stream schreiben, welcher dann ständig aktualisiert wird? Ich will versuchen immer die neuen Teile des Streams an einen anderen Computer zu senden ...

Ist mir nix bekannt.

Zitat:

Zitat von FlorianBernd
Oder kann ich einfach hintereinader mehrere wav Files aufnehmen, diese zum Server senden, welcher diese immer wieder zum Stream hinzufügt und den Stream kontinuierlich abspielt?

Nur sehr wackelig, und sicher nicht in Echtzeit.

Versuchs mal mit WaveIn oder DirectSoundCapture.

Zacherl 16. Okt 2006 22:50

Re: Sound aufnehmen
 
Hast du einen Beispielcode, wie das mit dem WaveIn geht? Ich finde da leider nichts ...

Florian

Eichhoernchen 16. Okt 2006 22:54

Re: Sound aufnehmen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Florian Bernd
Hast du einen Beispielcode, wie das mit dem WaveIn geht? Ich finde da leider nichts ...

Florian

Hab sowas für MidiIn... dürfte aber fast das gleiche sein.

Zacherl 16. Okt 2006 23:07

Re: Sound aufnehmen
 
Mhh geht leider nicht so einfach auf Wave zu portieren ... :? Zumindest bin ich zu blöde für ...

Eichhoernchen 17. Okt 2006 15:17

Re: Sound aufnehmen
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich hab mal, da es mich auch interessiert ein Programm geschrieben, das Sound von der Primärensoundkarte aufnimmt und wieder dort abspielt, d.h. wenn du durch ein Micro redest, hörst du dich selbst, leicht verzögert.

Ich häng das ganze Projekt mal an, ich hoffe das hilft dir weiter!

Leider gibt es vor jedem abspielen ein kurzes knacken... frag mich nicht wo das herkommt, vielleicht hab ich nicht das Beste Aufnahmeformat gewählt.

Die Puffergröße musst du ggf. auch noch anpassen, wenn dir der Puffer zu klein ist.

Edit: Habs was vergessen zu entfernen, lösch einfach aus dem Projektquellcode den Verweis auf waveout.pas, dann sollte es laufen!

Sunlight7 17. Okt 2006 17:19

Re: Sound aufnehmen
 
Zitat:

Zitat von Florian Bernd
Hast du einen Beispielcode, wie das mit dem WaveIn geht? Ich finde da leider nichts ...

Ja, hab ich, aber wird nicht mehr gebraucht?!

Tropby 6. Dez 2006 16:19

Re: Sound aufnehmen
 
Also hab mir das Programm mal angesehen und Probiert nachzuprogrammieren nur leider kommt bei mir nur ganz verstockt was wieder an :( hat vielleicht einer ne idee wie ich das hin bekomme das das nicht so stockt ??

Edit : Es ist eher ein Knacken. :gruebel: nur ich bekomm es nicht weg :(

Sunlight7 6. Dez 2006 16:39

Re: Sound aufnehmen
 
Hallo Tropby und herzlich Willkommen in der DP! :cheers:

Hab mir den Code mal schnell angesehen, kein Wunder, das es knackt...
Es wird nur ein Buffer verwendet.
Wenn der voll ist, wird er verarbeitet, und während dieser Zeit kann nicht in diesen Aufgenommen werden.
Also ein 2. Buffer muß her, oder besser noch ein, zwei auf Reserve :wink:
Grüßle! :dp:

PS: Nutz die Foren Suche, ich hab das hier schon mal in nen anderen Thread geschrieben :wink:

Edit: Wenn die Buffergröße zu klein ist, kann es bei der Methode, WOM_DATA Nachrichten zu empfangen auch zum Knacken kommen, da Windows zu lahm für ist.
Edit2: Ne stimmt ja nicht, bei WaveIn sinds ja WIM_DATA Nachrichten :stupid: :mrgreen:

Tropby 6. Dez 2006 16:45

Re: Sound aufnehmen
 
Ich bin irgendwie zu blöd um das zu finden :(

wenn ich nach Wavein suche kommt nichts und wenn ich nach Wavein Knacken suche kommt auch nichts :(

Sunlight7 6. Dez 2006 16:53

Re: Sound aufnehmen
 
Also einen hab ich gefunden: Audiostream "Knackt"
Den anderen konnt' ich auch nicht finden :gruebel:
Die Bugs in der Suchfunktion machen das auch nicht leichter :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:21 Uhr.
Seite 1 von 3  1 23      

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