Video Chat erstellen

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Manawyrm.

    Ja aber es ist schwer ! Du brauchst ein UDP das ist ein Protokoll für Bilder e.c.
    Und du brauchst in deiner Form einen Timer der alle ... Sekunden ein Screen Capture macht und es als .png oder so in einem Ordner Speicher und dieses auf den UDP hochläd.
    Geht glaub auch ohne das es in einem Ordner speichert.

    xd-franky-5 schrieb:

    Ja aber es ist schwer ! Du brauchst ein UDP das ist ein Protokoll für Bilder e.c.
    Und du brauchst in deiner Form einen Timer der alle ... Sekunden ein Screen Capture macht und es als .png oder so in einem Ordner Speicher und dieses auf den UDP hochläd.
    Geht glaub auch ohne das es in einem Ordner speichert.


    Und woher bekommt man dieses Protokoll?
    Könnte man das nicht auch mit einem FTP Server machen? Da ich in letzter Zeit viel mit FTP Servern herumspiele...

    Ich habe jetzt auch schon ein Code mit dem ich das Bild der Webcam in eine Picturebox kriege:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public videoHandle As IntPtr
    3. Private Declare Auto Function SendMessage Lib "user32" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    4. Const EM_LINEFROMCHAR As Integer = &HC9
    5. Const EM_LINEINDEX As Integer = &HBB
    6. Private Declare Auto Function capCreateCaptureWindow Lib "avicap32.dll" (ByVal lpszWindowName As String, ByVal dwStyle As Integer, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hWndParent As IntPtr, ByVal nID As Integer) As IntPtr
    7. Private Const WS_CHILD As Integer = &H40000000
    8. Private Const WS_VISIBLE As Integer = &H10000000
    9. Private Const WM_USER As Short = &H400S
    10. Private Const WM_CAP_START As Short = &H400S
    11. Private Const WM_CAP_EDIT_COPY As Integer = (WM_CAP_START + 30)
    12. Private Const WM_CAP_DRIVER_CONNECT As Integer = (WM_CAP_START + 10)
    13. Private Const WM_CAP_SET_PREVIEWRATE As Integer = (WM_CAP_START + 52)
    14. Private Const WM_CAP_SET_OVERLAY As Integer = (WM_CAP_START + 51)
    15. Private Const WM_CAP_SET_PREVIEW As Integer = (WM_CAP_START + 50)
    16. Private Const WM_CAP_DRIVER_DISCONNECT As Integer = (WM_CAP_START + 11)
    17. Public Function CreateCaptureWindow(ByRef hWndParent As IntPtr, Optional ByRef x As Integer = 0, Optional ByRef y As Integer = 0, Optional ByRef nWidth As Integer = 320, Optional ByRef nHeight As Integer = 240, Optional ByRef nCameraID As Integer = 0) As IntPtr
    18. Dim previewHandle As IntPtr
    19. previewHandle = capCreateCaptureWindow("Video", WS_CHILD + WS_VISIBLE, x, y, nWidth, nHeight, hWndParent, 1)
    20. SendMessage(previewHandle, WM_CAP_DRIVER_CONNECT, nCameraID, 0)
    21. SendMessage(previewHandle, WM_CAP_SET_PREVIEWRATE, 30, 0)
    22. SendMessage(previewHandle, WM_CAP_SET_OVERLAY, 1, 0)
    23. SendMessage(previewHandle, WM_CAP_SET_PREVIEW, 1, 0)
    24. Return previewHandle
    25. End Function
    26. Public Function CapturePicture(ByRef nCaptureHandle As IntPtr) As System.Drawing.Image
    27. My.Computer.Clipboard.Clear()
    28. SendMessage(nCaptureHandle, WM_CAP_EDIT_COPY, 0, 0)
    29. Return My.Computer.Clipboard.GetImage
    30. End Function
    31. Public Sub Disconnect(ByRef nCaptureHandle As IntPtr, Optional ByRef nCameraID As Integer = 0)
    32. SendMessage(nCaptureHandle, WM_CAP_DRIVER_DISCONNECT, nCameraID, 0)
    33. End Sub
    34. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    35. videoHandle = Me.CreateCaptureWindow(Me.PictureBox1.Handle)
    36. End Sub
    37. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    38. Disconnect(videoHandle)
    39. End Sub
    40. End Class


    Aber wenn ich das Programm starte ist das Video klein und nicht in der ganzen Picturebox. Kann man das irgendwie ändern :?:

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

    Das kannst du in den Einstellungen der Picturebox festlegen. Im Designer auf das kleine Dreieck oben rechts an der Picturebox.

    Solltest du alle 5 Minuten dem Web ein Bild deiner Webcam zugänglich machen wollen, hast du Recht, dann ist FTP geeignet...
    Lass es!!!

    Exakt 100% genau dein Programm, wirklich 100% gleich hat gerade jemand im Showroom hochgeladen!
    Weißt du was mit dem passiert ist?
    Seine komplette Webseite wurde gelöscht, seine Zugangsdaten stehen sogar auf vorn' auf der Hauptseite..

    FTP ist unsicher!
    Bilder lesen via Zwischenablage ist so schlimm, schlimmer wirds nicht!
    wenn er es machen will kann er es doch ruhig versuchen!
    aber du solltest wirklich vermeiden deine ftp daten in dein programm zu schreiben! weil wie schon gesagt die kann man ganz einfach sehen und dan kann man sich wunderbar einhacken ;)
    du willst sagen wir mal eine art livestream erstellen? wenn ich mit meiner kamera etwas filme dan soll es jeder andere auch sehen? möglich live richtig?

    dazu brauchst du einen sehr sehr guten rechner, sehr gutes internet!
    ich würde mal sagen das wäre mit einem "udp" server (verbessert mich bitte) möglich!
    du müsstest an diesen server dein video schicken (im dauermodus) und der server müsste (im dauermodus) an alle anderen die sich zum udp server eingeloggt haben das video schicken (im dauermodus)
    das video was die anderen dan erhalten müsstest du dan wiederum umwandeln und direkt auf deinem programm anzeigen lassen ;) glaube das wäre so das sinnvollste und schnellste was mir so jetzt einfällt ;)
    mit einem udp server kannst du dan auch noch einen chat, onlineliste.... und so weiter hinzufügen... aber wie gesagt du brauchst dazu gutes internet und der server (wenn es ein rootserver ist oder dein rechner) brauch auch gutes internet weil ja ganze videodateien verschickt werden
    Man könnte auch nen bisschen von OpenSource profitieren.

    Wie wäre es, als Streamserver nen Icecast2 aufzusetzen,
    und dann jeden Nutzer streamen zu lassen, der Nutzer streamt dann z.B. auf Nutzer1.ogg

    Als Streaming-Client könnte man FFMpeg unter Windows z.B. mit LiquidSoap kombiniert nutzen...

    Wäre perfekt, schnell, komfortabel und sogar mit mobilen Geräten kompatibel.
    Was will man mehr?
    Da hier so oder so jeder der meint von irgendwas ne Ahnung zu haben reinschreiben muss werde ich hier auch mal was dazu sagen. Bis so ein Video flüssig läuft bedarf es
    a) Grundlagenwissen was der TE bei WEITEM noch nicht hat, da alleine schon der Vorschlag FTP zu verwenden das so ziemlich dümmste ist was man in so einem Fall machen kann. Da bekommt man nicht mal nen Text flüssig rüber geschweige denn Video, Ton,...
    b) Einem guten Algorithmus für das Encodieren des Videosignals welches übertragen wird. Das Problem ist nach wie vor, dass Bilder einfach scheiße groß sind. Also wirst du als erstes ein geeignetes Format finden müssen in welches du die Bilder encodierst und somit so wenig wie möglich zu übertragen hast. Ich kenne mich mit Video leider nicht aus aber bei z.B. Ton wäre sowas Speex, GSM,... und garantiert nicht Rohform wie z.B. PCM. Des weiteren würde ich mir überlegen nur Teile des Bildes zu übertragen(sofern dies der verwendete Codec zulässt). Das heißt wenn auf bei der Webcam nen Kopf davor ist wird sich dieser hoffentlich verändern(ansonsten wäre dies ein schlechtes Zeichen seitens des Chattenden :P). Jedoch wenn im Hintergrund eine Tür ist wird diese sich wohl eher weniger verändern. Wieso also immer alles übertragen? Genau -> unnötig. Kurz: Überleg dir was wie du die Datenmenge auf ein absolutes Minimum reduzieren kannst. Dabei ist PNG's übertragen garantiert nicht der richtige weg.
    c) Bilder erst auf der Festplatte speichern? WAT? Wenn man etwas absichtlich langsamer machen möchte: gern.

    Außerdem würde ich mir überlegen wirklich etwas fertiges zu verwenden. Bis da du mit deinem Grundlagenwissen etwas halbwegs lauffähiges hast -> hast du längst aufgegeben.


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