#python #c# #sockets #unity3d #raspberry-pi
#python #c# #сокеты #unity3d #raspberry-pi
Вопрос:
Мне нужно транслировать видео с камеры Raspberry Pi (сервер Python) на клиент C # script (фактически, Unity).
Я успешно сделал это, используя рабочий процесс с Python на Python, но мне не удается заставить его работать на стороне клиента C #.
Это мой сервер Python, куда я отправляю поток через сокеты:
Server.py:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('0.0.0.0', 24000))
s.listen(1)
connection = s.accept()[0].makefile('wb')
print ('Client connected')
while True:
stream = io.BytesIO()
for foo in camera.capture_continuous(stream, 'jpeg'):
connection.write(struct.pack('<L', stream.tell()))
connection.flush()
stream.seek(0)
connection.write(stream.read())
stream.seek(0)
stream.truncate()
И это моя клиентская часть Python, которая действительно работает:
Client.py:
def threadLoop(self):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((self.ip, self.port))
connection = self.socket.makefile('rb')
print('Recibiendo fotos')
while not self.haltSignal():
image_len, image_width, image_height = struct.unpack('<LLL', connection.read(struct.calcsize('<LLL')))
print ("L: " str(image_len) " W: " str(image_width) " H: " str(image_height))
if not image_len:
break
image_stream = io.BytesIO()
image_stream.write(connection.read(image_len))
image_stream.seek(0)
self.callback(image_stream.getvalue(), image_width, image_height)
self.socket.close()
self.socket = None
self.thread = None
Итак, вопрос в том… имея это Server.py как я могу создать клиент C #, который получает поток и показывает изображения?
Я попытался записать полученные данные на C # через сокет, сохранить их в массиве байтов и преобразовать в читаемое изображение, которое иногда, когда это (очень) маленькое изображение, работает нормально. Я думаю, должен быть лучший способ добиться этого.
Спасибо!
Редактировать: это то, что я пробовал в C #. Еще раз спасибо!
public int Connect()
{
if (_clientSocket.Connected == false)
{
_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
mutexToSend = new Mutex();
mutexReceived = new Mutex();
ThreadStart ts = new ThreadStart(SendReceiveData);
threadSend = new Thread(ts);
threadSend.Start();
return 1;
}
else
return 0; //There is a socket already connected.
}
//———————————————————-
private void SendReceiveData()
{
try
{
_clientSocket.SendTimeout = 1000;
_clientSocket.ReceiveTimeout = 1000;
System.Net.IPAddress ipaddress = this.serverIP;
_clientSocket.Connect(new IPEndPoint(ipaddress, this.serverPort));
}
catch (SocketException ex)
{
//turn ex.Message;
}
_clientSocket.BeginReceive(_recieveBuffer, 0, _recieveBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
}
//———————————————————-
private void ReceiveCallback(IAsyncResult AR)
{
//Check how much bytes are recieved and call EndRecieve to finalize handshake
int recieved = _clientSocket.EndReceive(AR);
if (recieved <= 0)
{
GestorCamaraSala.imgReceived = _recieveBuffer; //I copy the received data to the image texture
return;
}
//Start receiving again
_clientSocket.BeginReceive(_recieveBuffer, 0, _recieveBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
}// end ReceivedCallback
Комментарии:
1. Мы не можем видеть, что вы сделали в C #. Так что невозможно сказать, где вы пошли не так. Похоже, это поток MJPEG, так что это не должно быть слишком безумным. Покажи нам, что у тебя есть.
2. @Филдор, Ты прав. Мне очень жаль. Я отредактировал сообщение, показывающее, что я пытался. Спасибо!