2009-12-10 14 views
7

Estoy desarrollando una aplicación GStreamer y estoy luchando con la implementación de un reproductor para transmisiones RTP entrantes. Estoy tratando de construir una tubería alrededor del elemento gstrtpbin. Estoy tratando de modelar la tubería usando una construcción GST-lanzamiento:Reproducción de una secuencia RTP entrante con 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 

Cuando inicio el guión GStreamer informa de estos errores:

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

Debo mencionar que funciona con un playbin y SDP archivo. Por ejemplo este archivo:

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 

se puede utilizar para reproducir la secuencia de la siguiente manera:

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

Para completar: Estoy utilizando VLC para enviar datos. Este es el comando:

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}' 

¿Alguien me ayudaría a entender por qué falla el script gst-launch? El error "razón no vinculada" me hace pensar que el enlace entre gstrtpbin y los elementos rtph264depay está roto. Pero no sé cómo arreglarlo.

Editar
Siguiendo las sugerencias de Raof que fija algunos errores en mi comando. Sin embargo, yo estoy usando ffdec_h264 y autovideosink porque en mi sistema de Windows no tengo los plugins fluh264dec y xvimage fregadero instalados:

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 

que nos lleva a nuevos errores:

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

Todavía estoy tratando para descubrir cómo arreglar esto Si puede ayudar, siéntase libre de hacerlo.

Edit2
que prueba una vez más el uso de la solución SDP y observó que los errores "PPS no existente" también se producen, pero el vídeo no jugar. Por otro lado, el "error interno de flujo de datos" fatal solo se muestra cuando se utiliza la solución de canalización personalizada. Sospecho que los errores "PPS no existentes" son causados ​​por el codificador x264. El "error de flujo de datos interno" debe ser causado por un error en mi canalización, o quizás un error en algún complemento de Windows. Voy a por lo que algunas investigaciones más ...

Respuesta

10

Por lo que yo puedo decir, que tienes dos problemas existen:

En primer lugar, parece que el orden de las especificaciones del fregadero es importante: en lugar de ... ! gstrtpbin .recv_rtp_sink_0 ! ... necesita tener ... ! .recv_rtp_sink_0 gstrtpbin ! ....

En segundo lugar, vlc está enviando un flujo de transporte MPEG2 - tiene mux=ts en el descriptor de salida de transmisión rtp - pero está tratando de descargar una corriente h264 sin formato. Debe descargar depay la secuencia ts y luego demultiplexar para obtener los datos de la secuencia h264.

Así que, finalmente, la tubería

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 

funciona para mí, utilizando el TS demuxer (mpegtsdemux) y decodificador H264 (fluh264dec).

+1

Gracias por su ayuda. Estoy un paso más cerca ahora, mira mi edición. – StackedCrooked

+0

He instalado gstreamer-ffmpeg y lo he probado con ffdec_h264 y autovideosink. Mi canalización funciona para mí con esos elementos en lugar de fluh264dec y xvimagesink. No estoy seguro de dónde está tu problema, ahora. – RAOF

+0

Sospecho que es un problema específico de Windows, lo probaré con mi caja de Linux. En caso de que estés interesado, actualizaré mi progreso en esta publicación. Gracias, has sido muy útil. – StackedCrooked

1

gst-launch-0.10 -vvvv rtspsrc location = rtsp: //192.168.250.100: 554 latency = 100! application/x-rtp, media = "video", carga útil = 99, frecuencia de reloj = 90000, nombre-codificación = "H264"! rtph264depay! ffdec_h264! ffmpegcolorspace! xvimagesink

esto funciona para mí con un "Grandtec electrónico Megapíxeles WIFI CAM"

0

También puede probar esto.

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

Su también funcionará cuando el streaming en la red es segura, y sus trabajos sobre

rtsp://10.107.2.217

RTSP Port : 554

Video Codec : H.264

Esperanza, su utilidad para ustedes.

Cuestiones relacionadas