Что я пробовал
- VideoCapture OpenCV:
- Производительность была низкой, даже с CAP_PROP_FFMPEG.
- FFmpeg с MJPEG:< /p>
- Декодировал поток как MJPEG и создал маты OpenCV из буфера JPEG image2pipe.
- Результат ниже Загрузка ЦП для OpenCV, но выше для FFmpeg.
- Текущий подход:< /p>
- Вывод необработанного видео в формате YUV420p из FFmpeg.
- Создание матов OpenCV из каждого буфера кадра.
- Достигает низкую загрузку ЦП FFmpeg и умеренно высокую загрузку ЦП OpenCV.
Код: Выделить всё
import subprocess
import cv2
import numpy as np
def stream_rtsp(rtsp_url):
# FFmpeg command to stream RTSP and output to pipe
ffmpeg_command = [
'ffmpeg',
'-hwaccel', 'auto',
'-i', rtsp_url,
'-pix_fmt', 'yuv420p', # Use YUV420p format
'-vcodec', 'rawvideo',
'-an', # Disable audio
'-sn', # Disable subtitles
'-f', 'rawvideo',
'-' # Output to pipe
]
# Start FFmpeg process
process = subprocess.Popen(ffmpeg_command, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
# Frame dimensions
width, height = 2560, 1440
frame_size = width * height * 3 // 2 # YUV420p uses 1.5 bytes per pixel
while True:
# Read raw video frame from FFmpeg output
raw_frame = process.stdout.read(frame_size)
if not raw_frame:
break
yuv = np.frombuffer(raw_frame, np.uint8).reshape((height * 3 // 2, width))
frame = cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR_I420)
processFrame(frame)
# Clean up
process.terminate()
cv2.destroyAllWindows()
Есть ли другие способы повысить производительность при обработке кадров высокого разрешения из RTSP-потока?
Подробнее здесь: https://stackoverflow.com/questions/790 ... from-ffmpe