Конфигурирование gstreamer rtspsrc для передачи аудио / видео h264 на сервер rtsp - PullRequest
0 голосов
/ 26 октября 2019

Я пытался использовать rtspsrc для подключения к потокам видеокамеры в реальном времени в одном конвейере и прохода через конвейер сервера rtsp при подключении клиентов к конвейеру сервера rtsp.

Цель состоит в возможности разделенияаудио / видео поток, когда различные клиентские программы просмотра подключаются в разное время без необходимости декодировать / перекодировать поток.

У меня был некоторый успех, но проблемы усугубляются, когда в миксе есть звук. Конвейер похож на этот для видео:

  • живой поток с камеры

rtspsrc -> gsth264depay -> h264parse -> appsink

  • rtspсервер

(appsrc -> h264parse -> rtph264pay pt = 96 name = pay0 config-interval = 1)

Я использовал источник из примеров gstreamer для подключения обратных вызовов appsinkдля сигнала «new-sample» для пересылки сэмплов в appsrc, когда клиент подключается к конвейеру rtsp-сервера.

Он более или менее работает с видео, хотя есть разные секунды задержки, прежде чем видео начинает отображаться на клиентских зрителях.

Теперь, когда я пытаюсь добавить аудио, задержки усугубляются, или даже клиент не синхронизируется и не начинает потоковую передачу после нескольких секунд попытки, и клиентское соединение закрывается.

Вот как конвейеры выглядят со звуком:

  • живой поток с камеры:

rtspsrc location = name = задержка rtsps00 = 100 rtsps00. ! application / x-rtp, media = video! rtph264depay! h264parse! appsink name = appsink00 emit-signal = true drop = true rtsps00. ! очередь ! application / x-rtp, media = audio! rtpmp4gdepay! audio / mpeg, mpegversion = 4, stream-format = raw! имя appsink = appsinkaudio00 emit-signal = true drop = true

  • rtsp сервер

(appsrc name = appsrc00 is-live = true max-latency = 150 max-bytes= 256000! Video / x-h264! H264parse! Rtph264pay pt = 96 name = pay0 config-interval = 1 имя appsrc = appsrcaudio00 is-live = true max-latency = 150! Audio / mpeg! Rtpmp4gpay pt = 96 name = pay1)

Аудиоформат в потоке mp4a-latm, сгенерированный устройством Android (вместе с видеопотоком), и я также использовал aacparse после rtpmp4gdepay и до rtpmp4gpay, а также rtpmp4adepay & rtpmp4apay. Я также настроил устройство Android для отправки I-кадров каждую секунду (30 кадров при 30 кадрах в секунду), а также sps / pps.

Когда клиент подключается, включается обработчик обратного вызова «достаточно данных»сторона приложения для видео, которая вызывается через несколько секунд после начала потоковой передачи, и буферизованные кадры продолжают расти. Если потоковая передача начинается через несколько секунд (обычно более 20 секунд), буферизованные видеокадры перестают расти, но не теряют, что имеет смысл. Конечно, также существует соответствующая задержка воспроизведения на основе буферизованных кадров.

Я подозреваю, что где-то важные метаданные в потоке становятся засоренными.

Есть какие-нибудь мысли или предложения? Ценю любые комментарии. - Даг

...