Потоковая передача RTP / RTSP: проблемы с синхронизацией / отметкой времени

У меня возникли проблемы с потоковой передачей видео H.264 по протоколу RTSP. Цель состоит в том, чтобы транслировать изображение с камеры в реальном времени на RTSP-клиент (в идеале плагин для браузера в конце). До сих пор это работало довольно хорошо, за исключением одной проблемы: видео будет зависать при запуске, зависать каждые несколько секунд и иметь задержку ~ 4 секунды. Это плохо.

Наша установка заключается в кодировании с помощью x264 (с нулевой скоростью и сверхбыстрой скоростью) и упакованном в RTSP / RTP с помощью libavformat из ffmpeg 0.6.5. Для тестирования я получаю поток с конвейером GStreamer с gst-launch при подключении к серверу RTSP.HoweverЯ смог воспроизвести ту же проблему при потоковой передаче прямо из другого экземпляра GStreamer с использованием только RTP.

Отправка машины:

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

Приемная машина:

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

Вы также можете запустить их на одной машине, просто измените хост на 127.0.0.1 отправителя. На принимающей стороне вы должны заметить заикание и, как правило, неэффективное видео, а также повторные предупреждения на консоли:

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.

Один из обычно предлагаемых «исправлений» что я видел по всему интернету, это использоватьsync=false с xvimagesink:

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

Затем видео будет воспроизводиться с задержкой, близкой к нулю, даже при тестировании с помощью программного обеспечения нашей камеры. Это полезно для тестирования, но не очень полезно для развертывания, так как не будет работать с Totem, VLC или их встраиваемыми модулями браузера.

Я хотел бы попытаться решить проблему в источнике; Я подозреваю, что какая-то информация о метках времени отсутствует в потоке H.264 в x264 или, возможно, в полезных нагрузках RTP. Есть ли способ изменитьsource GST конвейер, так что я делаюnot нужно использоватьsync=false на ресивере?

Если это невозможно, как я могу сообщить клиентам (через SDP или иным образом), что поток не должен синхронизироваться? В конечном счете, мы внедрили это в браузер, используя своего рода плагин VLC, так что решение, которое работало бы там, было бы еще лучше.

Ответы на вопрос(3)

Ваш ответ на вопрос