2009-12-10 7 views
7

Zajmuję się tworzeniem aplikacji GStreamer i boryka się z implementacją odtwarzacza dla przychodzących strumieni RTP. Próbuję zbudować rurociąg wokół elementu gstrtpbin. Staram się modelować za pomocą rurociągu budowy GST wprowadzenia:Odtwarzanie przychodzącego strumienia RTP za pomocą GStreamera

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 

Kiedy uruchomienie skryptu GStreamer Raporty te błędy:

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 ... 

należy wspomnieć, że działa z playbin i SDP plik. Na przykład ten plik:

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 

Może być używany do odtwarzania strumienia tak:

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

dla kompletności: Używam VLC do przesyłania danych. To jest polecenie:

vlc -I rc /usr/local/movies/sample.mp4 \ 
    --screen-fps=10 :screen-caching=100 \ 
    --sout='#transcode{vcodec=h264,venc=x264{bframes=0,keyint=40},vb=512}:\ 
        rtp{mux=ts,dst=127.0.0.1,port=4444}' 

Czy ktoś mógłby mi pomóc zrozumieć, dlaczego skrypt gst-launch nie działa? Błąd "powód niepołączony" sprawia, że ​​myślę, że związek między gstrtpbin a elementami rtph264depay jest zepsuty. Ale nie wiem, jak to naprawić.

Edit
Po sugestii RAOF za Poprawiłem kilka błędów w mój rozkaz. Jednakże używam ffdec_h264 i autovideosink bo na mój system windows nie mam zainstalowane wtyczki fluh264dec i xvimage umywalką:

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 

Która prowadzi do nowych błędów:

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 ... 

Wciąż próbuję dowiedzieć się, jak to naprawić. Jeśli możesz pomóc, możesz to zrobić.

Edit2
Testowałem ponownie stosując roztwór SDP i zauważył, że występują też błędy „Nieistniejące PPS”, ale film jest odtwarzany. Z drugiej strony, fatalny "błąd wewnętrznego przepływu danych" pokazuje się tylko przy użyciu niestandardowego rozwiązania potokowego. Podejrzewam, że błędy "nieistniejącego PPS" są spowodowane przez koder x264. "Błąd wewnętrznego przepływu danych" musi być spowodowany przez błąd w moim potoku lub błąd w niektórych wtyczkach Windows. Będę więc niektóre dalsze badania ...

Odpowiedz

10

O ile mogę powiedzieć, że masz tam dwa problemy:

Po pierwsze, wydaje się postanowienie specyfikacji zlewozmywaka jest ważne: zamiast ... ! gstrtpbin .recv_rtp_sink_0 ! ... trzeba mieć ... ! .recv_rtp_sink_0 gstrtpbin ! ....

Po drugie, vlc wysyła strumień transportowy MPEG2 - posiadasz mux=ts w deskryptorze wyjścia strumieniowego rtp - ale próbujesz deployować surowy strumień h264. Musisz depayloadować strumień ts, a następnie demultipleksować go, aby uzyskać dane strumienia h264.

Więc wreszcie rurociąg

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 

pracuje dla mnie, z wykorzystaniem demuxer TS (mpegtsdemux) i dekoder H264 (fluh264dec).

+1

Dzięki za pomoc. Jestem teraz bliżej, zobacz moją edycję. – StackedCrooked

+0

Mam teraz zainstalowany gstreamer-ffmpeg i wypróbowałem go z ffdec_h264 i autovideosink. Mój rurociąg działa na mnie z tymi elementami zamiast fluh264dec i xvimagesink. Nie jestem pewien, gdzie leży twój problem, teraz. – RAOF

+0

Podejrzewam, że jest to problem specyficzny dla systemu Windows, będę testować z moim Linux-owym pudełkiem. Jeśli jesteś zainteresowany, zaktualizuję moje postępy w tym poście. Dzięki, byłeś bardzo pomocny. – StackedCrooked

1

gst-launch-0.10 -vvvv rtspsrc location = rtsp: //192.168.250.100: 554 opóźnienie = 100! application/x-rtp, media = "video", ładunek = 99, częstotliwość zegara = 90000, kodowanie-name = "H264"! rtph264depay! ffdec_h264! ffmpegcolorspace! xvimagesink

to działa na mnie z „Grandtec Elektronicznego megapikselowy WIFI CAM”

0

Można również próbować ten jeden.

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

Jego również pracować gdy strumieniowe w sieci jest bezpieczna, a jej prace nad

rtsp://10.107.2.217

RTSP Port : 554

Video Codec : H.264

nadzieja jego pomocne chłopaki.

Powiązane problemy