Проблемы с потоковой передачей RTP / RTSP-потока из OpenCV-Python - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь использовать этот пример скрипта, который я нашел здесь, чтобы взять изображения OpenCV и преобразовать их в поток rtp / rtsp:
https://github.com/madams1337/python-opencv-gstreamer-examples/blob/master/gst_device_to_rtp.py

Где это описание скрипта:

"gst_device_to_rtp захватывает VideoCapture (0), кодирует кадр и передает его в rtp: // localhost: 5000"

Это код, который я пытаюсь использовать

# Cam properties
fps = 30.
frame_width = 1920
frame_height = 1080
# Create capture

#cap = cv2.VideoCapture(0)

# Set camera properties
cap.set(cv2.CAP_PROP_FRAME_WIDTH, frame_width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, frame_height)
cap.set(cv2.CAP_PROP_FPS, fps)

# Define the gstreamer sink
gst_str_rtp = "appsrc ! videoconvert ! x264enc noise-reduction=10000 tune=zerolatency byte-stream=true threads=4 " \
              " ! h264parse ! mpegtsmux ! rtpmp2tpay ! udpsink host=127.0.0.1 port=5000"

# Create videowriter as a SHM sink
out = cv2.VideoWriter(gst_str_rtp, 0, fps, (frame_width, frame_height), True)

# Loop it
while True:
    # Get the frame
    ret, frame = cap.read()

    # Check
    if ret is True:
        # Flip frame
        frame = cv2.flip(frame, 1)
        # Write to SHM
        out.write(frame)
    else:
        print "Camera error."
        time.sleep(10)

cap.release()

В основном это код, который указывает конфигурацию конвейера gstreamer:

# Define the gstreamer sink
gst_str_rtp = "appsrc ! videoconvert ! x264enc noise-reduction=10000 tune=zerolatency byte-stream=true threads=4 " \
              " ! h264parse ! mpegtsmux ! rtpmp2tpay ! udpsink host=127.0.0.1 port=5000"

# Create videowriter as a SHM sink
out = cv2.VideoWriter(gst_str_rtp, 0, fps, (frame_width, frame_height), True)

Насколько я понимаю, это отправка видеоизображений OpenCV на "rtp: // localhost: 5000"

Однако всякий раз, когда я пытаюсь выполнить эту команду терминала в терминале, когда я оставляю скрипт работающим:

ffplay 'rtp://localhost:5000'

Он просто навсегда висит так: enter image description here И я не могу определить, что это значит на самом деле. Означает ли это, что он может подключиться к локальному узлу в этом порту, но там ничего не нашел? Я действительно не знаю. Команда работает, если есть другая с другими URL-адресами rtsp, но не с этой.

И если я попробую "ffplay 'rtsp: // localhost: 5000'", то я просто получаю ошибку Отказ в соединении (возможно, в этом потоке ничего не генерируется)

Действительно ли скрипт выводит поток rtp на localhost: 5000? Или есть проблемы с моим ffplay на моей машине? Или я должен выполнить специальную команду ffplay? Что мне делать?

...