forked from pageal/Streaming
-
Notifications
You must be signed in to change notification settings - Fork 0
/
02_strm_srv_snd_http5.py
123 lines (102 loc) · 3.71 KB
/
02_strm_srv_snd_http5.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import socket
import time
import sys
import thread
import threading
import signal
import curses
import commands
import re
import SocketServer
import BaseHTTPServer
import os
#sys.path.append('./lib/picamera')
import picamera
import io
import mimetypes
INDEX_PAGE_VLC = \
"""
<!DOCTYPE html>
<html><body>
<h1> The view from our window. </h1>
<h4>
WINDOWS NOTE: To be able to see the stream you need VLC being installed at your PC: 'http://www.videolan.org/vlc/index.html'.
If your browser doesn't show the stream immediately probably approval is needed for VLC plug-in to be activated (try a right click at the plug-in area).
</h4>
<h4>
ANDROID NOTE: You can actually see the stream at port 8080 at your Android devices if you install 'VLC for Android
beta' and use 'Open Network Stream' icom (antenna) at the top-right corner of the application. Give it: http://46.117.246.251:8080. Try few times if it hungs.
</h4>
<OBJECT classid="clsid:9BE31822-FDAD-461B-AD51-BE1D1C159921"
codebase="http://downloads.videolan.org/pub/videolan/vlc/latest/win32/axvlc.cab"
width="640" height="480" id="vlc" events="True">
<param name="Src" value="http://46.117.246.251:8080/" />
<param name="ShowDisplay" value="True" />
<param name="AutoLoop" value="False" />
<param name="AutoPlay" value="True" />
<embed id="vlcEmb" type="application/x-google-vlc-plugin" version="VideoLAN.VLCPlugin.2" autoplay="yes" loop="no" width="640" height="480"
target="http://46.117.246.251:8080/" ></embed>
</OBJECT>
</html></body>
"""
class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
_preview = False
_camera = None
stop_streaming = False
def requestline(self):
return 1
def request_version(self):
return 'HTTP/5.0'
def handle(self):
if not globals().has_key("the_stream_exists"):
globals()["the_stream_exists"] = True
os.system("raspivid -o - -t 0 -n -w 640 -h 480 -fps 20 -vf -hf |cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8080}' :demux=h264 &")
time.sleep(2)
print("!!! streaming started")
print("start streaming on request")
self.send_response(200)
self.send_header("Content-Type", "text/html")
self.send_header("Content-Length", str(len(INDEX_PAGE_VLC)))
self.request.send(INDEX_PAGE_VLC)
self.end_headers()
class NETTYPE:
LAN = 1
WLAN = 2
CELL = 3
class StrmServerHTTP :
_stop_server = False
_main_thread = None
_nettype = NETTYPE.LAN
def GetLocalIP(self):
ifconfig_cmd = commands.getoutput("ifconfig")
patt = re.compile(r'inet\s*\w*\S*:\s*(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})')
addr_list = patt.findall(ifconfig_cmd)
for addr in addr_list:
if addr == "127.0.0.1":
continue
if(self._nettype == NETTYPE.CELL):
if(addr.find("192.168.") == 0):
continue
if(addr.find('.')>0):
return addr
return "127.0.0.1"
def _HTTPThread(self):
IP = self.GetLocalIP()
self._http_srv = BaseHTTPServer.HTTPServer((IP, 8081),HTTPHandler)
self._http_srv.rbufsize = -1
self._http_srv.wbufsize = 100000000
print("http server started at " + IP + ":8081")
while (self._stop_server == False):
try:
self._http_srv.handle_request()
except Exception as e:
pass
print("http server finished")
def Run(self):
self._main_thread = threading.Thread(target=self._HTTPThread)
self._main_thread.start()
def Stop(self):
self._stop_server=True
self._http_srv.socket.close()
srv = StrmServerHTTP()
srv.Run()