#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. является ли проблема постоянной задержкой независимо от того, как долго выполняется программа, или ваша программа просто слишком медленно считывает кадры, и они начинают вставать в очередь?