Systemsound aufnehmen
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von CatchTheBird.
-
-
-
-
Du kannst meine Audiobibliothek CSCore verwenden. Eine Installationsanleitung findest du hier: [VB 2010] CSCore - Einstiegstutorial 01.
Jedoch trifft für dein Vorhaben nur der Punkt Vorbereitung zu. Aufnehmen kannst du mit WasapiLoopbackCapture.
Beispiele zum Aufnehmen findest du hier: cscore.codeplex.com/ und hier: [OpenSource][C#] CSCore - C-Sharp-Sound - Highperformance Audiobibliothek. Bei dem Beispielcode musst du wie beschrieben einfach nur WasapiCapture zu WasapiLoopbackCapture umstellen. Um das Gerät von welchem du aufzeichnen möchtest, auswählen zu können musst du einfach der Device-Eigenschaft einen neuen Wert zuweisen. Aber ACHTUNG: Dies muss geschehen bevor du Initialize aufrufst. Wie du verschiedene Geräte auflisten kannst findest du hier: cscore.codeplex.com/ ganz unten beim BeispielCode die SelectWasapiPlaybackDevice-Methode.
Den C# Code kannst du ganz einfach durch einen Online-converter konvertieren. Das einzige was beim Converter nicht funktioniert ist, das Konvertieren von Events. Du musst dort AddHandler verwenden. Das alles würde dann z.B. so aussehen:
VB.NET-Quellcode
- Using capture As New WasapiLoopbackCapture(True, AudioClientShareMode.Shared)
- capture.Initialize()
- Using w As New WaveWriter("C:\Temp\dump.wav", capture.WaveFormat)
- AddHandler capture.DataAvailable, Sub(s, e)
- w.Write(e.Data, e.Offset, e.ByteCount)
- End Sub
- capture.Start()
- Console.ReadKey()
- capture.[Stop]()
- End Using
- End Using
Ach ja: Das alles ist erst ab Windows Vista verfügbar. Auf XP geht das nur über Treiber. -
Danke schonmal
Du meinst diesen Code hier?
Quellcode
- using (WasapiCapture capture = new WasapiLoopbackCapture())
- {
- capture.Initialize();
- using (WaveWriter w = new WaveWriter(@"C:\Temp\dump.wav", capture.WaveFormat))
- {
- capture.DataAvailable += (s, e) =>
- {
- w.Write(e.Data, e.Offset, e.ByteCount);
- };
- capture.Start();
- Console.ReadKey();
- capture.Stop();
- }
- }
- Console.ReadKey();
-
-
Sorry nicht gesehen.
Naja diese online Konverter gehen nicht soo ab:
VB.NET-Quellcode
- Dim capture As Using
- Dim New As As
- WasapiLoopbackCapture(True, AudioClientShareMode.Shared)
- capture.Initialize
- Dim w As Using
- Dim New As As
- WaveWriter("C:\Temp\dump.wav", capture.WaveFormat)
- Dim Sub As AddHandler
- s
- ,e
- Unknownw.Write(e.Data, e.Offset, e.ByteCount)
- Dim Sub As End
- capture.Start
- Console.ReadKey
- capture.[
- Stop
- Unknown(Dim End As Using
- Using
-
-
-
-
-
-
okay danke nochmal. Aber es wird jetzt zwar ein neuer Fehler ausgegeben und zwar hier:
True, AudioClientShareMode.Shared
Zu viele Argumente für "Public Sub New()".
und noch hier:
AddHandler capture.DataAvailable, Sub(s, e)
bei e:
Der Lambda-Parameter "e" verbirgt eine Variable in einem einschließenden Block, eine zuvor definierte Bereichsvariable oder eine implizit im Abfrageausdruck deklarierte Variable. -
Sorry. Bin grad nicht wirklich bei der Sache. Die WasapiLoopbackCapture hat keinen Konstruktor mit parameter. Lösche einfach das was in den Klammern steht weg. Sprich einfach nur New WasapiLoopbackCapture()...
Zum zweiten Fehler. Ich gehe davon aus, dass du das in irgend einem Form Eventhandler machst. Dort wird ein Parameter des Eventhandler meistens mit e benannt. Benenne bei meinem Code einfach e in von mir aus args um. Das musst du natürlich dann überall in meinem code machen. Wenn du das jedoch in z.B. einem Button klickst schreibst musst du es so oder so etwas anpassen, da dies nur ganz simpel für eine Konsole ist. Bei Console.ReadKey wartet der Code solange bis du etwas drückst, dann wird die Aufnahme beendet und gespeichert. Wenn ich damit richtig liege, dass du das aus einem Event heraus aufrufst, dann musst du es anpassen. Falls du nicht weißt wie kann ich dir da helfen. Der Aufwand ist nämlich minimal. -
-
Wenn du von C++ wirds wohl daran liegen .
Aber um es nun abzukürzen. Hier hast du einen kleinen Code:
VB.NET-Quellcode
- Option Strict On
- Imports CSCore
- Imports CSCore.SoundIn
- Imports CSCore.Codecs.WAV
- Imports System.Windows.Forms
- Public Class Form1
- WithEvents soundIn As ISoundIn
- Dim writer As WaveWriter
- Private Sub OnStartClick(sender As Object, e As EventArgs) Handles Button1.Click
- Dim sfd As New SaveFileDialog()
- sfd.Filter = "WAVE (*.wav)|*.wav"
- If sfd.ShowDialog() = Windows.Forms.DialogResult.OK Then
- StopCapture()
- soundIn = New WasapiLoopbackCapture()
- soundIn.Initialize()
- writer = New WaveWriter(sfd.FileName, soundIn.WaveFormat)
- soundIn.Start()
- End If
- End Sub
- Private Sub OnStopClick(sender As Object, e As EventArgs) Handles Button2.Click
- StopCapture()
- End Sub
- Private Sub Form1_FormClosing(sender As Object, e As Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
- StopCapture()
- End Sub
- Private Sub soundIn_DataAvailable(sender As Object, e As DataAvailableEventArgs) Handles soundIn.DataAvailable
- If writer IsNot Nothing Then
- writer.Write(e.Data, e.Offset, e.ByteCount)
- End If
- End Sub
- Private Sub StopCapture()
- If soundIn IsNot Nothing Then
- soundIn.Stop()
- soundIn.Dispose()
- soundIn = Nothing
- End If
- If writer IsNot Nothing Then
- writer.Dispose()
- writer = Nothing
- End If
- End Sub
- End Class
-
-
Natürlich weiß ich das. Du musst dabei die aufgenommenen Daten in Samples konvertieren und dann überprüfen ob diese ein gewisses Level überschreiten(z.b. 0.1). Ein Beispiel wie man die Pegel kommt findest du hier: cscore.codeplex.com/SourceCont…es/Recorder/MainWindow.cs. Jedoch werde ich dir hier keinen fertigen Code geben. Den vorhanden Code anzupassen sollte wirklich nicht allzu schwer. Zumal du als C++ Programmierer mit so einem einfachen und kleinen c# Code garantiert sehr einfach zurecht kommst ;).
-
-
Nö. Werde demnächst zwar nen Encoder zur Verfügung stellen. Dieser läuft aber erst ab Win8. Selbst schreiben macht zu viel Arbeit und ist auch Lizenztechnisch schwierig. Am einfachsten ist es da, wenn du dir Lame oder ffmpeg downloadest und das einfach über commandline konvertiert und die wave anschließend löscht.
-
Ähnliche Themen
-
Dayshadow119 - - Sourcecode-Austausch