Как транслировать экран на удалённый компьютер с помощью gstreamer

Вопрос или проблема

Я хочу транслировать экран моего компьютера и другого с помощью gstreamer и создать RTSP-адрес для использования в OpenCV.

Я попробовал несколько примеров передачи видео с веб-камеры между компьютерами, и это работает правильно:

Команда на удаленном компьютере
gst-launch-1.0 -v v4l2src device=/dev/video1 ! "image/jpeg,width=1280, height=720,framerate=30/1" ! rtpjpegpay ! udpsink host=192.168.1.17 port=5001

Команда на локальном компьютере
gst-launch-1.0 -e -v udpsrc port=5001 ! application/x-rtp, encoding-name=JPEG,payload=26 ! rtpjpegdepay ! jpegdec ! autovideosink

Я видел несколько примеров, которые отображают текущий рабочий стол, но я не знаю, как создать RTSP-адрес из этого, и когда я просто хочу транслировать текущий рабочий стол, я ничего не получаю в другом терминале:

gst-launch-1.0 -v ximagesrc ! video/x-raw,framerate=20/1 ! videoscale ! videoconvert ! x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! rtpmp4vpay  ! udpsink host=192.168.1.17 port=5000


НИЧЕГО НЕ ПОЯВЛЯЕТСЯ В ЭТОМ ТЕРМИНАЛЕ
gst-launch-1.0 -v udpsrc port=5000 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! rtph264depay ! decodebin ! videoconvert ! autovideosink

Вот результат, который я имею в первом терминале:

gst-launch-1.0 -v ximagesrc ! video/x-raw,framerate=20/1 ! videoscale ! videoconvert ! x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! rtph264pay  ! udpsink host=127.0.0.1 port=5000
Définition du pipeline à PAUSED...
Le pipeline est actif et n’a pas besoin de phase PREROLL…
Passage du pipeline à la phase PLAYING…
New clock: GstSystemClock
/GstPipeline:pipeline0/GstXImageSrc:ximagesrc0.GstPad:src: caps = video/x-raw, format=(string)BGRx, width=(int)1920, height=(int)1080, framerate=(fraction)20/1, pixel-aspect-ratio=(fraction)1/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-raw, format=(string)BGRx, width=(int)1920, height=(int)1080, framerate=(fraction)20/1, pixel-aspect-ratio=(fraction)1/1
/GstPipeline:pipeline0/GstVideoScale:videoscale0.GstPad:src: caps = video/x-raw, format=(string)BGRx, width=(int)1920, height=(int)1080, framerate=(fraction)20/1, pixel-aspect-ratio=(fraction)1/1
/GstPipeline:pipeline0/GstVideoConvert:videoconvert0.GstPad:src: caps = video/x-raw, width=(int)1920, height=(int)1080, framerate=(fraction)20/1, format=(string)Y444, pixel-aspect-ratio=(fraction)1/1
Redistribution de latence…
/GstPipeline:pipeline0/GstX264Enc:x264enc0.GstPad:sink: caps = video/x-raw, width=(int)1920, height=(int)1080, framerate=(fraction)20/1, format=(string)Y444, pixel-aspect-ratio=(fraction)1/1
/GstPipeline:pipeline0/GstVideoConvert:videoconvert0.GstPad:sink: caps = video/x-raw, format=(string)BGRx, width=(int)1920, height=(int)1080, framerate=(fraction)20/1, pixel-aspect-ratio=(fraction)1/1
/GstPipeline:pipeline0/GstVideoScale:videoscale0.GstPad:sink: caps = video/x-raw, format=(string)BGRx, width=(int)1920, height=(int)1080, framerate=(fraction)20/1, pixel-aspect-ratio=(fraction)1/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = video/x-raw, format=(string)BGRx, width=(int)1920, height=(int)1080, framerate=(fraction)20/1, pixel-aspect-ratio=(fraction)1/1
/GstPipeline:pipeline0/GstX264Enc:x264enc0.GstPad:src: caps = video/x-h264, codec_data=(buffer)01f40028ffe1001e67f40028919680780227e27016a02020280000030008000003014478c19501000468ef3192, stream-format=(string)avc, alignment=(string)au, level=(string)4, profile=(string)high-4:4:4, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)20/1, interlace-mode=(string)progressive, colorimetry=(string)bt709, chroma-site=(string)mpeg2
/GstPipeline:pipeline0/GstRtpH264Pay:rtph264pay0.GstPad:src: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, packetization-mode=(string)1, profile-level-id=(string)f40028, sprop-parameter-sets=(string)"Z/QAKJGWgHgCJ+JwFqAgICgAAAMACAAAAwFEeMGV\,aO8xkg\=\=", payload=(int)96, ssrc=(uint)1850617788, timestamp-offset=(uint)3214623554, seqnum-offset=(uint)16401, a-framerate=(string)20
/GstPipeline:pipeline0/GstUDPSink:udpsink0.GstPad:sink: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, packetization-mode=(string)1, profile-level-id=(string)f40028, sprop-parameter-sets=(string)"Z/QAKJGWgHgCJ+JwFqAgICgAAAMACAAAAwFEeMGV\,aO8xkg\=\=", payload=(int)96, ssrc=(uint)1850617788, timestamp-offset=(uint)3214623554, seqnum-offset=(uint)16401, a-framerate=(string)20
/GstPipeline:pipeline0/GstRtpH264Pay:rtph264pay0.GstPad:sink: caps = video/x-h264, codec_data=(buffer)01f40028ffe1001e67f40028919680780227e27016a02020280000030008000003014478c19501000468ef3192, stream-format=(string)avc, alignment=(string)au, level=(string)4, profile=(string)high-4:4:4, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)20/1, interlace-mode=(string)progressive, colorimetry=(string)bt709, chroma-site=(string)mpeg2
/GstPipeline:pipeline0/GstRtpH264Pay:rtph264pay0: timestamp = 3214623853
/GstPipeline:pipeline0/GstRtpH264Pay:rtph264pay0: seqnum = 16401

А в терминале приемника:

gst-launch-1.0 -v udpsrc port=5000 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! rtph264depay ! decodebin ! videoconvert ! autovideosink
Définition du pipeline à PAUSED...
Le pipeline est actif et n’a pas besoin de phase PREROLL…
/GstPipeline:pipeline0/GstUDPSrc:udpsrc0.GstPad:src: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96
/GstPipeline:pipeline0/GstRtpH264Depay:rtph264depay0.GstPad:sink: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96
Passage du pipeline à la phase PLAYING…
New clock: GstSystemClock



Вы используете rtpmp4vpay для кодирования, но rtph264depay для приемника. Попробуйте использовать rtph264pay для упаковки в RTP-пакет. Я даже удивлен, что это работает с x624enc, который выдает поток h264…

Попробуйте также удалить decodebin, который здесь, вероятно, не требуется.

Ответ или решение

Если вы хотите транслировать экран вашего компьютера на удаленное устройство с использованием GStreamer и создать RTSP адрес для использования в OpenCV, следуйте инструкции ниже.

Шаги по настройке трансляции экрана с помощью GStreamer:

  1. Настройка источника и кодера на отправляющей стороне:

    Используйте ximagesrc для захвата экрана, и кодек h264 для кодирования видеопотока. Важно правильно настроить RTP-пакетизацию с использованием rtph264pay. Убедитесь, что используете подходящие caps-фильтры для корректного формирования данных. Ваши команды могут выглядеть следующим образом:

    gst-launch-1.0 -v ximagesrc ! video/x-raw,framerate=20/1 ! videoscale ! videoconvert ! x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! rtph264pay ! udpsink host=192.168.1.17 port=5000

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

  2. Настройка приемника:

    На приемной стороне необходимо корректно конфигурировать команду для получения и декодирования видеопотока. Для этого используйте udpsrc и rtph264depay без decodebin, так как последний здесь не нужен.

    gst-launch-1.0 -v udpsrc port=5000 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink

    Здесь важно убедиться, что port совпадает с тем, что используется на стороне отправителя.

  3. Создание RTSP сервера:

    Для интеграции с OpenCV целесообразно использовать RTSP сервер. Один из способов это организовать – использовать GStreamer RTSP server. Однако, настройка RTSP может быть более сложной, чем простая трансляция через UDP как показано выше. Для создания RTSP потока используйте следующие варианты:

    Создайте и сохраните файл с расширением .launch, например, screen-stream.launch, со следующим содержимым:

    <launch>
     <executable name="gst-launch-1.0" system="false" shell="true">
       <argument>-e ximagesrc ! video/x-raw,framerate=20/1 ! videoscale ! videoconvert ! x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! rtph264pay ! udpsink host=127.0.0.1 port=5000</argument>
     </executable>
    </launch>

    Затем, используя gst-rtsp-server, создайте сервер:

    (в отдельном терминале)
    gst-rtsp-launch "( udpsrc port=5000 caps=\"application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96\" ! rtph264depay ! avdec_h264 ! videoconvert ! x264enc ! rtph264pay pt=96 name=pay0 )"
  4. Проверка функциональности:

    Убедитесь, что трансляция работает корректно, проверив поток через VLC или другое приложение, поддерживающее RTSP. Если поток идет нормально, вы можете использовать его в OpenCV как в видеозахват:

    import cv2
    
    cap = cv2.VideoCapture('rtsp://localhost:8554/test')
    while True:
       ret, frame = cap.read()
       if not ret:
           break
       cv2.imshow('RTSP Stream', frame)
       if cv2.waitKey(1) & 0xFF == ord('q'):
           break
    cap.release()
    cv2.destroyAllWindows()

Эти шаги должны помочь вам успешно настроить трансляцию экрана с помощью GStreamer и RTSP для дальнейшего использования в OpenCV. Помните, что вам может потребоваться корректировать код и настройки в зависимости от конкретной конфигурации системы и версии библиотек.

Оцените материал
Добавить комментарий

Капча загружается...