Source code for vi3o.netcam

"""
:mod:`vi3o.netcam` --- Live camera handling
===========================================
"""

import base64
import sys
import os

if sys.version_info > (3,):
    from io import BytesIO as StringIO
else:
    from cStringIO import StringIO

import requests
from requests.auth import HTTPBasicAuth, HTTPDigestAuth

from vi3o.image import imread
from vi3o.utils import Frame


[docs] class AxisCam(object): """ Loads an mjpg stream directly from an Axis camera with hostname *ip* with the resolution *width*x*height* using the *username* and *password* as credntials. If *no_proxy* is True, the proxy settings from the environment will be ignored and any other keyword parameter will be passed on to the camera as a VAPIX parameter. """ def __init__(self, ip, width=None, height=None, username=None, password=None, no_proxy=False, **kwargs): if no_proxy: os.environ['NO_PROXY'] = ip os.environ['no_proxy'] = ip mjpg_url = 'http://' + ip + '/mjpg/video.mjpg' if width is not None: mjpg_url += '?resolution=%dx%d' % (width, height) for k, v in kwargs.items(): mjpg_url += '&%s=%s' % (k, v) r = requests.get(mjpg_url, auth=HTTPDigestAuth(username, password), stream=True) r.raise_for_status() self._fd = r.raw self.fcnt = 0 def __iter__(self): return self def __next__(self): return self.next() def next(self): headers = {} while True: l = self._fd.readline() if not l: raise StopIteration if not l.strip() and headers: break if b':' in l: i = l.index(b':') headers[l[:i]] = l[i+1:].strip() data = self._fd.read(int(headers[b'Content-Length'])) img = imread(StringIO(data)).view(Frame) img.index = self.fcnt self.fcnt += 1 img.timestamp = img.systime = -1 # FIXME return img
if __name__ == '__main__': from vi3o import view for img in AxisCam("192.168.0.90", username="root", password="pass", no_proxy=True): view(img)