开发者社区> 问答> 正文

摄像头流从Python服务器到Android客户端

我正在尝试发送相机流,这是连接到PC,到Android平板电脑通过插座。在pc服务器上是由python脚本处理的。

import socket
import struct
import json
import cv2
import numpy as np
import base64
import argparse

if __name__ == '__main__':
    arg_parser = argparse.ArgumentParser(conflict_handler="resolve")
    arg_parser.add_argument('-h', '--host', nargs='?', default='localhost', type=str, help="Host address")
    arg_parser.add_argument('-p', '--port', nargs='?', default=8090, type=int, help="Port Number")
    arg_parser.add_argument('-jq', '--jpegq', nargs='?', default=40, type=int, help="JPEG Quality (1-100)")
    args = arg_parser.parse_args()

    HOST = args.host
    PORT = args.port
    JPEG_QUALITY = args.jpegq

    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((HOST, PORT))
        s.listen(1)
        print('Socket now listening...')
        conn, addr = s.accept()
        with conn:
            print('Connected by {}.\nStream is starting...'.format(addr))

            # Initialize Camera
            cam = cv2.VideoCapture(0, cv2.CAP_DSHOW)
            cam.set(3, 640)
            cam.set(4, 480)

            img_counter = 0
            encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), JPEG_QUALITY]
            while True:
                json_data = {}
                _, frame = cam.read()
                _, frame_encoded = cv2.imencode('.jpg', frame, encode_param)
                frame_str = frame_encoded.tostring()

                json_data["image"] = base64.b64encode(frame_str).decode("utf-8")
                json_data["Extra"] = "Extra data to be read"
                json_data_to_send = json.dumps(json_data).encode("utf-8")
                size = len(json_data_to_send)

                print("{}: {}".format(img_counter, size))
                conn.sendall(struct.pack(">L", size) + json_data_to_send)
                img_counter += 1
            cam.release()
            cv2.destroyAllWindows()

python脚本的概要是,我正在创建一个tcp套接字服务器,然后开始捕获帧。我正在转换帧为jpeg格式。 创建一个json对象,其中包括JPEG图像和一些额外的信息,然后发送json对象开始4byte头,其中包括json对象的长度。 这是我的客户端代码。

package com.example.client;

import android.os.AsyncTask;
import android.util.Log;

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Arrays;

public class ClientSocket extends AsyncTask <String, Void, Void> {
    Socket client;
    InputStream in = null;

    @Override
    protected Void doInBackground(String... voids) {
        String ipaddress = voids[0];
        String port = voids[1];
        int port_int = Integer.parseInt(port);
        try
        {
            client = new Socket(ipaddress, port_int);
            if (client.isConnected()) {
                Log.d("StreamConnect", "Connected");
            }

            in = new DataInputStream(client.getInputStream());
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            byte data[];
            byte buffer[] = new byte[4096];
            String data_str;

            baos.write(buffer, 0, in.read(buffer));
            byte result[] = baos.toByteArray();
            int message_length = ((result[0] & 0xff) << 24) | ((result[1] & 0xff) << 16) |
                    ((result[2] & 0xff) << 8) | (result[3] & 0xff); // Reading first 4 bytes to determine message_length
            Log.d("StreamPayloadLen", String.valueOf(message_length));

            // I am lost later from here.
            data = Arrays.copyOfRange(result, 4, result.length);
            data_str = Arrays.toString(data);

        }
        catch(Exception e)
        {
            e.printStackTrace();
            Log.d("SocketError", e.getMessage());
        }
        return null;
    }
}

我能从第一个得到消息长度4字节,然后创建一个数据变量后开始第一个4字节,但我不知道如何阅读其他消息在while循环附加到数据变量然后解析json对象然后再循环第二帧等等。 如果你能帮助我或指导我,我将不胜感激。 问题来源StackOverflow 地址:/questions/59381594/camera-stream-from-python-server-to-android-client

展开
收起
kun坤 2019-12-28 13:44:50 1563 0
1 条回答
写回答
取消 提交回答
  • 不错

    2020-03-29 15:16:25
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载