Потоковая передача камеры с Python на C # через сокеты?

#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. @Филдор, Ты прав. Мне очень жаль. Я отредактировал сообщение, показывающее, что я пытался. Спасибо!