Как я могу получить байтовые данные, используя TCPSocket? - PullRequest
0 голосов
/ 09 ноября 2019

Я хочу использовать tcpsocket для отправки изображений nv21 между смартфоном и сервером и преобразования их в rgb. Я использую Qt для Android, создаю приложение для смартфона и использую python на сервере. Когда я использую QByteArray для отправки данных, изображение (1920 * 1080), поэтому размер данных составляет 3110400. Однако я получаю только 335620 байт на сервере. Я хочу знать, как правильно отправлять байпы?

//QT client
void came::processFrame(const QVideoFrame& frame)
{
    QVideoFrame f(frame);
    QImage img;
    f.map(QAbstractVideoBuffer::ReadOnly);
    output.append((char*)f.bits(),f.mappedBytes());
    tcpSocket->write(output,output.size());
}

//Python server
def recvfromTcpSocket(sock, blockSize=4096, accept_addr=None):
    ''' a function to lisen TCP socket,
    and rece bytes till buffer has no more. '''
    d = ''
    while True:
        print ("Got tcp connection: " + str(tcpServerAddr))
        if accept_addr is None:
            break
        elif accept_addr == tcpServerAddr[0]:
            break
        else :
            sock.close()
            continue
    while True:
        block = sock.recv(blockSize)
        d += block
        if len(block) < blockSize and len(block)!=0:
            print ("TCP recv done, all size: " + str(len(d)))
            break
    return d

if __name__ == '__main__':
    data = recvfromTcpSocket(tcpServerSocket)
    bin_y = data[0:rows * cols]
    num_y = np.fromstring(bin_y, np.uint8)
    img_y = np.reshape(num_y, (rows, cols))
    bin_u = data[rows * cols::2]
    num_u = np.fromstring(bin_u, np.uint8)
    img_u = np.reshape(num_u, (rows / 2, cols / 2))
    bin_v = data[rows * cols+1::2]
    num_v = np.fromstring(bin_v, np.uint8)
    img_v = np.reshape(num_v, (rows / 2, cols / 2))
    enlarge_u = cv2.resize(img_u, dsize=(cols, rows), interpolation=cv2.INTER_CUBIC)
    enlarge_v = cv2.resize(img_v, dsize=(cols, rows), interpolation=cv2.INTER_CUBIC)
    dst = cv2.merge([img_y, enlarge_u, enlarge_v])
    bgr = cv2.cvtColor(dst, cv2.COLOR_YUV2BGR)
...