ich versuche mich gerade über einen Videostreamer via UDP, der mir aktuell folgenden Fehler ausgibt:
ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host
Ich konnte dazu leider keine hilfreiche Lösung finden und verstehe nicht genau, weshalb dieser Fehler passiert. Mein Server empfängt genau ein Videoframe, danach ist schluss. Die Übertragung ist also unvollständig. Wie immer bin ich für Hinweise super dankbar.:
Client Code:
Code: Alles auswählen
import socket, sys, logging, os
from PyQt5 import QtWidgets, uic
import cv2
import numpy as np
import pickle
import struct
class ClientVideoParser(QtWidgets.QDialog):
""" load widgets from configuration.ui """
def __init__(self, parent=None):
super().__init__(parent)
self.ui = uic.loadUi('client_video_parser.ui', self)
self.ui.setWindowTitle('Client')
self.writeInFile()
self.ui.load.clicked.connect(self.clicked_load)
def clicked_load(self):
videopath = self.videopath.text()
self.newest(videopath)
def newest(self, path):
""" get the latest video file in videopath """
files = os.listdir(path)
paths = [os.path.join(path, basename) for basename in files]
erg = max(paths, key=os.path.getctime)
logging.info("file found: "+erg)
self.videostreamer(erg)
def videostreamer(self, erg):
""" convert filename into cv2 videoobject and streaming via UDP """
try:
cap = cv2.VideoCapture(erg)
logging.info("Video object successfully created:" + erg)
logging.shutdown()
except Exception as e:
logging.error("Could not convert file into video: " + erg)
logging.shutdown()
try:
ip_adress = self.ui.ip_adress.text()
port = int(self.ui.port.text())
clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
clientsocket.connect((ip_adress,port))
except Exception as e:
logging.error("Creating sockets failed")
logging.shutdown()
while cap.isOpened():
try:
ret, frame = cap.read()
# Serialize frame
data = pickle.dumps(frame)
# Send message length first
message_size = struct.pack("L", len(data)) ### CHANGED
# Then data
clientsocket.sendall(message_size + data)
except Exception as e:
logging.error("streaming video failed")
logging.shutdown()
def writeInFile(self):
logging.basicConfig(
filename= "client_video_parser.log",
level= logging.DEBUG,
style= "{",
format= "{asctime} [{levelname:8}] {message}",
datefmt="%d.%m.%Y %H:%M:%S")
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
mainframe = ClientVideoParser()
mainframe.show()
sys.exit(app.exec_())
Code: Alles auswählen
import socket, sys, logging, os
from PyQt5 import QtWidgets, uic
import cv2
import numpy as np
import pickle
import struct
class ClientVideoParser(QtWidgets.QDialog):
""" load widgets from configuration.ui """
def __init__(self, parent=None):
super().__init__(parent)
self.ui = uic.loadUi('server_video_parser.ui', self)
self.ui.setWindowTitle('Server')
self.ui.open.clicked.connect(self.clicked_open)
self.writeInFile()
def clicked_open(self):
HOST = self.ui.ip_adress.text()
PORT = int(self.ui.port.text())
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
logging.info("socket created")
s.bind((HOST, PORT))
logging.info("socket binded")
s.listen(10)
logging.info("socket is listening")
conn, addr = s.accept()
data = b''
payload_size = struct.calcsize("L")
while True:
# Retrieve message size
while len(data) < payload_size:
data += conn.recv(4096)
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack("L", packed_msg_size)[0]
# Retrieve all data based on message size
while len(data) < msg_size:
data += conn.recv(4096)
frame_data = data[:msg_size]
data = data[msg_size:]
# Extract frame
frame = pickle.loads(frame_data)
# Display
cv2.imshow('frame', frame)
cv2.waitKey(1)
print("got frame", frame.shape)
# Save as file
try:
(grabbed, frame) = frame.read()
fshape = frame.shape
fheight = fshape[0]
fwidth = fshape[1]
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (fwidth,fheight))
logging.info("Saved file. Height: "+fheight +" width: " + fwidth)
logging.shutdown()
except Exception as e:
logging.error("saving file not successfull")
logging.shutdown()
except Exception as e:
logging.error("Exception while establish connection occurs")
logging.shutdown()
def writeInFile(self):
logging.basicConfig(
filename= "server_video_parser.log",
level= logging.DEBUG,
style= "{",
format= "{asctime} [{levelname:8}] {message}",
datefmt="%d.%m.%Y %H:%M:%S")
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
mainframe = ClientVideoParser()
mainframe.show()
sys.exit(app.exec_())