Mikrofon über TCP senden

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von MarioGeier00.

    Mikrofon über TCP senden

    Hallo liebe Vbler,

    1. Ich hätte gerne gewusst, welche dll (z. B. Bass.dll oder OpenCV) ich am besten verwenden sollte, um einen Stream des Mikrofons zu bekommen. Ich würde nämlich gerne eine stark vereinfachte Anwendung von Teamspeak programmmieren, also dass ich eben mit meinem Freund über das Internet (TCP-Stream) "telefoniere".

    Ich selbst habe schon eine funktionierende Client-Server Anwendung mittels TCP erstellt und bin in Visual Basic 2010 sehr gut eingearbeitet. Für mich wäre es auch kein Problem, die Bytes des Mirkofonstreams z. B. vom Client zum Server zu senden und dort wiederzugeben.

    2. Jedoch habe ich im Internet nie einen Code gefunden (für VB), der mir den Stream des Mikrofons übergeben kann. Angenommen, wir wollten nun über bass.dll einen Stream des Mikrofons am Client-Computer bekommen, wie würde der Code dazu aussehen?

    Habe Verständnis, wenn jemand meint, dass ich lieber im Internet nachschauen sollte, aber habe als Schüler der 9. Klasse einfach keine Zeit mehr dazu :S

    Jedenfalls wäre ich sehr dankbar für hilfreiche Antworten, in denen Code für die Bass.dll dargestellt würde. Diese Projekt ist dafür, um meinem Freund, den ich bereits fürs programmieren begeistern konnte, weiter Möglichkeiten in VB beizubringen.

    Mit freundlichen Grüßen

    Mario Geier :D

    Verschoben. ~Trade

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    Tcp ist für die Übertragung von VOIP ungeeignet, da es recht langsame Übertragungszeiten hat, und es bei Sprachübertragung nur auf die aktuellsten Pakete ankommt. Udp ist verbindungslos und wesentlich schneller bei der Übertragung der Daten, nutze also lieber das. Für das aufnehmen vom Mikrofon kann ich dir wärmstens CSCore empfehlen, das ist eine Bibliothek die du ganz normal in dein Projekt einbinden kannst. github.com/filoe/cscore

    Hier das passende Beispiel fürs Aufnehmen: github.com/filoe/cscore/blob/m…es/RecordToWma/Program.cs

    C# -> VB.Net Converter converter.telerik.com/

    MarioGeier00 schrieb:

    Habe Verständnis, wenn jemand meint, dass ich lieber im Internet nachschauen sollte, aber habe als Schüler der 9. Klasse einfach keine Zeit mehr dazu


    Ich hoffe das hast du als Scherz gemeint, wenn nicht nunja.
    Vielen Dank, mache mich gleich ran deine Lösung umzusetzen. Bin sehr dankbar, wird bloß ein bisschen aufwendig die TCP Verbindungen in UDP umzuändern.

    Nur weswegen ist TCP nicht so schnell wie UDP?


    Mit freundlichen Grüßen

    Mario Geier
    Weil TCP prüft, ob alle Pakete da sind, und ob sie unbeschädigt sind. Wenn nicht, wird dieses Paket so lange erneut gesendet, bis es korrekt beim User ankommt.

    Bei UDP passiert das eben nicht. Da wird halt mal ein Paket vergessen, oder sidn die Daten beschädigt. Ist bei Voice nicht so wichtig, da ein Paket eine viel zu kurze Zeitdauer an Ton erhält, als dass es groß stören würde.
    Ja, das stimmt. War mir so nicht klar. Habe jetzt das den Programmcode von CScore in ein Testprojekt eingefügt:

    Quellcode

    1. Using wasapiCapture = New WasapiLoopbackCapture()
    2. wasapiCapture.Initialize()
    3. Dim wasapiCaptureSource = New SoundInSource(wasapiCapture)
    4. Using stereoSource = wasapiCaptureSource.ToStereo()
    5. 'using (var writer = MediaFoundationEncoder.CreateWMAEncoder(stereoSource.WaveFormat, "output.wma"))
    6. Using writer = New WaveWriter("output.wav", stereoSource.WaveFormat)
    7. Dim buffer As Byte() = New Byte(stereoSource.WaveFormat.BytesPerSecond - 1) {}
    8. ' !!!!!!->
    9. wasapiCaptureSource.DataAvailable += Function(s, e)
    10. Dim read As Integer = stereoSource.Read(buffer, 0, buffer.Length)
    11. writer.Write(buffer, 0, read)
    12. ' <-!!!!!!
    13. End Function
    14. wasapiCapture.Start()
    15. Console.ReadKey()
    16. wasapiCapture.[Stop]()
    17. End Using
    18. End Using
    19. End Using


    Die makierte Stelle(Ausrufezeichen) gibt mir einen Fehler zurück:

    "Public Event DataAvailable(sender As Object, e As CSCore.SoundIn.DataAvailableEventArgs)" ist ein Ereignis und kann nicht direkt aufgerufen werden. Verwenden Sie eine RaiseEvent-Anweisung, um ein Ereignis aufzurufen.

    In Visual Basic geht das nämlich etwas anders als in C#, deswegen wurde es anscheinend auch nicht Sinngemäß übersetzt. Hab da auch zu wenig Erfahrung. Was ändere ich da jetzt am Code, dass man zum Beispiel eine Funktion auf ebene der Funktion Main() als Ereignis für neue Mikrofon-Daten festlegt?

    Lieb Grüße
    Nun klappt gott sei dank die aufnahme des Mikros/Lautsprechers. Werde damnächst den Quellcode für diejenigen, die die selben schwierigkeiten haben, posten.
    Jetzt noch eine Frage: Kann man von einem UDPClient einen Stream erben? Diesen könnte man dann nämlich einem windowsMediaPlayer-Steuerelement übergeben. Wenn man keinen stream erben kann, wie würde ich einen neuen stream erstellen? (Dim str as new Stream klappt schonma nicht)


    Mit freundlichen Grüßen

    Mario

    EDIT: Da ich leider keine Antwort bekommen habe, habe ich neues Thema angefangen: CSCore Mikrofon Übertragen mit UDP

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MarioGeier00“ ()