Hi,
nachdem mal wieder die Frage kam, wie man denn den Sound des Systems aufnehmen kann, wie (oder auch)auch das Device welches aufgenommen werden soll festlegen kann und ich auf ein altes Beispiel(VB6) verwiesen habe, dachte ich mir, ich mach mal ein zeitgemässes Beispiel. Mit diesem Codeschnipsel ist es möglich, den Sound von Mikrofonen, Line-Ins oder jedem Loopback-Device(Wiedergabegeräte) aufzunehen. Sollte mit jedem Windows-OS ab Vista/Win7 funktionieren.
Mit konvertierung ins mp3-format siehe 2. post
Benötigt werden folgende DLLs welche bei un4seen.com erhält sind:
bassnet.dll 'verweis auf die bassnet.dll hinzufügen!
bass.dll
bassenc.dll
basswasapi.dll
nachdem mal wieder die Frage kam, wie man denn den Sound des Systems aufnehmen kann, wie (oder auch)auch das Device welches aufgenommen werden soll festlegen kann und ich auf ein altes Beispiel(VB6) verwiesen habe, dachte ich mir, ich mach mal ein zeitgemässes Beispiel. Mit diesem Codeschnipsel ist es möglich, den Sound von Mikrofonen, Line-Ins oder jedem Loopback-Device(Wiedergabegeräte) aufzunehen. Sollte mit jedem Windows-OS ab Vista/Win7 funktionieren.
Mit konvertierung ins mp3-format siehe 2. post
Benötigt werden folgende DLLs welche bei un4seen.com erhält sind:
bassnet.dll 'verweis auf die bassnet.dll hinzufügen!
bass.dll
bassenc.dll
basswasapi.dll
VB.NET-Quellcode
- Imports Un4seen.Bass
- Imports Un4seen.Bass.AddOn.Enc
- Imports Un4seen.BassWasapi
- Public Class FormMain
- 'links zur dokumentation
- 'BASS_Init http://bass.radio42.com/help/html/ad9238db-aafe-e4fc-88c9-ceae2fd3eeea.htm
- 'WASAPIPROC http://www.bass.radio42.com/help/html/0d1b4edc-3396-4fce-f7c1-3483ce83b641.htm
- 'BASS_WASAPI_DEVICEINFO http://www.bass.radio42.com/help/html/559b8efe-a0a6-6e52-a025-864c30e460de.htm
- 'BASS_WASAPI_Init http://www.bass.radio42.com/help/html/6ad6926e-179a-6b10-3748-50dab4b07f8d.htm
- 'BASS_StreamCreate http://bass.radio42.com/help/html/a9731743-19e1-27d5-c7a8-6f597f533537.htm
- 'Bass klasse http://www.bass.radio42.com/help/html/8f455613-bc52-0829-5d87-aedf2f8d99f5.htm
- Private Proc As WASAPIPROC 'WasapiProc Delegate
- Private Dummy As Integer = 0 'stream handle
- Private Devices As New List(Of Device) 'liste verfügbarer devices
- Private CurrentDevice As Integer = -1 'aktuelles device = deafult
- Private Inlevel As Single 'luautstärke pegel
- Private RecordStartTime As DateTime
- Private RecordingActive As Boolean = False
- Private Sub FormMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
- 'aufräumen
- BassWasapi.BASS_WASAPI_Stop(True)
- BassWasapi.BASS_WASAPI_Free()
- Bass.BASS_StreamFree(Dummy)
- Bass.BASS_Free()
- End Sub
- Private Sub FormMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- 'bass mit "no sound" initialisieren, da wir nichts wiedergeben
- Bass.BASS_Init(0, 0, 0, Nothing)
- Proc = New WASAPIPROC(AddressOf InWasapiProc)
- 'für device-informationen
- Dim devInfo As New BASS_WASAPI_DEVICEINFO
- Dim note As Integer = -1
- 'alle verfügbaren devices durchlaufen
- For i As Integer = 0 To BassWasapi.BASS_WASAPI_GetDeviceCount() - 1
- 'device informationen hohlen
- BassWasapi.BASS_WASAPI_GetDeviceInfo(i, devInfo)
- 'ist es ein input device, wie auch aktiv?
- If (devInfo.flags And BASSWASAPIDeviceInfo.BASS_DEVICE_INPUT) = BASSWASAPIDeviceInfo.BASS_DEVICE_INPUT _
- AndAlso (devInfo.flags And BASSWASAPIDeviceInfo.BASS_DEVICE_ENABLED) = BASSWASAPIDeviceInfo.BASS_DEVICE_ENABLED Then
- 'device in die auflistung
- Devices.Add(New Device(i, devInfo.name))
- 'device initialisieren
- BassWasapi.BASS_WASAPI_Init(i, 0, 0, 0, 0.5, 0, Proc, Nothing)
- 'wenn ein loopback device aufgenommen werden soll, dann muss das korrespondierende
- 'output-device initilisiert werden, da sonst nicht dauerhaft gelauscht wird, sondern
- 'nur wenn ein buffer vorhanden ist, somit würde stille nicht aufgezeichnet werden,
- 'das korrespondierende output-device ist immer loopbackdevice.index - 1
- If devInfo.IsLoopback Then
- BassWasapi.BASS_WASAPI_Init(i - 1, 0, 0, 0, 0, 0, Nothing, Nothing)
- End If
- BassWasapi.BASS_WASAPI_SetDevice(i)
- 'is es das default device?
- If ((devInfo.flags And BASSWASAPIDeviceInfo.BASS_DEVICE_DEFAULT) = BASSWASAPIDeviceInfo.BASS_DEVICE_DEFAULT) Then
- CurrentDevice = i
- note = Devices.Count - 1
- End If
- End If
- Next
- ComboBoxDevices.DataSource = Devices
- ComboBoxDevices.DisplayMember = "Name"
- If note > -1 Then
- ComboBoxDevices.SelectedIndex = note
- End If
- End Sub
- Private Function InWasapiProc(ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr) As Integer
- 'daten in den dummy stream schreiben
- Bass.BASS_ChannelGetData(Dummy, buffer, length)
- 'lautststärke pegel hohlen
- Dim level As Single = BassWasapi.BASS_WASAPI_GetDeviceLevel(CurrentDevice, -1) '-1 alle kanäle des devices
- 'wurde im Beispiel "basswasapi.zip/vb/rectest" so gemacht
- 'keine Ahnung warum, aber ich habs einfach übernommen
- If Inlevel > 0.1 Then
- Inlevel -= 0.1F
- Else
- Inlevel = 0.0F
- End If
- If level > Inlevel Then
- Inlevel = level
- End If
- If Inlevel > 1.0F Then 'um sicher zu sein, da progressbar.Maximum = 100 ist
- Inlevel = 1.0F
- End If
- BeginInvoke(Sub()
- ProgressBarLevel.Value = CInt(Inlevel * 100)
- If RecordingActive Then
- LabelRecordDuration.Text = (Now - RecordStartTime).ToString("hh\:mm\:ss\.ff")
- Else
- LabelRecordDuration.Text = "00:00:00.00"
- End If
- End Sub)
- Return 1
- End Function
- Private Sub ComboBoxDevices_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBoxDevices.SelectedIndexChanged
- 'abhorchen beenden
- If BassWasapi.BASS_WASAPI_IsStarted Then
- BassWasapi.BASS_WASAPI_Stop(True)
- End If
- Dummy = 0
- CurrentDevice = DirectCast(ComboBoxDevices.SelectedItem, Device).Index
- 'aktuelles device festlegen
- BassWasapi.BASS_WASAPI_SetDevice(CurrentDevice)
- 'device informationen beschaffen
- Dim devInfo As New BASS_WASAPI_DEVICEINFO
- BassWasapi.BASS_WASAPI_GetDeviceInfo(CurrentDevice, devInfo)
- 'dummy stream erstellen
- Dummy = Bass.BASS_StreamCreate(devInfo.mixfreq, devInfo.mixchans, BASSFlag.BASS_SAMPLE_FLOAT Or BASSFlag.BASS_STREAM_DECODE, BASSStreamProc.STREAMPROC_DUMMY)
- 'abhorchen
- BassWasapi.BASS_WASAPI_Start()
- Dim devType As String
- Select Case devInfo.type
- Case BASSWASAPIDeviceType.BASS_WASAPI_TYPE_NETWORKDEVICE
- devType = "Remote Network Device"
- Case BASSWASAPIDeviceType.BASS_WASAPI_TYPE_SPEAKERS
- devType = "Speakers"
- Case BASSWASAPIDeviceType.BASS_WASAPI_TYPE_LINELEVEL
- devType = "Line In"
- Case BASSWASAPIDeviceType.BASS_WASAPI_TYPE_HEADPHONES
- devType = "Headphones"
- Case BASSWASAPIDeviceType.BASS_WASAPI_TYPE_MICROPHONE
- devType = "Microphone"
- Case BASSWASAPIDeviceType.BASS_WASAPI_TYPE_HEADSET
- devType = "Headset"
- Case BASSWASAPIDeviceType.BASS_WASAPI_TYPE_HANDSET
- devType = "Handset"
- Case BASSWASAPIDeviceType.BASS_WASAPI_TYPE_DIGITAL
- devType = "Digital"
- Case BASSWASAPIDeviceType.BASS_WASAPI_TYPE_SPDIF
- devType = "SPDIF"
- Case BASSWASAPIDeviceType.BASS_WASAPI_TYPE_HDMI
- devType = "HDMI"
- Case Else
- devType = "undefined"
- End Select
- If (devInfo.flags And BASSWASAPIDeviceInfo.BASS_DEVICE_LOOPBACK) = BASSWASAPIDeviceInfo.BASS_DEVICE_LOOPBACK Then
- devType &= " (Playback-Device)"
- Else
- devType &= " (Input-Device)"
- End If
- LabelRecordDuration.Text = devType
- End Sub
- Private Class Device
- Public Property Index As Integer
- Public Property Name As String
- Public Sub New()
- End Sub
- Public Sub New(ByVal index As Integer, ByVal name As String)
- Me.Index = index
- Me.Name = name
- End Sub
- End Class
- Private Sub ButtonRecordStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonRecordStart.Click
- RecordingActive = True
- ComboBoxDevices.Enabled = Not RecordingActive
- ButtonRecordStop.Enabled = RecordingActive
- ButtonRecordStart.Enabled = Not RecordingActive
- RecordStartTime = Now
- 'aufnahme starten(aufzeichnung in datei)
- BassEnc.BASS_Encode_Start(Dummy, "output.wav", BASSEncode.BASS_ENCODE_PCM Or BASSEncode.BASS_ENCODE_FP_16BIT Or BASSEncode.BASS_ENCODE_AUTOFREE, Nothing, Nothing)
- End Sub
- Private Sub ButtonRecordStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonRecordStop.Click
- RecordingActive = False
- ComboBoxDevices.Enabled = Not RecordingActive
- ButtonRecordStop.Enabled = RecordingActive
- ButtonRecordStart.Enabled = Not RecordingActive
- 'aufnahme stoppen(aufzeichnung in datei)
- BassEnc.BASS_Encode_Stop(Dummy)
- End Sub
- End Class
Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
„Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
Benjamin Franklin
„Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
Benjamin Franklin
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „NoIde“ ()