2016-04-12 14 views
3

Ich bin neu in gstreamer, und ich möchte Webcam-Video über das Netzwerk mit mpeg2-ts streamen. Ich bin in der Lage, Video mit der folgenden Pipeline zu streamen, aber ich weiß nicht, wie man es mit mpeg2-ts unter Verwendung mpegmux streamen kann. Jede Hilfe wäre großartig! Vielen Dank.Wie man Webcam-Streaming mit mpegtsmux in Gstreamer

Mein Arbeits pipline (ohne mpegmux):

// Sender 
gst-launch-1.0 -ve v4l2src \ 
! video/x-raw, framerate=30/1 \ 
! videoconvert \ 
! x264enc noise-reduction=10000 speed-preset=fast tune=zerolatency byte-stream=true threads=4 key-int-max=15 intra-refresh=true \ 
! rtph264pay pt=96 \ 
! udpsink host=localhost port=5000 

// Receiver 
gst-launch-1.0 -ve udpsrc port=5000 \ 
! application/x-rtp, media=video, clock-rate=90000, encoding-name=H264, payload=96 \ 
! rtph264depay \ 
! h264parse \ 
! avdec_h264 \ 
! videoconvert \ 
! ximagesink sync=false 

I wie unten einige Methoden versucht haben, aber immer noch nicht daran zu arbeiten. Absender gibt Fehler "konnte Mux mit rtph264pay nicht verbinden" und Empfänger gibt "konnte Mux mit udpsrc nicht verbinden".

// Sender 
gst-launch-1.0 -ve v4l2src \ 
! video/x-raw, framerate=30/1 \ 
! videoconvert \ 
! x264enc noise-reduction=10000 speed-preset=fast tune=zerolatency byte-stream=true threads=4 key-int-max=15 intra-refresh=true \ 
! rtph264pay pt=96 \ 
! mpegtsmux name=mux mux. \ 
! udpsink host=localhost port=5000 

// Reveiver 
gst-launch-1.0 -ve udpsrc port=5000 \ 
! application/x-rtp, media=video, clock-rate=90000, encoding-name=H264, payload=96 \ 
! tsdemux name=demux demux.video_00 \ 
! rtph264depay \ 
! h264parse \ 
! avdec_h264 \ 
! videoconvert \ 
! ximagesink sync=false 

Beachten Sie, dass, ich benutze tsdemux statt mpegtsdemux im Empfänger, da gibt er ‚kein Element‚mpegtsdemux‘‘. Allerdings habe ich, wenn der Typ $ gst-inspect-1.0 mpegtsdemux druckt:

Plugin Details: 
    Name      mpegtsdemux 
    Description    MPEG TS demuxer 
    Filename     /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstmpegtsdemux.so 
    Version     1.2.4 
    License     unknown 
    Source module   gst-plugins-bad 
    Source release date  2014-04-18 
    Binary package   GStreamer Bad Plugins (Ubuntu) 
    Origin URL    https://launchpad.net/distros/ubuntu/+source/gst-plugins-bad1.0 

    tsdemux: MPEG transport stream demuxer 
    tsparse: MPEG transport stream parser 

    2 features: 
    +-- 2 elements 

Ich habe keine Ahnung, warum gst-Start-1.0 nicht mpegtsdemux finden.


EDIT: Dank @otopolsky, ich habe eine funktionierende Pipeline herausgefunden (siehe unten). Und auch, er/sie hat recht damit, keine Kappen im Empfänger zu verwenden, wenn tsparse vor tsdemux platziert wird.

// Sender 
gst-launch-1.0 -ve v4l2src \ 
! video/x-raw, framerate=30/1 \ 
! videoconvert \ 
! x264enc noise-reduction=10000 tune=zerolatency byte-stream=true threads=4 key-int-max=15 intra-refresh=true \ 
! mpegtsmux \ 
! udpsink host=localhost port=5000 

// Receiver 
gst-launch-1.0 -ve udpsrc port=5000 \ 
! tsparse \ 
! tsdemux \ 
! h264parse \ 
! avdec_h264 \ 
! videoconvert \ 
! ximagesink sync=false 

Nur noch ein paar Fragen:

  1. Warum brauche ich nicht rtpmp2tdepay in der Empfängerseite hinzufügen? (Wenn ich es irgendwo in der Pipeline hinzufüge, wird die "Konnte nicht rtpmp2tdepay mit xx verknüpfen" generiert werden.)
  2. Die Qualität des Streaming-Videos wäre schlechter als die ohne Verwendung von mpegtsmux. Warum das? Liegt es daran, dass mpeg2-ts verwendet wird? Gibt es Tipps zur Verbesserung der Streaming-Qualität?
+0

zum Update, 1, nicht ganz sicher, ich habe personaly große Lücken in Verständnis der Parse/Pay/Depay Sachen .. aber ich denke, die Pakete bereits 188 Bytes enthält jede (die MPEG-TS-Paket Größe), die dann nicht depayloaded sein muss (wie es 1: 1 ist) .. Ich weiß nicht, wie es ist, dass Sie den Depay nirgends setzen können. Überprüfen Sie die Kappen von src/sink mit 'gst-inspect-1.0 Element' .. 2, um die Qualität .. Ich denke, die Verarbeitung ist irgendwie anders - sehr niedrige Qualität wird mit Nullelast erreicht, so dass dies möglicherweise verursacht dies ..Wie wäre es mit dem Entfernen der Null-Latenz und dem Hinzufügen einer schönen Geschwindigkeits-Voreinstellung? – nayana

+0

Danke für Ihre Erklärungen. Was die Qualität anbelangt, so wird das Setzen von 'speed-preset' auf einen Wert unter 'ultrafast' (der die gleiche Qualität wie die Null-last hat) dazu führen, dass das Streaming auf meinem Gerät sehr verzögert wird. – j0e1in

+0

Durch Entfernen von 'rtpmp2tpay' im Absender ist die Videoqualität jetzt viel besser. Es scheint überflüssig zu sein. – j0e1in

Antwort

4

Sie zu tun haben:

x264enc ! mpegtsmux ! rtpmp2tpay ! udpsink 

Wie in this Antwort ..

Das tsdemux Element ist jedoch mpegtsdemux ist, um dieses Element enthält. Es enthält auch Tsparse, wie in der inspect-Nachricht erwähnt .. vielleicht, wenn Sie Tsparse vor Tsdemux verwenden, benötigen Sie keine zusätzlichen Informationen über die Caps im Empfänger (ich bin mir nicht genau darüber sicher).

Ein weiterer Tipp für Sie: Wenn Sie zerolatency verwenden, wird die Geschwindigkeit voreingestellt oder jede andere Qualitätsbehandlung verwerfen.

HTH

+0

Danke! Ich würde das nie alleine herausfinden. Ich habe eine funktionierende Pipeline. Nur noch ein paar Fragen, wenn es Ihnen nichts ausmacht. (Siehe EDIT in der Frage.) – j0e1in