2009-12-10 12 views
7

Ich entwickle eine GStreamer-Anwendung und kämpfe mit der Implementierung eines Players für eingehende RTP-Streams. Ich versuche eine Pipeline um das Element gstrtpbin zu erstellen. Ich versuche, die Pipeline mit einem gst-Launch Konstruktion zu modellieren:Wiedergabe eines eingehenden RTP-Streams mit GStreamer

VIDEO_CAPS="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264" 

gst-launch -v udpsrc caps=$VIDEO_CAPS port=4444 \ 
       ! gstrtpbin .recv_rtp_sink_0 \ 
       ! rtph264depay ! ffdec_h264 ! xvimagesink 

Als ich das Drehbuch GStreamer meldet diese Fehler zu starten:

Setting pipeline to PAUSED ... 
Pipeline is live and does not need PREROLL ... 
Setting pipeline to PLAYING ... 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSession:rtpsession0: ntp-ns-base = 3469468914024449000 
New clock: GstSystemClock 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSession:rtpsession0.GstPad:recv_rtp_sink: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0.GstGhostPad:recv_rtp_sink_0: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0.GstGhostPad:recv_rtp_sink_0.GstProxyPad:proxypad0: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSession:rtpsession0.GstPad:recv_rtp_src: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSsrcDemux:rtpssrcdemux0.GstPad:sink: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpJitterBuffer:rtpjitterbuffer0.GstPad:src: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpJitterBuffer:rtpjitterbuffer0.GstPad:sink: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpPtDemux:rtpptdemux0.GstPad:sink: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0.GstGhostPad:recv_rtp_src_0_960476599_33.GstProxyPad:proxypad1: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)33 
ERROR: from element /GstPipeline:pipeline0/GstUDPSrc:udpsrc0: Internal data flow error. 
Additional debug info: 
gstbasesrc.c(2378): gst_base_src_loop(): /GstPipeline:pipeline0/GstUDPSrc:udpsrc0: 
streaming task paused, reason not-linked (-1) 
Execution ended after 209381685 ns. 
Setting pipeline to PAUSED ... 
Setting pipeline to READY ... 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0.GstGhostPad:recv_rtp_src_0_960476599_33: caps = NULL 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpPtDemux:rtpptdemux0.GstPad:src_33: caps = NULL 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpPtDemux:rtpptdemux0.GstPad:sink: caps = NULL 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpJitterBuffer:rtpjitterbuffer0.GstPad:sink: caps = NULL 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpJitterBuffer:rtpjitterbuffer0.GstPad:src: caps = NULL 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSsrcDemux:rtpssrcdemux0.GstPad:src_960476599: caps = NULL 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSsrcDemux:rtpssrcdemux0.GstPad:sink: caps = NULL 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSession:rtpsession0.GstPad:recv_rtp_src: caps = NULL 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSession:rtpsession0.GstPad:recv_rtp_sink: caps = NULL 
/GstPipeline:pipeline0/GstRtpBin:rtpbin0.GstGhostPad:recv_rtp_sink_0: caps = NULL 
/GstPipeline:pipeline0/GstUDPSrc:udpsrc0.GstPad:src: caps = NULL 
Setting pipeline to NULL ... 
Freeing pipeline ... 

Ich sollte erwähnen, dass es mit einem playbin und SDP arbeitet Datei. Zum Beispiel dieser Datei:

gst-launch -vvv playbin uri=file://`pwd`/stream.sdp 

Der Vollständigkeit:

v=0 
o=- 1188340656180883 1 IN IP4 127.0.0.1 
s=Session streamed by GStreamer 
i=server.sh 
t=0 0 
a=tool:GStreamer 
a=type:broadcast 
m=video 4444 RTP/AVP 96 
c=IN IP4 127.0.0.1 
a=rtpmap:96 H264/90000 

kann den Strom so spielen verwendet werden, ich bin mit VLC-Daten zu senden. Das ist der Befehl:

Würde jemand mir helfen zu verstehen, warum das GST-Start-Skript fehlschlägt? Der Fehler "Ursache nicht verknüpft" lässt mich glauben, dass die Verbindung zwischen den Elementen gstrtpbin und rth264depay unterbrochen ist. Aber ich weiß nicht, wie ich das beheben soll.

bearbeiten
Raof Vorschläge Nach Fest ich ein paar Fehler in meinem Kommando. Ich verwende ffdec_h264 jedoch und autovideosink weil auf meinem Windows-System habe ich nicht die fluh264dec und xvimage Spüle Plugins installiert:

gst-launch-0.10 udpsrc port=4444 caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264" ! .recv_rtp_sink_0 gstrtpbin ! rtpmp2tdepay ! mpegtsdemux ! ffdec_h264 ! autovideosink 

, die zu neuen Fehlern führt:

0:00:00.743000000 516 024070A8 ERROR     ffmpeg .:0:: non-existing PPS referenced 
0:00:00.744000000 516 024070A8 ERROR     ffmpeg .:0:: non-existing PPS referenced 
0:00:00.745000000 516 024070A8 ERROR     ffmpeg .:0:: decode_slice_header error 
0:00:00.745000000 516 024070A8 ERROR     ffmpeg .:0:: no frame! 
0:00:00.812000000 516 024070A8 ERROR     ffmpeg .:0:: non-existing PPS referenced 
0:00:00.813000000 516 024070A8 ERROR     ffmpeg .:0:: non-existi 
... 
ERROR: from element /GstPipeline:pipeline0/GstUDPSrc:udpsrc0: Internal data flow 
error. 
Additional debug info: 
..\Source\gstreamer\libs\gst\base\gstbasesrc.c(2378): gst_base_src_loop(): /Gst 
Pipeline:pipeline0/GstUDPSrc:udpsrc0: 
streaming task paused, reason not-negotiated (-4) 
Execution ended after 4790000000 ns. 
Setting pipeline to PAUSED ... 
Setting pipeline to READY ... 
Setting pipeline to NULL ... 
Freeing pipeline ... 

Ich bin immer noch versuchen, um herauszufinden, wie das zu beheben ist. Wenn Sie helfen können, dann zögern Sie nicht.

EDIT2
Getestet habe ich wieder die SDP-Lösung und beobachtet, dass die „nicht vorhandene PPS“ Fehler auch auftreten, aber das Video abgespielt wird. Auf der anderen Seite zeigt sich der fatale "interne Datenflussfehler" nur bei Verwendung der angepassten Pipeline-Lösung. Ich vermute, dass die "nicht vorhandenen PPS" -Fehler vom x264-Encoder verursacht werden. Der "interne Datenflussfehler" muss durch einen Fehler in meiner Pipeline oder einen Fehler in einem Windows-Plugin verursacht werden. Ich werde so einige weitere Forschung ...

Antwort

10

Soweit ich das beurteilen kann, haben Sie zwei Probleme dort bekam:

Erstens ist es die Reihenfolge der Spüle Spezifikation scheint wichtig ist: anstatt ... ! gstrtpbin .recv_rtp_sink_0 ! ... Sie brauchen haben ... ! .recv_rtp_sink_0 gstrtpbin ! ....

Zweitens, vlc sendet einen MPEG2-Transportstrom - Sie haben mux=ts in der rtp Streaming-Ausgabe-Deskriptor - aber Sie versuchen, eine Roh-h264-Stream entladen. Sie müssen den ts-Stream entladen und ihn dann demuxen, um die Daten des h264-Streams zu erhalten.

So schließlich die Pipeline

gst-launch-0.10 -v udpsrc port=4444 \ 
caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264" \ 
! .recv_rtp_sink_0 gstrtpbin ! rtpmp2tdepay \ 
! mpegtsdemux ! fluh264dec ! xvimagesink 

Werke für mich, mit dem TS-Demuxer (mpegtsdemux) und H264-Decoder (fluh264dec).

+1

Vielen Dank für Ihre Hilfe. Ich bin jetzt einen Schritt näher, sehe meinen Schnitt. – StackedCrooked

+0

Ich habe jetzt gstreamer-ffmpeg installiert und es mit ffdec_h264 und autovideosink versucht. Meine Pipeline funktioniert für mich mit diesen Elementen anstelle von fluh264dec und xvimagesink. Ich bin mir nicht sicher, wo dein Problem jetzt liegt. – RAOF

+0

Ich vermute, es ist ein Windows-spezifisches Problem, ich werde mit meiner Linux-Box testen. Wenn Sie interessiert sind, werde ich meinen Fortschritt in diesem Post aktualisieren. Danke, Sie waren sehr hilfreich. – StackedCrooked

1

gst-launch-0.10 -vvvvrtspsrc location = rtsp: //192.168.250.100: 554 Latenz = 100! application/x-rtp, media = "video", Nutzlast = 99, Taktrate = 90000, Kodierungsname = "H264"! rtph264depay! ffdec_h264! ffmpegfarbraum! xvimagesink

dies mit einem "Grandtec Elektronische MegaPixel WIFI CAM"

für mich arbeitet, kann
0

Sie versuchen, auch dieses.

gst-launch-0.10 -v rtspsrc location="rtsp://10.107.2.217/StreamingSetting?version=1.0&action=getRTSPStream&ChannelID=1&ChannelName=Channel1" user-id=admin user-pw=admin123 caps=" application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264,payload=(int)96,ssrc=(uint)237526004,clock-base=(uint)1584170994,seqnum-base=(uint)42626" port=554 ! rtph264depay queue-delay=0 ! h264parse ! decodebin2 ! queue leaky=1 ! autovideosink

Sein auch arbeiten, wenn Ihr Streaming-Netzwerk sicher ist, und seine Arbeiten auf

rtsp://10.107.2.217

RTSP Port : 554

Video Codec : H.264

Hoffnung, seine hilfreich Ihr.