Afin de diffuser des données vidéo, nous avons d'abord créé un programme capable d'envoyer et de recevoir des données numériques simples!
Au début, j'ai créé un serveur de streaming avec TCP, mais il semblait qu'il ne serait pas possible de communiquer avec plusieurs clients en même temps avec TCP, alors j'ai décidé de le faire avec UDP, qui est un protocole sans état!
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
Il lit l'adresse et le port dans le fichier de configuration et continue d'envoyer la valeur ʻi toujours incrémentée de
stream.pyvers "server.py". «socket.SOCK_DGRAM» indique que la communication UDP est effectuée.
recvfrom ()` retourne les données reçues et le tuple de la source de données, qui est utilisé pour afficher les informations dans le terminal.
Essayez de l'exécuter avec un server.py
et deux 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
Des données sont envoyées depuis chacune des deux adresses!
Recommended Posts