2016-10-19 2 views
0

Я хотел бы отправлять и получать видеоролики через UDP или TCP с помощью Gstreamer на Jetson TX1.Отправитель и получатель Gstreamer через UDP/TCP на 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 

UPDATE: Это, кажется, хорошо, но, по-прежнему черные кадры на приемнике.

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: event not found») Также есть способ захватить каждый видеокадр (изображение) с помощью скрипта python? В конечном счете, я хотел бы захватить каждый фрейм в формате jpeg или png, используя скрипт python. Я могу проверить, может ли получатель получать данные от отправителя (видео 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 для кодирования пакетов в полезную нагрузку, пригодную для udpstreaming. Поскольку 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 

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

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, только стандартное видео/х-сырец. Если вы

gst-inspect-1.0 nvoverlaysink 

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

Также смотрите ответ .. Stream H.264 video over rtp using 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, как указано выше, подключиться к приложениям, а затем отправлять сообщения и данные в каждом буфере (обычно это кадр). Можно настроить Gstreamer для разделения и захвата любого потока в отдельные jpeg (или что-то еще) с помощью приложения (строка 28 примера) и отправки сообщений в конвейере Gstreamer с сообщением для каждого кадра, передаваемого по DBUS (bus_signal_watch), который затем может изолировать фреймы и передавать их. Эта версия требует многопоточности, чтобы хорошо работать, как показано, с двумя отдельными потоками, один для цикла Gstreamer и один для цикла Gobject.

Смежные вопросы