Отправитель и получатель Gstreamer через UDP/TCP на Jetson TX1

Я хотел бы отправлять и получать видеокадры через UDP или TCP, используя Gstreamer на Jetson TX1.

Похоже, я могу отправить видеокадры, как показано ниже.

Отправитель:

gst-launch-1.0 nvcamerasrc ! 'video/x-raw(memory:NVMM), width=(int)1024, height=(int)720, format=(string)I420, framerate=(fraction)30/1' !  nvvidconv flip-method=2 ! udpsink host=<BCast IP addr> auto-multicast=true port=8089

Получатель:

gst-launch-1.0 -v udpsrc port=8089 ! ... ! nvoverlaysink -e

ОБНОВЛЕНИЕ: Это казалось нормальным, но все еще черные рамки на приемнике.

 gst-launch-1.0 -v udpsrc port=8089 ! capsfilter caps='video/x-raw(memory:NVMM),width=244,height=244, format=I420, framerate=20/1' ! nvoverlaysink -e

Я не знаю, какие фильтры нужно добавить на стороне "Приемника". (Я попытался "videoparse", но получил ошибку: "videoparse: событие не найдено") Кроме того, есть ли способ захвата каждого видеокадра (изображения) с помощью сценария Python? В конечном счете, я хотел бы захватить каждый кадр в формате jpeg или png, используя скрипт python. Я могу проверить, может ли получатель получать данные от отправителя (video src), но все же есть проблемы, упомянутые выше.

import socket
import sys
import time

HOST = ''   # Symbolic name meaning all available interfaces
PORT = 8089 # Arbitrary non-privileged port

# Datagram (udp) socket
try :
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    print 'Socket created'
except socket.error, msg :
    print 'Failed to create socket. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
    sys.exit()


# Bind socket to local host and port
try:
    s.bind((HOST, PORT))
except socket.error , msg:
    print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
    sys.exit()

numFrames = 0
while 1:
    # receive data from client (data, addr)
    d = s.recvfrom(4096)
    data = d[0]
    addr = d[1]

    if not data:
        break

    reply = 'OK...' + data

    s.sendto(reply , addr)
    print 'Message[' + addr[0] + ':' + str(addr[1]) + '] - ' + data.strip()

1 ответ

Чтобы ответить на первый вопрос, вам нужно включить еще один элемент gstreamer rtpvrawpay для кодирования пакетов в полезную нагрузку, подходящую для потоковой передачи данных. Так как rtpvrawpay не принимает видео nvidia, измените прописные буквы, чтобы nvvidconv преобразовал его в обычное видео /x-raw.

gst-launch-1.0 -e nvcamerasrc ! 'video/x-raw(memory:NVMM), width=(int)1024, height=(int)720, format=(string)I420, framerate=(fraction)30/1' !  nvvidconv flip-method=2 ! 'video/x-raw, width=(int)1024, height=(int)720, format=(string)I420, framerate=(fraction)30/1' ! rtpvrawpay ! udpsink host=<BCast IP addr> auto-multicast=true port=8089

Это должно дать вам действительный поток. Для погашения полезной нагрузки попробуйте:

 gst-launch-1.0 -v udpsrc port=8089 ! rtpvrawdepay ! capsfilter caps='video/x-raw,width=244,height=244, format=I420, framerate=20/1' ! nvoverlaysink -e

Обратите внимание, что мы НЕ принимаем формат NVMM, просто стандартное видео /x-raw. Если вы делаете

 gst-inspect-1.0 nvoverlaysink 

вы увидите, что он принимает NVMM или стандартное видео x-raw.

Также посмотрите этот ответ. Потоковое видео H.264 через rtp с помощью gstreamer и конвейеров ridgerun: https://developer.ridgerun.com/wiki/index.php?title=Gstreamer_pipelines_for_Tegra_X1

Примечание. Я добавил -e к вашим конвейерам Gstreamer, если вы запускаете их из командной строки, иначе Ctrl-C не закроет поток должным образом. Ваш второй вопрос - главное упражнение. https://github.com/markw63/pythongst/blob/master/README.md- это пример кода, который выполняет эту работу с помощью appsink. Этот код получает видео и аудио с камеры, но может легко получить код из udpsrc, как описано выше, подключиться к appink и затем отправить сообщения и данные в каждый буфер (обычно кадр). Можно настроить Gstreamer для разделения и захвата любого потока в отдельные JPEG-файлы (или чего-либо другого) с помощью appsink (строка 28 примера) и размещения элементов сообщений в конвейере Gstreamer, с сообщением для каждого кадра, передаваемого в DBUS (bus_signal_watch), который может затем изолировать кадры и передать их. Эта версия требует многопоточности, чтобы работать хорошо, как показано, с двумя отдельными потоками, один для цикла Gstreamer и один для цикла Gobject.

Другие вопросы по тегам