从Python中的RTSP流读取帧

2024-05-18 05:52:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近安装了一个覆盆子Pi相机,正在RTSP上传输帧。虽然这可能不是完全必要的,但我使用以下命令来广播视频:

raspivid -o - -t 0 -w 1280 -h 800 |cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/output.h264}' :demux=h264

这段视频流得很好。

我现在要做的是用Python解析这个流,并分别读取每个帧。我想做些运动检测来监视。

我完全不知道从哪里开始这项任务。有人能给我指一个好的教程吗?如果这无法通过Python实现,我可以使用什么工具/语言来实现?


Tags: dev命令sdpstream视频覆盆子stdinpi
2条回答

使用opencv

video=cv2.VideoCapture("rtsp url")

然后你就可以抓住弗拉姆斯了。阅读openCV文档访问:https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html

有点老套,但你可以使用VLC python bindings(你可以用pip install python-vlc安装)并播放流:

import vlc
player=vlc.MediaPlayer('rtsp://:8554/output.h264')
player.play()

然后每隔一秒左右拍一张快照:

while 1:
    time.sleep(1)
    player.video_take_snapshot(0, '.snapshot.tmp.png', 0, 0)

然后您可以使用SimpleCV或其他东西进行处理(只需将图像文件'.snapshot.tmp.png'加载到处理库中)。

使用“depu”列出的相同方法对我来说非常有效。 我刚刚用实际相机的“RTSP URL”替换了“视频文件”。 下面的例子适用于AXIS IP摄像机。 (在以前的OpenCV版本中,这一点暂时不起作用) 在OpenCV3.4.1 Windows 10上工作)

import cv2
cap = cv2.VideoCapture("rtsp://root:pass@192.168.0.91:554/axis-media/media.amp")

while(cap.isOpened()):
    ret, frame = cap.read()
    cv2.imshow('frame', frame)
    if cv2.waitKey(20) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

相关问题 更多 >