Guest User

Untitled

a guest
Jan 24th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.03 KB | None | 0 0
  1. #!/usr/bin/env python2
  2. #-*- coding: utf-8 -*-
  3. #
  4. #
  5.  
  6. import pygame
  7. import pygame.camera
  8.  
  9. import os, sys, socket
  10. import struct, base64, StringIO
  11.  
  12. __author__ = '@laszlokuehl'
  13.  
  14. HELP_TEXT = """\n
  15. \tUsage:
  16. \t------
  17. \t* Server:
  18. \t\t$ python2 camera.py -s 0.0.0.0 8000 800x600
  19.  
  20. \t* Client:
  21. \t\t$ python2 camera.py -c 127.0.0.1 8000\n\n"""
  22.  
  23. class __Base:
  24. def send(self, conn, data):
  25. data = base64.b64encode(data)
  26. data = struct.pack('>I', len(data)) + data
  27.  
  28. conn.sendall(data)
  29.  
  30. def __recv(self, conn, buff):
  31. data = ''
  32.  
  33. while len(data) < buff:
  34. packet = conn.recv(buff - len(data))
  35.  
  36. if not packet:
  37. break
  38.  
  39. data += packet
  40.  
  41. return data
  42.  
  43. def recv(self, conn):
  44. data_len = self.__recv(conn, 4)
  45.  
  46. if not data_len:
  47. return None
  48.  
  49. data_len = struct.unpack('>I', data_len)[0]
  50. return base64.b64decode(self.__recv(conn, data_len))
  51.  
  52. class Server(__Base):
  53. def __init__(self, address=('0.0.0.0', 8000), geometry=(800, 600)):
  54. self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  55. self.socket.bind(address)
  56. self.socket.listen(1)
  57.  
  58. self.geometry = geometry
  59.  
  60. def handle_cli(self, conn):
  61. self.surface = pygame.display.set_mode(self.geometry, pygame.RESIZABLE)
  62. pygame.display.set_caption('Raspberry Pi Web Cam')
  63.  
  64. while True:
  65. for event in pygame.event.get():
  66. if event.type == pygame.QUIT:
  67. pygame.quit()
  68. conn.close()
  69. return
  70.  
  71. if event.type == pygame.VIDEORESIZE:
  72. self.geometry = (event.w, event.h)
  73. self.surface = pygame.display.set_mode((event.w, event.h),
  74. pygame.RESIZABLE)
  75.  
  76. img = pygame.image.load(StringIO.StringIO(self.recv(conn)))
  77. img = pygame.transform.scale(img, self.geometry)
  78.  
  79. self.surface.blit(img, (0, 0))
  80. pygame.display.update()
  81.  
  82. def start(self):
  83. while True:
  84. conn, addr = self.socket.accept()
  85. self.handle_cli(conn)
  86.  
  87. class Client(__Base):
  88. def __init__(self, address):
  89. self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  90. self.socket.connect(address)
  91.  
  92. pygame.camera.init()
  93. self.cam = pygame.camera.Camera("/dev/video0", (640, 480))
  94. self.cam.start()
  95.  
  96. def shot(self):
  97. pygame.image.save(self.cam.get_image(), 'image.jpg')
  98. return open('image.jpg', 'rb').read()
  99.  
  100. def start(self):
  101. while True:
  102. self.send(self.socket, self.shot())
  103.  
  104. if __name__ == '__main__':
  105. if len(sys.argv[1:]) == 4 and sys.argv[1] in ['-s', '-server', '--server']:
  106. pygame.init()
  107.  
  108. server = Server((sys.argv[2], int(sys.argv[3])), map(int, sys.argv[4].split('x')))
  109. server.start()
  110.  
  111. elif len(sys.argv[1:]) == 3:
  112. client = Client((sys.argv[2], int(sys.argv[3])))
  113. client.start()
  114. else:
  115. print HELP_TEXT
Add Comment
Please, Sign In to add comment