Streaming RTP / RTSP: problemy z synchronizacją / datownikiem

Mam problem z przesyłaniem strumieniowym wideo H.264 przez RTSP. Celem jest strumieniowe przesyłanie obrazu z kamery do klienta RTSP (najlepiej wtyczki przeglądarki na końcu). Jak dotąd działało to całkiem dobrze, z wyjątkiem jednego problemu: wideo będzie opóźniało się przy starcie, zacinało się co kilka sekund i ma ~ 4-sekundowe opóźnienie. To jest złe.

Nasza konfiguracja polega na kodowaniu x264 (w / zerolatency i ultrafast) i spakowaniu do RTSP / RTP z libavformat z ffmpeg 0.6.5. Do testowania otrzymuję strumień z potokiem GStreamer z gst-launch podczas łączenia się z serwerem RTSP.jednak, Udało mi się odtworzyć ten sam problem podczas przesyłania strumieniowego bezpośrednio z innej instancji GStreamer za pomocą tylko RTP.

Maszyna wysyłająca:

gst-launch videotestsrc ! x264enc tune=zerolatency ! rtph264pay ! udpsink host=10.89.6.3

Maszyna odbiorcza:

gst-launch udpsrc ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! xvimagesink

Możesz również uruchomić oba na tym samym komputerze, po prostu zmień hosta na 127.0.0.1 na nadawcy. Po stronie odbiorcy powinieneś zauważyć jąkanie i generalnie słabe wideo wraz z powtarzającymi się ostrzeżeniami na konsoli:

WARNING: from element /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0: A lot of buffers are being dropped.
Additional debug info:
gstbasesink.c(2875): gst_base_sink_is_too_late (): /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0:
There may be a timestamping problem, or this computer is too slow.

Jednym z powszechnie sugerowanych „poprawek”, które widziałem w całym Internecie, jest użyciesync=false z xvimagesink:

gst-launch udpsrc ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! xvimagesink sync=false

Wideo zostanie odtworzone z niemal zerowym opóźnieniem, nawet podczas testowania za pomocą naszego oprogramowania aparatu. Jest to przydatne do testowania, ale nie jest zbyt przydatne do wdrożenia, ponieważ nie działa z Totemem, VLC lub wtyczką do przeglądarki.

Chciałbym spróbować rozwiązać problem u źródła; Podejrzewam, że w strumieniu H.264 brakuje informacji o datowniku przez x264 lub ładunki RTP. Czy jest jakiś sposób na modyfikacjęźródło gst pipeline, żebym to zrobiłnie potrzebuję użyćsync=false na odbiorniku?

Jeśli nie jest to możliwe, jak mogę powiedzieć klientom (za pośrednictwem SDP lub w inny sposób), że strumień nie powinien być synchronizowany? Ostatecznie umieścilibyśmy to w przeglądarce za pomocą różnego rodzaju wtyczki VLC, więc rozwiązanie, które by tam działało, byłoby jeszcze lepsze.

questionAnswers(3)

yourAnswerToTheQuestion