我正在尝试将预先录制的 RTSP 提要从基于海康威视的 DVR 流式传输到我的媒体服务器,以对其进行一些后期处理。令人沮丧的是,我无法轻松访问物理设备,因为它存储在花园另一端的车库中,只能通过 Web API 和 wifi 扩展器访问。
我可以使用 OpenCV 为我的相机使用 RTSP 源实时播放录制的文件 - 使用以下代码段可以完美地工作:
import cv2
cam_at_time = "rtsp://username:password@192.168.1.241:554/Streaming/tracks/101/?starttime=20220114T120000Z&endtime=20220114T120010Z"
cap = cv2.VideoCapture(cam_at_time)
# Tried this, but no joy
# cap.set(cv2.CAP_PROP_FPS, 120)
while True:
ret, img = cap.read()
if ret == True:
cv2.imshow('video output', img)
k = cv2.waitKey(2)& 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
真的,虽然我想录制比实时快几倍。
这里的限制因素似乎不是 wifi 连接或这边的解码(我可以一次流式传输多个提要而不会丢帧),而是流仅在源处实时播放。
我得出的结论是这可能是不可能的,因为 RTSP 代表“实时流协议”,直到我在Hikvision API 文档第 122 页找到了一个特殊的例子:
Play in 4× Speed:
PLAY rtsp://10.17.133.46:554/ISAPI/streaming/tracks/101? starttime=20170313T230652Z&endtime=20170314T025706Z RTSP/1.0 CSeq:8
Authorization: Digest username="admin",
realm="4419b66d2485", nonce="a0ecd9b1586ff9461f02f910035d0486", uri="rtsp://10.17.133.46:554/ISAPI/streaming/tracks/101? starttime=20170313T230652Z&endtime=20170314T025706Z", response="fb986d385a7d839052ec4f0b2b70c631" Session:2049381566;timeout=60
Scale:4.000
User-Agent:NKPlayer-1.00.00.081112
请注意Scale:4.000
似乎与 PLAY 请求一起发送的参数。
我还在标准文档中找到了一些确凿的证据:
NPT 在 DSM-CC 中定义为:“直观地说,NPT 是
观众与节目相关联的时钟。它通常以数字方式显示在
VCR 上。NPT 在正常播放模式(比例 = 1)下正常前进,
前进速度更快正向快速扫描时的速率(高正比例
),反向扫描时减少(高负
比例),并在暂停模式下固定。NPT(逻辑上)等同于
SMPTE 时间码。
这似乎表明更快的播放是可能的。我不明白的是,我将如何Scale
使用任何使用 Python 流式传输 RTSP 的典型方法(VLC 的 OpenCV)来发送该参数。谁能让我知道如何实现这一目标?或者我是否有其他方法可以做到这一点?
我尝试过的事情: