-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathraspivid-udp-viewer.py
executable file
·115 lines (93 loc) · 3.33 KB
/
raspivid-udp-viewer.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
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
https://github.com/clxjaguar/raspivid-udp-viewer/
https://gitlab.com/cLxJaguar/raspivid-udp-viewer/
This viewer (a UDP server listening by default on port 1234) was made because
all other means for streaming video of a remote raspberry pi camera are very
laggy and complicated. Transmitting a video stream by UDP packets is supported
natively by raspivid, and if the video stream is encoded as MJPEG, it's easy
to process, and quite realtime.
Once this program is running, try executing this on your raspberry:
$ raspivid --nopreview --flush --bitrate 5000000 --framerate 40 --exposure auto -t 0 --codec MJPEG -w 640 -h 480 -v -o udp://YOUR_PC_IP:1234
"""
import sys, socket, time
# sudo apt-get install python3-pyqt5
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class ServerWorker(QObject):
newFrame = pyqtSignal()
def __init__(self, port=1234):
QObject.__init__(self)
self.port = port
self.serverThread = QThread()
self.serverThread.setObjectName("UDP Server Thread")
self.moveToThread(self.serverThread)
self.serverThread.started.connect(self.run)
self.serverThread.start()
def run(self):
self.exitLoop = False
bufferSize = 100000
receive_socket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
receive_socket.bind(('', self.port))
frameCounter=0; frameCounterSaved = 0; nextFrameCounterTime = time.time()+1
img=b''; i = 0; lastSize = 0
while not self.exitLoop:
msg, addr = receive_socket.recvfrom(bufferSize)
if msg[0:7] == b'\xff\xd8\xff\xdb\x00\x84\x00':
frameCounter+=1;
if time.time() >= nextFrameCounterTime:
nextFrameCounterTime+=1
frameCounterSaved, frameCounter = frameCounter, 0
img=b''
img+=msg
if len(msg) < lastSize:
print("%s %06d %2d %d" % (addr[0], i, frameCounterSaved, len(img)))
self.img = img
img=b''
self.newFrame.emit()
i+=1
lastSize=len(msg)
def stop(self):
self.exitLoop = True
class PiVideoWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.isMousePressed = False
self.initUI()
self.serverWorker = ServerWorker()
self.serverWorker.newFrame.connect(self.imageRefresh)
def mousePressEvent(self, event):
if self.childAt(event.pos()) == self.painterWidget:
self.cursorStartPos = QCursor().pos()
self.windowStartPos = self.pos()
self.isMousePressed = True
def mouseMoveEvent(self, event):
if(self.isMousePressed):
deltaPos = QCursor().pos() - self.cursorStartPos
self.move(self.windowStartPos + deltaPos)
def mouseReleaseEvent(self, event):
self.isMousePressed = False
def initUI(self):
self.canvas = QPixmap(560, 320)
self.painterWidget = QLabel()
self.painterWidget.setStyleSheet("color: white; background: black;")
self.painterWidget.setPixmap(self.canvas)
self.setCentralWidget(self.painterWidget)
self.setWindowTitle(u"Close-to-Realtime Raspivid UDP Viewer/Server")
self.show()
self.painterWidget.setAlignment(Qt.AlignCenter)
self.painterWidget.setText("Awaiting UDP streaming from Raspberry Pi")
def imageRefresh(self):
data = self.serverWorker.img
self.canvas.loadFromData(data)
self.painterWidget.setPixmap(self.canvas)
self.adjustSize()
def main():
app = QApplication(sys.argv)
win = PiVideoWindow()
ret = app.exec_()
sys.exit(ret)
if __name__ == '__main__':
main()