Systemsound aufnehmen

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von CatchTheBird.

    Systemsound aufnehmen

    Guten Tag,
    wie kann man den Sound der Soundkarte aufnehmen?
    Und dann wenn man auf Stop klickt das aufgenommene als wave oder mp3 speichert?
    Weiß da jemand was? Oder gibt es schon nen vorhandenen Code?

    Danke ;)
    Benutz doch mal die Suchfunktion.
    Dies Thema wurde 3-5 mal gehandelt.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    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

    1. Using capture As New WasapiLoopbackCapture(True, AudioClientShareMode.Shared)
    2. capture.Initialize()
    3. Using w As New WaveWriter("C:\Temp\dump.wav", capture.WaveFormat)
    4. AddHandler capture.DataAvailable, Sub(s, e)
    5. w.Write(e.Data, e.Offset, e.ByteCount)
    6. End Sub
    7. capture.Start()
    8. Console.ReadKey()
    9. capture.[Stop]()
    10. End Using
    11. End Using


    Ach ja: Das alles ist erst ab Windows Vista verfügbar. Auf XP geht das nur über Treiber.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Danke schonmal :)

    Du meinst diesen Code hier?

    Quellcode

    1. using (WasapiCapture capture = new WasapiLoopbackCapture())
    2. {
    3. capture.Initialize();
    4. using (WaveWriter w = new WaveWriter(@"C:\Temp\dump.wav", capture.WaveFormat))
    5. {
    6. capture.DataAvailable += (s, e) =>
    7. {
    8. w.Write(e.Data, e.Offset, e.ByteCount);
    9. };
    10. capture.Start();
    11. Console.ReadKey();
    12. capture.Stop();
    13. }
    14. }
    15. Console.ReadKey();
    Sorry nicht gesehen.
    Naja diese online Konverter gehen nicht soo ab:

    VB.NET-Quellcode

    1. Dim capture As Using
    2. Dim New As As
    3. WasapiLoopbackCapture(True, AudioClientShareMode.Shared)
    4. capture.Initialize
    5. Dim w As Using
    6. Dim New As As
    7. WaveWriter("C:\Temp\dump.wav", capture.WaveFormat)
    8. Dim Sub As AddHandler
    9. s
    10. ,e
    11. Unknownw.Write(e.Data, e.Offset, e.ByteCount)
    12. Dim Sub As End
    13. capture.Start
    14. Console.ReadKey
    15. capture.[
    16. Stop
    17. Unknown(Dim End As Using
    18. Using
    Das was du geschrieben hast kann niemand lesen.
    Außerdem musst du folgende Importe vornehmen:
    • CSCore
    • CSCore.Codecs.WAVE
    • CSCore.SoundIn
    • CSCore.CoreAudioAPI(optional falls du den Device auswählen möchtest)


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Mein Fehler. nicht WAVE sondern WAV.
    Außerdem in dem Fall ist CSCore.CoreAudioAPI doch nicht optional. Du musst es importieren.
    Heißt:

    VB.NET-Quellcode

    1. Imports CSCore.Codecs.WAV
    2. Imports CSCore.CoreAudioAPI

    oben einfügen. CSCore, CSCore.SoundIn ebenfalls wie vorhin beschrieben.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    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.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Wenn du von C++ wirds wohl daran liegen :D :D .
    Aber um es nun abzukürzen. Hier hast du einen kleinen Code:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports CSCore
    3. Imports CSCore.SoundIn
    4. Imports CSCore.Codecs.WAV
    5. Imports System.Windows.Forms
    6. Public Class Form1
    7. WithEvents soundIn As ISoundIn
    8. Dim writer As WaveWriter
    9. Private Sub OnStartClick(sender As Object, e As EventArgs) Handles Button1.Click
    10. Dim sfd As New SaveFileDialog()
    11. sfd.Filter = "WAVE (*.wav)|*.wav"
    12. If sfd.ShowDialog() = Windows.Forms.DialogResult.OK Then
    13. StopCapture()
    14. soundIn = New WasapiLoopbackCapture()
    15. soundIn.Initialize()
    16. writer = New WaveWriter(sfd.FileName, soundIn.WaveFormat)
    17. soundIn.Start()
    18. End If
    19. End Sub
    20. Private Sub OnStopClick(sender As Object, e As EventArgs) Handles Button2.Click
    21. StopCapture()
    22. End Sub
    23. Private Sub Form1_FormClosing(sender As Object, e As Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    24. StopCapture()
    25. End Sub
    26. Private Sub soundIn_DataAvailable(sender As Object, e As DataAvailableEventArgs) Handles soundIn.DataAvailable
    27. If writer IsNot Nothing Then
    28. writer.Write(e.Data, e.Offset, e.ByteCount)
    29. End If
    30. End Sub
    31. Private Sub StopCapture()
    32. If soundIn IsNot Nothing Then
    33. soundIn.Stop()
    34. soundIn.Dispose()
    35. soundIn = Nothing
    36. End If
    37. If writer IsNot Nothing Then
    38. writer.Dispose()
    39. writer = Nothing
    40. End If
    41. End Sub
    42. End Class


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    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 ;).


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    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.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.