Как я могу открыть поток rtsp с помощью ffplay и передать кадры в opencv?

#python #opencv #ffmpeg #video-streaming #rtsp

#python #opencv #ffmpeg #потоковое видео #rtsp

Вопрос:

Я работаю над проектом CV, транслируемым с IP-камеры. Я случайно обнаружил, что потоковая передача с помощью ffplay быстрее, чем напрямую с opencv. Это связано с тем, что opencv не предоставляет flush() подобную функцию, которая очищает буфер перед извлечением кадра. В этом случае opencv всегда использует первый кадр вместо последнего кадра для использования.

Мне просто интересно, есть ли способ использовать ffplay (или ffmpeg) в качестве серверной части для передачи последнего кадра в opencv.

Сравнивая следующий код, ffplay намного быстрее, чем opencv в потоковой передаче:

 import cv2
import subprocess


# OpenCV lags for ~1s
def cv2rtsp(rtspurl):
    cap = cv2.VideoCapture(rtspurl)
    ret, img = cap.read()

    while True:
        cap.grab()
        ret, img = cap.retrieve()
        if ret:
            cv2.imshow('video output', img)
        if cv2.waitKey(1) == ord('q'):
            raise StopIteration


# FFmpeg lags for ~500ms
def ffmpeg_rtsp(rtspurl):
    command = [
        'ffplay', '-fflags', 'nobuffer', '-flags', 'low_delay', '-framedrop', '-strict', 'experimental', rtspurl
    ]

    subprocess.call(command)


if __name__ == '__main__':
    rtsp = "rtsp://admin:my123456@192.168.0.53:554/h264/ch1/sub/av_stream"
    cv2rtsp(rtspurl=rtsp)
    ffmpeg_rtsp(rtspurl=rtsp)
 

Комментарии:

1. Вы можете попробовать с cv2.VideoCapture(ffmpeg_pipeline, cv2.CAP_FFMPEG)

2. является ли проблема постоянной задержкой независимо от того, как долго выполняется программа, или ваша программа просто слишком медленно считывает кадры, и они начинают вставать в очередь?