Um Videodaten zu streamen, haben wir zunächst ein Programm erstellt, das einfache numerische Daten senden und empfangen kann!
Zuerst habe ich einen Streaming-Server mit TCP erstellt, aber es schien nicht möglich zu sein, mit mehreren Clients gleichzeitig mit TCP zu kommunizieren. Deshalb habe ich mich für UDP entschieden, ein zustandsloses Protokoll!
connection.ini
[server]
ip = 127.0.0.1
port = 1935
[packet]
# [bytes]
header_size = 4
# [pixels]
image_width = 256
image_height = 256
server.py
import socket
import configparser
import logging
logging.basicConfig(level=logging.DEBUG)
config = configparser.ConfigParser()
config.read('./connection.ini', 'UTF-8')
# Connection Settings
SERVER_IP = config.get('server', 'ip')
SERVER_PORT = int(config.get('server', 'port'))
# Image Settings
IMAGE_WIDTH = int(config.get('packet', 'image_width'))
IMAGE_HEIGHT = int(config.get('packet', 'image_height'))
IMAGE_SIZE = IMAGE_WIDTH * IMAGE_HEIGHT // 2
logging.info(" IMAGE SIZE: " + str(IMAGE_SIZE))
if __name__ == '__main__':
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.bind((SERVER_IP, SERVER_PORT))
logging.info(" Binding port on: " + SERVER_IP + ":" + str(SERVER_PORT))
while True:
data, addr = s.recvfrom(IMAGE_SIZE)
print(addr, int.from_bytes(data, 'big'))
stream.py
import socket
import configparser
import logging
import time
logging.basicConfig(level=logging.DEBUG)
config = configparser.ConfigParser()
config.read('./connection.ini', 'UTF-8')
# Connection Settings
SERVER_IP = config.get('server', 'ip')
SERVER_PORT = int(config.get('server', 'port'))
# Image Settings
IMAGE_WIDTH = int(config.get('packet', 'image_width'))
IMAGE_HEIGHT = int(config.get('packet', 'image_height'))
IMAGE_SIZE = IMAGE_WIDTH * IMAGE_HEIGHT // 2
logging.info(" IMAGE SIZE: " + str(IMAGE_SIZE))
if __name__ == '__main__':
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
i = 0
while True:
s.sendto(i.to_bytes(IMAGE_SIZE, 'big'), (SERVER_IP, SERVER_PORT))
logging.info(" Sent: " + str(i))
time.sleep(1)
i = i + 1
Es liest die Adresse und den Port aus der Konfigurationsdatei und sendet weiterhin den immer inkrementierten Wert von "i" von "stream.py" an "server.py".
'socket.SOCK_DGRAM' gibt an, dass eine UDP-Kommunikation durchgeführt wird. recvfrom ()
gibt die empfangenen Daten und das Tupel der Datenquelle zurück, mit denen die Informationen im Terminal angezeigt werden.
Versuchen Sie es mit einem server.py
und zwei stream.py
.
INFO:root: IMAGE SIZE: 32768
INFO:root: Binding port on: 127.0.0.1:1935
('127.0.0.1', 55382) 0
('127.0.0.1', 55382) 1
('127.0.0.1', 55382) 2
('127.0.0.1', 55382) 3
('127.0.0.1', 55382) 4
('127.0.0.1', 55382) 5
('127.0.0.1', 55382) 6
('127.0.0.1', 55382) 7
('127.0.0.1', 55382) 8
('127.0.0.1', 59979) 0
('127.0.0.1', 55382) 9
('127.0.0.1', 59979) 1
('127.0.0.1', 55382) 10
('127.0.0.1', 59979) 2
('127.0.0.1', 55382) 11
('127.0.0.1', 59979) 3
('127.0.0.1', 55382) 12
('127.0.0.1', 59979) 4
('127.0.0.1', 55382) 13
('127.0.0.1', 59979) 5
('127.0.0.1', 55382) 14
('127.0.0.1', 59979) 6
('127.0.0.1', 55382) 15
('127.0.0.1', 59979) 7
('127.0.0.1', 55382) 16
('127.0.0.1', 59979) 8
('127.0.0.1', 55382) 17
('127.0.0.1', 59979) 9
('127.0.0.1', 55382) 18
('127.0.0.1', 59979) 10
('127.0.0.1', 55382) 19
('127.0.0.1', 59979) 11
Daten werden von jeder der beiden Adressen gesendet!
Recommended Posts