Última atividade 1 month ago

Remote GoPro SHutter and File downloader for GoPro Cameras

shutter.py Bruto
1#!/usr/bin/env python
2import urllib
3from urllib import urlencode
4import urllib2
5from time import sleep
6import os
7from subprocess import Popen, PIPE
8import Image
9from cStringIO import StringIO
10import signal
11import sys
12
13framerate = 10
14frame = 0
15framecount = 60000
16global password
17global keep
18
19keep = True
20
21def signal_handler(signal, frame):
22 global keep
23 print('You pressed Ctrl+C!')
24 keep = False
25 sys.exit(0)
26
27def GoProCMD(location, cmd, data):
28 global password
29 url = "http://10.5.5.9/%s/%s?t=%s&p=%s" %(location,cmd,password,data)
30 ret = urllib2.urlopen(url).read()
31 return ret
32
33def GetImageName():
34 data = urllib2.urlopen("http://10.5.5.9:8080/DCIM/").read()
35 data = data.split("\"")
36 folder = None
37 for i in data:
38 if "GOPRO" in i:
39 folder = i.replace("/","")
40 break
41 if folder != None:
42 #print "Found folder %s" %folder
43 data = urllib2.urlopen("http://10.5.5.9:8080/DCIM/%s/" %folder).read()
44 data = data.split("\"")
45 image = None
46 for i in data:
47 if ".JPG" in i:
48 image = i
49 break
50 if image != None:
51 #print "Found Image %s"%image
52 return "http://10.5.5.9:8080/DCIM/%s/%s" %(folder, image), image
53 else:
54 print "NOT FOUND"
55 return None, None
56 else:
57 print "NOT FOUND"
58 return None, None
59
60def GetWifiPassword():
61 return urllib2.urlopen("http://10.5.5.9/bacpac/sd").read().split("\n")[1]
62
63def PhotoMode():
64 return GoProCMD("camera","CM","%01")
65
66def TakePicture():
67 return GoProCMD("bacpac","SH","%01")
68
69def DeleteLast():
70 return GoProCMD("camera","DL","")
71
72def DeleteAll():
73 return GoProCMD("camera","DA","")
74
75def WBAuto():
76 return GoProCMD("camera","WB", "%00")
77
78def WBRAW():
79 return GoProCMD("camera","WB", "%04")
80
81def Picture5MP():
82 return GoProCMD("camera","PR","%03")
83
84def Picture7MP():
85 return GoProCMD("camera","PR","%04")
86
87def Picture10MP():
88 return GoProCMD("camera","PR","%08")
89
90password = GetWifiPassword()
91print "WiFi Password: %s" %password
92print "Deleting all"
93DeleteAll()
94sleep(2)
95ret = PhotoMode()
96print "Photo Mode: %s" %ret
97print "Setting to RAW"
98WBRAW()
99
100print "Setting to 7MP (Wide)"
101Picture7MP()
102
103print "Opening FFMPEG"
104#p = Popen(['ffmpeg', '-y', '-f', 'image2pipe', '-vcodec', 'mjpeg', '-r', '%s'%framerate, '-i', '-', '-vcodec', 'libx264', '-pix_fmt', 'yuvj420p', '-r', '%s'%framerate, 'video.mp4'], stdin=PIPE)
105p = Popen(['ffmpeg', '-y', '-f', 'image2pipe', '-vcodec', 'mjpeg', '-r', '%s'%framerate, '-i', '-', '-vcodec', 'libvpx', '-qmin' , '0' , '-qmax' , '5' , '-crf', '4', '-pix_fmt', 'yuv420p', '-r', '%s'%framerate, 'video.webm'], stdin=PIPE)
106
107#p = Popen(['ffmpeg', '-y', '-f', 'image2pipe', '-vcodec', 'mjpeg', '-i', '-', '-vcodec', 'libx264', '-s', 'hd720', '-pix_fmt', 'yuv420p', '-f','flv', 'rtmp://localhost/live/gopro'], stdin=PIPE)
108
109signal.signal(signal.SIGINT, signal_handler)
110while frame != framecount:
111 global keep
112 print "Taking a picture %s" %frame
113 try:
114 ret = TakePicture()
115 sleep(2)
116 url, name = GetImageName()
117 except:
118 print "Connection Error"
119 name = None
120 if name == None:
121 print "MISSING FRAME"
122 else:
123 print "Downloading Image: %s" %url
124 try:
125 data = urllib2.urlopen(url,timeout=3)
126 size = int(data.headers["Content-Length"])
127 data = data.read()
128 if len(data) == size:
129 p.stdin.write(data)
130 f = open("pics/%s"%name,"w")
131 f.write(data)
132 f.close()
133 else:
134 print "Bad frame!"
135 except:
136 print "Error receiving frame"
137 print "Deleting"
138 try:
139 DeleteLast()
140 sleep(2)
141 except:
142 print "Connection Error"
143 frame += 1
144 if not keep:
145 print "Got Signal to exit"
146 break
147
148os.killpg(p.pid, signal.SIGTERM)