Raspberry pi Camera Modul Video Stream

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Raspberry pi Camera Modul Video Stream

    Hallo zusammen.
    der Titel verrät es ja schon, ich möchte gerne ein Raspberry (mit dem Camera Modul) als IP Webcam nutzen.
    Das Video möchte ich in meinem VB Programm an sehen.
    Mein erster Test
    Ich habe mit der folgen Anleitung getestet ob es generell geht.
    raspberrypiguide.de/howtos/raspberry-pi-camera-how-to/

    Nach der Installation der Teiber habe ich auf einen Linux Mint den Server gestartet

    Quellcode

    1. nc -l -p 5001 | mplayer -fps 31 -cache 1024 -

    Dann habe ich auf dem Raspberry den Befehl zum senden eingegeben

    Quellcode

    1. raspivid -t 0 -o - | nc 192.168.178.20 5001

    Das klappt soweit ganz gut. Das Bild kommt mit einer Verzögerung von unter einer Sekunde an.
    Ein anderer Test mit Windows und dem VLC Player war nicht so gut. Die Verzögerung lag bei ca. 3 Sekunden.

    Bei der ersten und besseren Lösung kommt nc (netcat) zum Einsatz.
    Ich gehe davon aus das das Video mit H264 komprimiert wird.

    Fragen
    Wie sieht es mit NetCat und VB aus? Benötige ich NetCat oder reicht VB aus?

    Wenn ich NetCat benötigen würde, wie wird das in Kombination mit VB eingesetzt?

    Kann VB den Stream anzeigen wenn er mit H264 komprimiert ist?

    Macht es einen Unterschied zu andern IP Webcams ob ich ein Raspberry als IP Webcam nutze?
    Denn der TCP Übertragungsweg (IP:Port) ist ja vorgegeben. Und komprimiert wird der Stream bestimmt auch.

    Kennt jemand ein gutes Tutorial zum Thema IP Webcam?

    Danke schon mal,

    Sara
    netcat brauchst du nicht, das leitet ja nur TCP/Udp auf stdin/out um und diesen zwischenschritt brauchst du ja nicht. Ist nur schön zum Arbeiten in Konsole, weil man da alles kombinieren kannst, wie man auch bereits oben sieht, weil du leitest die TCP-Daten auf die Standardausgabe um und über die Pipe direkt an mplayer weiter, der es dann abspielen kann.

    -> Also brauchst du in .Net auch nur einen TCP-Server erstellen(wobei bei soetwas z.B. die Frage ist, ob UDP nicht die bessere Möglichkeit ist - im Lokalen Netz, aber vmtl. Vernachlässigbar). Wenn dann die Daten ankommen, kannst du diese ja erstmal in eine Datei umleiten lassen, wenn du das geschafft hast kann man weiter machen.

    Dann ist erstmal die Frage ob dus nur darstellen möchtest, oder was du genau mit den Bildern anfangen willst. Schließlich muss man sich für irgendeine Technologie entscheiden, denn Rein in VB würde ich das niemandem Empfehlen und ist bei guter Video Qualität auch ohne Framdrop in reinem VB(heißt nicht, dass es in anderen Sprachen sehr viel besser geht) auch nicht möglich :D
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hallo jvbsl,
    dein Vorschlag hat mich auf eine andere Idee gebracht.
    Ich habe eine Teil aus einem Chat Programm genutzt.
    Wenn etwas ankommt sollte doch etwas angezeigt werde.
    Leider klappt es aber nicht. Es wird nichts angezeigt.
    Wenn ich mit dem Chat Programm etwas sende kommt es an.
    Die Verbindung wir auch aufgebaut. Das kann ich daran erkennen
    das der Stream auf dem Raspberry startet.
    Würde es nicht klappen würde der Stream automatisch nach einigen Sekunden gestoppt.

    Hier ist der Code

    Sara

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.Threading
    3. Imports System.IO
    4. Imports System.Net
    5. Class MainWindow
    6. Dim listener As New TcpListener(5001)
    7. Dim Client As TcpClient
    8. Dim daten As String
    9. Dim filename As String = IO.Path.GetTempFileName
    10. ' MsgBox(Path.GetTempFileName)
    11. Dim fs As New IO.FileStream(filename, IO.FileMode.Create)
    12. Public dt As New Windows.Threading.DispatcherTimer
    13. Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
    14. listener.Start()
    15. Dim listthread As New Thread(New ThreadStart(AddressOf listening))
    16. listthread.Start()
    17. AddHandler dt.Tick, AddressOf dt_Tick
    18. dt.Interval = TimeSpan.FromMilliseconds(0)
    19. dt.IsEnabled = True
    20. End Sub
    21. Sub dt_Tick(ByVal sender As Object, ByVal e As System.EventArgs)
    22. If listener.Pending = True Then
    23. 'daten = ""
    24. Client = listener.AcceptTcpClient()
    25. Dim reader As New StreamReader(Client.GetStream())
    26. While reader.Peek > -1
    27. ' fs.WriteByte(reader.Read())
    28. daten = Convert.ToChar(reader.Read())
    29. rtb_data.AppendText(daten)
    30. End While
    31. End If
    32. End Sub
    33. Private Sub listening()
    34. listener.Start()
    35. End Sub
    36. Private Sub Window_Closing(sender As Object, e As ComponentModel.CancelEventArgs)
    37. listener.Stop()
    38. End Sub
    39. End Class
    Deine Implementierung ist eher Suboptimal.
    1. Für listener.Start() brauchst du keinen extra Thread, da diese Methode nicht blockierend ist.
    2. Ist ein Timer nicht die richtige Methode um Threads zu starten -> BeginAcceptTcpClient verhilft einem zu einer sehr schönen Implementierung
    3. Auch wenn der StreamReader bereits puffert machst du dir Leider diesen Vorteil wieder zunichte, da du alle Zeichen einzeln liest und in ein Char Konvertierst. Gleich größere Blöcke aufeinmal auszulesen ist immer performanter
    VersuchsChat mit leistungsfähigem Server
    Das kannst dir zu dem mal angucken. Die dabei verwendete Thread- Synchronization, würde ich dabei aber später regeln lassen, da du dies bisher erstmal nur zur Anzeige benötigst und später vlt. gar nicht mehr(kostet nur unnötig Zeit).
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---