Pythonを使用してOpenCVでmmsビデオストリームを処理したい。ストリームは、私が制御できないIPカメラ(トラフィックモニター)から来ています。ストリームはmmsまたはmmstスキームとして利用できます-
mms://194.90.203.111/cam2
vLCとWindowsMediaPlayerの両方で再生されます。
mmst://194.90.203.111/cam2
vLCでのみ動作します。 FFmpegとVLCで再ストリーミングしてスキームをHTTPに変更しようとしましたが、機能しませんでした。
私の知る限り、mmsはWindows MediaVideoを使用してストリームをエンコードしています。 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 ver 2.7.8、OpenCVのver 2.4.9、両方ともx86。 Win7 x64
FFmpegとFFserverを使用して解決しました。注FFserverはLinuxでのみ機能します。解決策は、python here からのコード Ryan の推奨)を使用します。
流れは以下の通りです-
FFserverを実行します
ffserver -d -f /etc/ffserver.conf
2番目の端末で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>
このffserver.configはさらに微調整が必要ですが、かなりうまく機能し、ほんの少しのフレームのフリーズでソースに非常に近いフレームを生成します。