Потоковая передача с веб-камеры с GStreamer (RTSP)

У меня камера Kodak PIXPRO SP360 4k подключена к Jetson Nano или TX2 через USB. кабель.

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

Сейчас я пытаюсь запустить базовую настройку.

./test-launch "nvarguscamerasrc ! video/x-raw(memory:NVMM), format=NV12, width=1920, height=1080, framerate=30/1 ! nvvidconv ! video/x-raw, width=640, height=480, format=NV12, framerate=30/1 ! omxh265enc ! rtph265pay name=pay0 pt=96 config-interval=1"

а также

gst-launch-1.0 rtspsrc location=rtsp://127.0.0.1:8554/test ! queue ! decodebin ! videoconvert ! xvimagesink

и я получаю сообщение об ошибке

Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Progress: (open) Opening Stream
Progress: (connect) Connecting to rtsp://127.0.0.1:8554/test
Progress: (open) Retrieving server options
Progress: (open) Retrieving media info
ERROR: from element /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0: Could not get/set settings from/on resource.
Additional debug info:
gstrtspsrc.c(6999): gst_rtspsrc_setup_streams_start (): /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0:
SDP contains no streams
ERROR: pipeline doesn't want to preroll.
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
(test-launch:22440): GLib-GObject-WARNING **: 11:36:46.018: invalid cast from 'GstRtpH265Pay' to 'GstBin'

(test-launch:22440): GStreamer-CRITICAL **: 11:36:46.018: gst_bin_get_by_name: assertion 'GST_IS_BIN (bin)' failed

(test-launch:22440): GLib-GObject-WARNING **: 11:36:46.018: invalid cast from 'GstRtpH265Pay' to 'GstBin'

(test-launch:22440): GStreamer-CRITICAL **: 11:36:46.018: gst_bin_get_by_name: assertion 'GST_IS_BIN (bin)' failed

(test-launch:22440): GLib-GObject-WARNING **: 11:36:46.018: invalid cast from 'GstRtpH265Pay' to 'GstBin'

(test-launch:22440): GStreamer-CRITICAL **: 11:36:46.018: gst_bin_get_by_name: assertion 'GST_IS_BIN (bin)' failed

Я также попробовал вариант, который работал у меня на ПК, но я не могу заставить его работать на Jetson. Настройка происходит следующим образом.

Загрузите Streameye с https://github.com/ccrisan/streameye и запустите:

netcat -l 8700 | ./streameye -p 1337

Чтобы отправить поток с веб-камеры, я запускаю:

gst-launch-1.0 v4l2src device=/dev/video0 ! decodebin ! videoconvert ! videoscale ! videorate ! jpegenc quality=30 ! tcpclientsink host=127.0.0.1 port=8700

После этого получаю:

Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Internal data stream error.
Additional debug info:
gstbasesrc.c(3064): gst_base_src_loop (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
streaming stopped, reason not-negotiated (-4)
Execution ended after 0:00:03.944998186
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...

Вывод этой команды для моей камеры:

v4l2-ctl -d /dev/video1 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
    Index       : 0
    Type        : Video Capture
    Pixel Format: 'MJPG' (compressed)
    Name        : Motion-JPEG
        Size: Discrete 3840x2160
            Interval: Discrete 0.200s (5.000 fps)
        Size: Discrete 2880x2880
            Interval: Discrete 0.200s (5.000 fps)
        Size: Discrete 2048x2048
            Interval: Discrete 0.200s (5.000 fps)
        Size: Discrete 1440x1440
            Interval: Discrete 0.067s (15.000 fps)
            Interval: Discrete 0.200s (5.000 fps)
        Size: Discrete 1920x1080
            Interval: Discrete 0.067s (15.000 fps)
            Interval: Discrete 0.200s (5.000 fps)
        Size: Discrete 1280x720
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.067s (15.000 fps)
            Interval: Discrete 0.200s (5.000 fps)
        Size: Discrete 640x360
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.067s (15.000 fps)
            Interval: Discrete 0.200s (5.000 fps)

person Milos Milunovic    schedule 27.11.2019    source источник


Ответы (2)


запустите свой канал с -v вот так и покажите мне результат:

gst-launch-1.0 v4l2src device=/dev/video0 ! decodebin ! videoconvert ! videoscale ! videorate ! jpegenc quality=30 ! tcpclientsink host=127.0.0.1 port=8700 -v
person Babak Abgh    schedule 29.11.2019
comment
`` Установка конвейера на ПРИОСТАНОВЛЕНИЕ ... Конвейер активен и не требует PREROLL ... ОШИБКА: from element / GstPipeline: pipeline0 / GstV4l2Src: v4l2src0: Внутренняя ошибка потока данных. Дополнительная отладочная информация: gstbasesrc.c (3055): gst_base_src_loop (): / GstPipeline: pipeline0 / GstV4l2Src: v4l2src0: потоковая передача остановлена, причина не согласована (-4) ОШИБКА: конвейер не хочет выполнять предварительную прокрутку. Установка конвейера в состояние ПАУЗА ... Установка состояния конвейера в состояние ГОТОВ ... Установка состояния конвейера в состояние NULL ... Освобождение конвейера ... '' - person Milos Milunovic; 29.11.2019
comment
Запустите с -v: add -v конец вашего конвейера, затем запустите его. - person Babak Abgh; 29.11.2019
comment
В конце есть -v, и он возвращает это. Мне удалось запустить его с помощью streameye, но он говорит, что jpeg слишком большой. Я использовал этот конвейер $ gst-launch-1.0 v4l2src device = / dev / video1 io-mode = 2! изображение / JPEG, ширина = 1280, высота = 720, частота кадров = 30/1! nvjpegdec! видео / x-raw! xvimagesink Также я понял, что это решение не сработает для меня, поэтому мне нужно использовать gst-rtsp-server. - person Milos Milunovic; 29.11.2019
comment
если вы хотите отправить rtp, вы можете использовать это: gst-launch-1.0 v4l2src device = / dev / video0! rtpmjpegpay! udpsink порт = 2000 хост = 127.0.0.1. ваш src (v4l2src производит jpeg, вам не нужно конвертировать в jpeg) - person Babak Abgh; 29.11.2019
comment
У меня видео 4k, 3840x2160. Когда я пытаюсь запустить, сначала получаю: no element rtmpjpegpay. Когда я удаляю эту часть, я получаю: ПРЕДУПРЕЖДЕНИЕ: from element / GstPipeline: pipeline0 / GstUDPSink: udpsink0: Попытка отправить UDP-пакеты больше максимального размера (1554753 ›65507). Дополнительная отладочная информация: gstmultiudpsink.c (722): gst_multiudpsink_send_messages () : / GstPipeline: pipeline0 / GstUDPSink: udpsink0: Причина: ошибка отправки сообщения: слишком длинное сообщение - person Milos Milunovic; 02.12.2019
comment
извините, gst-launch-1.0 v4l2src device = / dev / video0! rtpjpegpay! udpsink порт = 2000 хост = 127.0.0.1 - person Babak Abgh; 02.12.2019

Если вы хотите транслировать его, самым простым способом будет использование gst-rtsp-launch, который является частью предварительно собранных двоичных файлов GStreamer:

gst-rtsp-launch '( v4l2src device=/dev/video0 ! videoconvert ! queue ! x264enc tune="zerolatency" byte-stream=true bitrate=10000 ! rtph264pay name=pay0 pt=96 )'

Позже вы можете настроить кодек, битрейт, но для меня этого достаточно (воспроизводится в VLC - rtsp: //127.0.0.1: 8554 / test)

person bialy    schedule 30.11.2019