Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0127: Wav Dateien von Mikro und CD aufnehmen

 von 

Beschreibung 

Und wieder ein paar weitere Funktionen des Tausendsassas mciSendString. Dieser Tip zeigt wie recht unkompliziert wav Dateien beliebigen Ursprungs aufgenommen werden können. Allerdings ließ bei mir die Aufnahmequalität sehr zu wünschen übrig. Vermutlich liegt dies an irgendeiner voreingestellten Sampling-Rate. Vielleicht hat jemand einen Tip wie sich die Sampling-Rate per Programm einstellen läßt.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

sndPlaySoundA (PlaySound), mciSendStringA (mciSendString)

Download:

Download des Beispielprojektes [2,18 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Schaltfläche "Command2"
' Steuerelement: Schaltfläche "Command3"
' Steuerelement: Schaltfläche "Command4"

Option Explicit

Private Declare Function mciSendString Lib "winmm.dll" Alias _
        "mciSendStringA" (ByVal lpstrCommand As String, _
        ByVal lpstrReturnString As String, ByVal uReturnLength _
        As Long, ByVal hwndCallback As Long) As Long

Private Declare Function PlaySound Lib "winmm.dll" Alias _
        "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal _
        uFlags As Long) As Long

Const Path$ = "c:\Test.wav"

Dim RS$, CB&

Private Sub Command1_Click()
  If Dir$(Path, vbNormal) <> "" Then Kill Path
  RS = Space$(128)
      
  Call mciSendString("open new type waveaudio alias capture", _
                     RS, 128, CB)
  Call mciSendString("record capture", RS, 128, CB)
  
  Command1.Enabled = False
  Command2.Enabled = True
  Command3.Enabled = True
  Command4.Enabled = False
End Sub

Private Sub Command2_Click()
  If Command2.Caption = "Aufnahme Pause" Then
    Call mciSendString("pause capture", RS, 128, CB)
    Command2.Caption = "Aufnahme Weiter"
    
    Command1.Enabled = False
    Command3.Enabled = False
    Command4.Enabled = False
  Else
    Call mciSendString("record capture", RS, 128, CB)
    Command2.Caption = "Aufnahme Pause"
    
    Command1.Enabled = False
    Command3.Enabled = True
    Command4.Enabled = False
  End If
End Sub

Private Sub Command3_Click()
  RS = Space$(128)
  Call mciSendString("stop capture", RS, 128, CB)
  Call mciSendString("save capture " & Path, RS, 128, CB)
  Call mciSendString("close capture", RS, 128, CB)
  
  Command1.Enabled = True
  Command2.Enabled = False
  Command3.Enabled = False
  Command4.Enabled = True
End Sub

Private Sub Command4_Click()
  Call PlaySound(Path, 0)
  
  Command1.Enabled = True
  Command2.Enabled = False
  Command3.Enabled = False
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 13 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Bernd Lindemann am 13.12.2008 um 10:27

Sie fragen nech der Einstellung der Abtastrate per Programm. Bei mir funktioniert der folgende Zusatz nach dem "open":

Call mciSendString("open new type waveaudio alias capture", RS, 128, CB)
Call mciSendString("set capture samplespersec 44100", 0&, 0, 0) ' <-- <-- <-- works
Form4a.Caption = " SR 44100"
DoEvents
Call mciSendString("record capture", RS, 128, CB)

Kommentar von Leo am 17.06.2008 um 07:49

Hallo Leute,

Alle angesprochenen Probleme können mit folgendem Code gelöst werden:

http://www.vbarchiv.net/tipps/details.php?id=1216

viel Spaß beim Programmieren

Leo

Kommentar von Guest am 23.11.2007 um 14:26

Danke für diesen klasse Tipp!

Da ich noch ein Anfänger bin, mache ich mich
hier wahrscheinlich lächerlich ;-)

Trotzdem möchte ich etwas hinzfügen:
Als ich den Code in Visual Basic Express 2005
ausführen wollte, erschien eine Fehlermeldung.
Ich habe mich erkundigt, wieso der Code
nicht korrekt lief, und konnte die Audio-Aufnahme / Wiedergabe dann folgendermassen fehlerfrei durchführen:

Anstatt LONG zu verwenden, muss man in Visual Basic 2005
.net INTEGER verwenden.

Grüsse

Kommentar von Flo am 19.08.2007 um 11:57

Ich finde das Beispiel super, allerdings
schreibt man abspielen mit B!

Kommentar von GESIA am 11.11.2004 um 14:22

Also hier nochmal zusammengefasst, wie man die Qualität einstellen kann:

Folgende Zeile muss nach dem OPEN und vor dem RECORD eingefügt werden:

[code]mciSendString "SET CAPTURE TIME FORMAT MILLISECONDS BITSPERSAMPLE " & bits & " SAMPLESPERSEC " & samples & " CHANNELS " & c & " BYTESPERSEC " & bytes & " ALIGNMENT 4", RS, 128, CB[code]
Dabei sind das Kleingedruckte Variablen, die wie folgt belegt werden können/müssen:

bits = 8 oder 16
samples = 8000 oder 11000 oder 16000 oder 22050 oder 44100 oder 48000
c = 1 oder 2
bytes = (bits * samples * c) / 8


GESIA


PS: Das Rauschen kommt höchstwahrscheinlich direkt vom Mikro. Versuch' mal, die Eingangslautstärke des Mikros zu verringern.

Kommentar von Michi Maier am 01.10.2003 um 13:00

Kann man die Qualität noch irgendwo ändern. Ansonsten ist das Programm echt spitze, nur halt dieses Rauschen im Hintergrund. Ich hoffe die kann geändert werden.

Danke

Kommentar von Rainer Nagel am 12.02.2003 um 13:53

Versuchen Sie mal nachstehende Variante. Damit ist man zumindest das Problem mit dem schlechten Mono-Sound los. Leider spielt das Multimedia-Steuerelement die damit erzeugte WAV.Datei mit falscher Zeitermittlung (Track-Length) ab. Keine Ahnung, woran das liegen könnte. Somit leider immer
noch keine hundertprozentige Lösung.

Hier nun der Quelltext zum Aufnahmestart:

bitspers = "16"

mon_ster = "2"

samples_per_sec = "44100"

mciSendString "OPEN NEW TYPE WAVEAUDIO ALIAS mysound", "", 0, handle

aufn$ = "SET mysound TIME FORMAT MILLISECONDS BITSPERSAMPLE " + bitspers + " CHANNELS " + mon_ster + " SAMPLESPERSEC " + samples_per_sec + " BYTESPERSEC " + samples_per_sec

mciSendString aufn$, "", 0, handle

mciSendString "RECORD mysound", "", 0, handle

Kommentar von Christoph am 01.09.2002 um 14:59

Um die Soundqualität zu verbessern ist es nötig, den Windows Media Player zu Deinstallieren !

Kommentar von Stephan am 25.10.2001 um 19:42

Hi!
so ich habs raus bekoomen wie man die klang-qualität einstellt!
Tipp:
mciSendStringA("Set capture time format ms bitspersample 16 channels 2 samplespersec 48000 bytespersec 192000 alignment 4",NIL,0,")
Ich hoffe das es bei euch klappt!!!!
Gruß Stephan
(programmiere in Xbase++)

Kommentar von hc am 21.03.2001 um 07:21

Hallo
Kann man die Klangqualität der WAV-Aufnahme nicht besser einstelle?

Kommentar von Horst am 15.01.2001 um 14:35

Einstellen der Aufnahmeparameter(einfügen vor Call mciSendString("record capture...):
Call mciSendString("set capture time format ms bitspersample 16 channels 2 samplespersec 44100", RS, 1024, 0)
siehe:
http://msdn.microsoft.com/library/psdk/multimed/mmcmdstr_8eyc.htm

Kommentar von Bruno Tuchscherer am 27.10.2000 um 14:30

Kann man mit VB die Soundkarte so programmieren, daß sie eine Datei wiedergibt und gleichzeitig auf einer anderen Spur aufnimmt zusammen mit dem Mikrofon-Eingang?

Kommentar von Anonymus am 07.10.2000 um 19:45

Bei"call sndPlaysound" unter Commnand4_Click
Kommt die FehlerMeldung Sub oder Funktion nicht definiert (Kein Wunder , wurde ja auch nicht definiert