如何使用OpenCV(Python)捕获视频流
我想用Python用OpenCV处理mms视频流。 该流来自我无法控制的IP摄像头(流量监视器)。 该流可作为mms或mmst方案使用-如何使用OpenCV(Python)捕获视频流,python,opencv,video,streaming,live-streaming,Python,Opencv,Video,Streaming,Live Streaming,我想用Python用OpenCV处理mms视频流。 该流来自我无法控制的IP摄像头(流量监视器)。 该流可作为mms或mmst方案使用- mms://194.90.203.111/cam2 在VLC和Windows Media Player上播放 mmst://194.90.203.111/cam2 只在VLC上工作。 我曾尝试通过使用FFmpeg和VLC重新流式传输将方案更改为HTTP,但没有成功 据我所知,彩信正在使用Windows Media视频对流进行编码。在URI的末尾添加“.mj
mms://194.90.203.111/cam2
在VLC和Windows Media Player上播放
mmst://194.90.203.111/cam2
只在VLC上工作。
我曾尝试通过使用FFmpeg和VLC重新流式传输将方案更改为HTTP,但没有成功
据我所知,彩信正在使用Windows Media视频对流进行编码。在URI的末尾添加“.mjpeg”没有运气。我还没有找到OpenCV接受的流媒体类型
这是我的密码-
import cv2, platform
#import numpy as np
cam = "mms://194.90.203.111/cam2"
#cam = 0 # Use local webcam.
cap = cv2.VideoCapture(cam)
if not cap:
print("!!! Failed VideoCapture: invalid parameter!")
while(True):
# Capture frame-by-frame
ret, current_frame = cap.read()
if type(current_frame) == type(None):
print("!!! Couldn't read frame!")
break
# Display the resulting frame
cv2.imshow('frame',current_frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# release the capture
cap.release()
cv2.destroyAllWindows()
我错过了什么?OpenCV可以捕获什么类型的视频流?
是否有一个不需要改变方案或转码的优雅解决方案
谢谢
Python版本2.7.8和OpenCV版本2.4.9都是x86。Win7 x64使用FFmpeg和FFserver解决。注意:FFserver仅在Linux上工作。 该解决方案使用的python代码来自 流程如下:
- 使用所需配置启动FFserver后台进程 (在本例中为mjpeg)李>
- FFmpeg输入是mmst流,输出流 到本地主机李>
- 运行python脚本打开localhost流并 逐帧解码
ffserver -d -f /etc/ffserver.conf
在第二个终端上运行FFmpeg
ffmpeg -i mmst://194.90.203.111/cam2 http://localhost:8090/cam2.ffm
Python代码。在这种情况下,代码将打开一个包含视频流的窗口
import cv2, platform
import numpy as np
import urllib
import os
cam2 = "http://localhost:8090/cam2.mjpeg"
stream=urllib.urlopen(cam2)
bytes=''
while True:
# to read mjpeg frame -
bytes+=stream.read(1024)
a = bytes.find('\xff\xd8')
b = bytes.find('\xff\xd9')
if a!=-1 and b!=-1:
jpg = bytes[a:b+2]
bytes= bytes[b+2:]
frame = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8),cv2.CV_LOAD_IMAGE_COLOR)
# we now have frame stored in frame.
cv2.imshow('cam2',frame)
# Press 'q' to quit
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
ffserver.config-
Port 8090
BindAddress 0.0.0.0
MaxClients 10
MaxBandWidth 50000
CustomLog -
#NoDaemon
<Feed cam2.ffm>
File /tmp/cam2.ffm
FileMaxSize 1G
ACL allow 127.0.0.1
ACL allow localhost
</Feed>
<Stream cam2.mjpeg>
Feed cam2.ffm
Format mpjpeg
VideoFrameRate 25
VideoBitRate 10240
VideoBufferSize 20480
VideoSize 320x240
VideoQMin 3
VideoQMax 31
NoAudio
Strict -1
</Stream>
<Stream stat.html>
Format status
# Only allow local people to get the status
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
</Stream>
<Redirect index.html>
URL http://www.ffmpeg.org/
</Redirect>
端口8090
BindAddress 0.0.0.0
MaxClients 10
最大带宽50000
自定义日志-
#诺达蒙
文件/tmp/cam2.ffm
FileMaxSize 1G
ACL允许127.0.0.1
ACL允许本地主机
进给凸轮2.ffm
格式mpjpeg
视频帧率25
视频比特率10240
视频缓冲区大小20480
视频大小320x240
视频质量管理信息3
VideoQMax 31
诺奥迪奥
严格-1
格式状态
#只允许当地人获得身份
ACL允许本地主机
ACL允许192.168.0.0 192.168.255.255
统一资源定位地址http://www.ffmpeg.org/
请注意,这个ffserver.config需要进行更多的微调,但它们工作得相当好,只需稍微冻结一点帧即可生成非常接近源代码的帧。谢谢@Ryan!这个链接有很多好信息。最后的Python部分很成功。我很高兴我找到了这个。谢谢分享!