CSCore - Mikrofon streamen

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von GERFreefighter.

    CSCore - Mikrofon streamen

    Hallo,

    ich bin seit einigen Tagen am Versuchen, mein Mikrofon zu streamen. Ich verwende dazu CSCore.
    Bisher nur lokal, später werden die Daten dann über einen Server an alle anderen Clienten versendet.

    Zurzeit habe ich das Problem, dass die Signale meines Mikrofons nicht aufgenommen werden.
    Mein derzeitiger Stand:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports CSCore
    3. Imports CSCore.CoreAudioAPI
    4. Imports CSCore.Streams
    5. Public Class Form1
    6. Dim Zuhören As Integer = 0
    7. Dim WithEvents SoundOut As New SoundOut.DirectSoundOut
    8. Dim WithEvents SoundIn As New SoundIn.WasapiCapture
    9. Dim BufferingSource As WriteableBufferingSource
    10. Dim _finalSource As IWaveSource
    11. Dim DataStream As String = "Funk.wav"
    12. Dim AufnahmeTon As Byte()
    13. Dim _BufferingSource As WriteableBufferingSource
    14. Dim FileStream As Stream
    15. Dim audioMeter As AudioMeterInformation
    16. Private Sub Aufnehmen()
    17. If SoundIn.RecordingState = CSCore.SoundIn.RecordingState.Recording Then
    18. SoundIn.Stop()
    19. End If
    20. Dim soundInSource = New SoundInSource(SoundIn)
    21. Dim singleBlockNotificationStream = New SingleBlockNotificationStream(soundInSource.ToSampleSource)
    22. _finalSource = singleBlockNotificationStream.ToWaveSource()
    23. AufnahmeTon = New Byte(_finalSource.WaveFormat.BytesPerSecond / 2 - 1) {}
    24. SoundIn.Start()
    25. End Sub
    26. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    27. If Button1.Text = "Funk an" Then
    28. SoundIn.Initialize()
    29. Button1.Text = "Funk aus"
    30. Aufnehmen()
    31. Timer1.Start()
    32. Else
    33. Button1.Text = "Funk an"
    34. Timer1.Stop()
    35. Aufnehmen()
    36. SoundIn.Stop()
    37. End If
    38. End Sub
    39. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    40. If Button2.Text = "Zuhören an" Then
    41. If Not BackgroundWorker1.IsBusy Then
    42. AufnahmeTon = New Byte() {}
    43. SoundOut.Stop()
    44. BackgroundWorker1.RunWorkerAsync()
    45. Button2.Text = "Zuhören aus"
    46. Zuhören = 1
    47. End If
    48. Else
    49. Button2.Text = "Zuhören an"
    50. Zuhören = 0
    51. SoundOut.Stop()
    52. _BufferingSource = New WriteableBufferingSource(New WaveFormat(11000, 8, 2))
    53. BackgroundWorker1.CancelAsync()
    54. End If
    55. End Sub
    56. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    57. Aufnehmen()
    58. End Sub
    59. Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    60. If Zuhören = 1 Then
    61. Do
    62. If AufnahmeTon.Length > 0 Then
    63. _BufferingSource = New WriteableBufferingSource(New WaveFormat(11000, 8, 2))
    64. _BufferingSource.FillWithZeros = True
    65. _BufferingSource.Write(AufnahmeTon, 0, AufnahmeTon.Length)
    66. Dim Source = _BufferingSource.ToSampleSource
    67. If SoundOut.PlaybackState = CSCore.SoundOut.PlaybackState.Stopped Then
    68. SoundOut.Initialize(Source.ToWaveSource)
    69. SoundOut.Play()
    70. End If
    71. AufnahmeTon = New Byte() {}
    72. End If
    73. Loop
    74. Else
    75. _BufferingSource.Dispose()
    76. _BufferingSource = New WriteableBufferingSource(New WaveFormat(11000, 8, 2))
    77. BackgroundWorker1.CancelAsync()
    78. End If
    79. End Sub
    80. End Class


    Wenn es mit einer anderen Methode einfacher/besser geht, steige ich gerne um :)

    Ich danke schonmal für eure Hilfe.

    MfG
    Willkommen im Forum. :thumbup:

    GERFreefighter schrieb:

    VB.NET-Quellcode

    1. If Button1.Text = "Funk an" Then
    Dies ist jetzt nicht Dein eigentliches Problem, aber es wird Dir in Zukunft viel Aufwand und Ärger bringen bzw. ersparen.
    Zweiter Grundsatz: Trenne Daten und GUI.
    Merke Dir nicht im Text eines Buttons, welcher Zustand Deines Programms eingeschaltet ist!
    Mach Dir eine Variable, die den Zustand speichert. Gibt es mehrere mögliche Zustände, nimm dafür ein eigenes Enum.
    Wenn sich der Zustand ändert, ruf eine Routine auf, in der die GUI entrsprechend angepasst wird: Texte von Labels, Enable von Controls usw.
    Deine Variable Zuhören mit ihren 2 Zuständen wäre dann besser ein Boolean.
    =====
    Ach ja.
    Erster Grundsatz: Option Strict On.
    ==========
    Und:
    Dein Mikrofon als solches funktioniert an diesem Rechner?

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!