2014-11-01 38 views
5

Chcę przetworzyć strumień wideo w formacie mms za pomocą OpenCV za pomocą języka Python. Strumień pochodzi z kamery IP, nad którą nie mam kontroli (monitor ruchu). Strumień jest dostępny jako MMS lub MMST systemów -Jak przechwytywać strumień wideo za pomocą OpenCV (Python)

mms://194.90.203.111/cam2 

gra na obu VLC i Windows Media Player.

mmst://194.90.203.111/cam2 

działa tylko na VLC. Próbowałem zmienić schemat na HTTP przez ponowne przesłanie strumieniowe za pomocą FFmpeg i VLC, ale nie działało.

O ile rozumiem, mms używa Windows Media Video do kodowania strumienia. Nie ma szczęścia dodając ".mjpeg" na końcu URI. Nie znalazłem jeszcze tego, jakie typy transmisji są akceptowane przez OpenCV.

Oto mój kod -

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() 

Czego mi brakuje? Jakie rodzaje strumieni wideo mogą przechwytywać OpenCV? Czy istnieje eleganckie rozwiązanie bez zmiany schematu lub transkodowania?

Dzięki!

Python ver 2.7.8, OpenCV w wersji 2.4.9, Oba x86. Win7 x64

+0

Może to pomoże: http://petrkout.com/electronics/low-latency-0-4-s-video-streaming-from-raspberry-pi-mjpeg-streamer-opencv/ w sekcji klienta – Ryan

+0

Dzięki @Ryan! link miał dużo dobrych informacji.Część Pythona na końcu przybił ją. – NoamR

Odpowiedz

5

Rozwiązany przy użyciu FFmpeg i FFserver. Uwaga FFserver działa tylko w systemie Linux. Rozwiązanie wykorzystuje kod Pythona z here zgodnie z sugestią Ryan.

przepływu jest następujący -

  • start FFserver proces tła przy pożądanej konfiguracji (MJPEG w tym przypadku).
  • Wejście FFmpeg to strumień milst, strumień wyjściowy do localhost.
  • Uruchom skrypt Pythona, aby otworzyć strumień localhost i dekodować klatka po klatce.

Run FFserver

ffserver -d -f /etc/ffserver.conf 

Na drugim terminalu uruchomić FFmpeg

ffmpeg -i mmst://194.90.203.111/cam2 http://localhost:8090/cam2.ffm 

kodu Pythona. W takim przypadku kod otworzy okno ze strumieniem wideo.

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> 

Zauważ, że ten ffserver.config potrzebuje bardziej precyzyjne dostrojenie, ale one działają dość dobrze i stworzyć ramkę bardzo blisko Source tylko trochę stopklatki.

+0

Cieszę się, że znalazłem to. Dzięki za udostępnienie tego! – sascha