Отделить полезную нагрузку RTSP от gst-rtsp-сервера

#gstreamer #vlc #rtsp

#gstreamer #vlc #rtsp

Вопрос:

У меня есть RTSP-источник видео (h265), который я могу отображать с помощью VLC. Я хотел бы разделить поток на два, один с собственным разрешением (в кодировке h265), а другой с новым, более низким разрешением (в кодировке h264). Оба новых потока также должны быть потоками RTSP, доступными для просмотра с помощью VLC.

Из-за соображений пропускной способности я могу подключить только одного клиента к основному источнику.

Пока что у меня есть рабочая настройка gst-rstp-сервера с единственной медиа-фабрикой, на которой выполняется эта строка запуска gst:

местоположение rtspsrc= ! rtph265depay! h265 разбор! имя тройника=t ! очередь! rtph265pay name=pay1 pt=96 т. ! очередь! декодирование завершено ! масштабирование видео! снимайте видео! видео / x-raw, частота кадров = 30/1, ширина = 640, высота = 480 ! битрейт x264enc = 500 предустановленная скорость = сверхбыстрая настройка = нулевая задержка ! h264parse ! rtph264pay name=pay0 pt=96

Я настроил точку монтирования для фабрики мультимедиа и могу подключаться к VLC, например. «rtsp: //127.0.0.1: 8550/test». При этом я могу получать только тот подпоток, который равен pay0 в VLC. Я вижу, что оба подпотока работают, изменив, какой из них является pay0. Но как я могу заставить VLC показывать мой pay1?

В противном случае, как я могу использовать исходный источник видео, а затем две разные фабрики мультимедиа (с разными строками запуска gst …) используют tee в качестве собственного источника?

Ответ №1:

Оба потока отправляются вам одновременно. Обычно в случае pay0 и pay1 будет отправляться видео и аудио. В вашем случае, когда вам нужны 2 отдельных видеопотока, вам нужно будет изменить код.

Простой пример того, чего вы хотите достичь, можно сделать, изменив файл по адресу gst-rtsp-server/examples/test-launch.c

   factory = gst_rtsp_media_factory_new ();
  gst_rtsp_media_factory_set_launch (factory, argv[1]);
  gst_rtsp_media_factory_set_shared (factory, TRUE);
  gst_rtsp_mount_points_add_factory (mounts, "/stream1", factory);

  gst_rtsp_media_factory_set_launch (factory, argv[2]);
  gst_rtsp_media_factory_set_shared (factory, TRUE);
  gst_rtsp_mount_points_add_factory (mounts, "/stream2", factory);
  

Затем начните с ./test-launch "rtspsrc location=... ! rtph265depay ! h265parse ! rtph265pay name=pay1 pt=96" "rtspsrc location=... ! rtph265depay ! h265parse ! decodebin ! videoscale ! videorate ! video/x-raw,framerate=30/1,width=640,height=480 ! x264enc bitrate=500 speed-preset=superfast tune=zerolatency ! h264parse ! rtph264pay name=pay0 pt=96"

Однако тогда у вас на вашей камере было бы 2 потребителя. Если вы предпочитаете использовать только один раз, вам следует настроить поток и сделать его доступным в качестве src для вашего gst_rtsp_media_factory_set_launch конвейера.