2014-11-01 30 views
5

Tôi muốn xử lý luồng video mm bằng OpenCV bằng Python. Luồng phát ra từ một camera IP mà tôi không kiểm soát được (màn hình giao thông). Các dòng có sẵn như là mms hoặc chương trình mmst -Cách Ghi Video Stream bằng OpenCV (Python)

mms://194.90.203.111/cam2 

lượt trên cả VLC và Windows Media Player.

mmst://194.90.203.111/cam2 

chỉ hoạt động trên VLC. Tôi đã cố gắng thay đổi lược đồ thành HTTP bằng cách phát lại bằng FFmpeg và VLC nhưng nó không hoạt động.

Theo như tôi hiểu, mms đang sử dụng Windows Media Video để mã hóa luồng. Không may mắn thêm '.mjpeg' vào cuối URI. Tôi chưa tìm thấy các loại streaming được chấp nhận bởi OpenCV.

Dưới đây là mã của tôi -

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

Các tôi thiếu gì? OpenCV có thể thu những loại luồng video nào? Có giải pháp thanh lịch nào không thay đổi hoặc chuyển mã chương trình không?

Cảm ơn!

Python ver 2.7.8, phiên bản OpenCV 2.4.9, Cả hai x86. Win7 x64

+0

Có thể điều này sẽ giúp: http://petrkout.com/electronics/low-latency-0-4-s-video-streaming-from-raspberry-pi-mjpeg-streamer-opencv/ trong phần Khách hàng – Ryan

+0

Cảm ơn @ Ryan! liên kết có rất nhiều thông tin tốt.Phần Python ở cuối đóng đinh nó. – NoamR

Trả lời

5

Giải quyết bằng FFmpeg và FFserver. Lưu ý FFserver chỉ hoạt động trên Linux. Giải pháp sử dụng mã python từ here theo đề xuất của Ryan.

Flow là như sau -

  • quá trình nền Bắt đầu ffserver sử dụng mong muốn cấu hình (mjpeg trong trường hợp này).
  • Đầu vào FFmpeg là luồng mmst, luồng đầu ra vào máy chủ cục bộ.
  • Chạy tập lệnh python để mở luồng địa phương và giải mã khung theo khung.

Run ffserver

ffserver -d -f /etc/ffserver.conf 

Trên một thiết bị đầu cuối thứ hai chạy FFmpeg

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

mã Python. Trong trường hợp này, mã sẽ mở một cửa sổ với luồng video.

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> 

Lưu ý rằng ffserver.config này cần điều chỉnh tốt hơn, nhưng họ làm việc khá tốt và tạo ra một khung rất gần với nguồn chỉ với một đóng băng khung nhỏ.

+0

Tôi rất vui vì tôi thấy điều này. Cảm ơn bạn đã chia sẻ điều này! – sascha

Các vấn đề liên quan