Что делает код?
- Сбор живых кадров с IP-камеры, добавление даты и времени в кадр с помощью OpenCV .
- Используя cv2.imshow('preview',frame), мы отображаем прямую трансляцию.
- Теперь тот же кадр(ы) также отправляются на другой RTSP-сервер через порт 8554 с помощью FFMpeg
< ul>
[*]При использовании VLC поток FFMPEG отображается с указанием даты и времени.
Почему я это делаю ?
- Чтобы создать собственный поток RTSP с изменениями по каналу камеры.
Задержка/задержка в потоке на VLC через FFMpeg составляет около 3–4 секунд, поскольку по сравнению с исходным предварительным просмотром с использованием OpenCV imshow.
Ниже приведен код:
Код: Выделить всё
import cv2
import subprocess
import threading
import datetime
rtsp_width = 1280
rtsp_height = 720
#system stream
rtsp_url = "rtsp://ip_address:8554/system/cam_preview"
command = ['ffmpeg',
'-fflags', 'nobuffer',
'-flags', 'low_delay',
'-loglevel' , '0',
'-analyzeduration', '0',
'-re',
'-y',
'-init_hw_device', 'cuda:0',
'-hwaccel', 'cuda',
'-hwaccel_output_format', 'cuda',
'-f', 'rawvideo',
'-vcodec', 'rawvideo',
'-pix_fmt', 'bgr24',
'-s', "{}x{}".format(rtsp_width, rtsp_height),
'-r', "15",
'-an',
'-i', '-',
'-g', '15',
'-c:v', 'h264_nvenc',
'-use_wallclock_as_timestamps', '1',
'-f', 'rtsp',
'-rtsp_transport','tcp',
str(rtsp_url)]
print("MAIN > RTSP URL:", str(rtsp_url))
process = subprocess.Popen(command, stdin=subprocess.PIPE)
#camera rtsp url
path = "rtsp://username:password@ip_address/axis-media/media.amp"
cap = cv2.VideoCapture(path)
def read_frames():
global process
while True:
if cap.grab():
ret, frame = cap.retrieve()
if ret:
date_format = '%Y-%m-%d %H:%M:%S'
today_str = datetime.datetime.now().strftime(date_format)
cv2.rectangle(frame, (445,5), (580,20), (0,0,0), -1)
cv2.putText(frame,today_str,(450,15), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (255, 255, 255), 1 )
process.stdin.write(frame.tobytes())
cv2.imshow('preview',frame)
else:
print("Error grabbing frame")
cap.release()
process.kill()
cv2.destroyAllWindows()
break
if cv2.waitKey(1) & 0xFF == ord('q'):
cap.release()
process.kill()
cv2.destroyAllWindows()
break
thread = threading.Thread(target=lambda: read_frames())
thread.start()
Пакет cv2 скомпилирован с помощью CUDA ARCH 7.5
Ниже приведены некоторые параметры исследования FFMpeg:
Код: Выделить всё
'-fflags', 'nobuffer',
'-flags', 'low_delay',
'-tune', 'zerolatency'
How to reduce this latency?
Источник: https://stackoverflow.com/questions/781 ... tsp-stream