我正在尝试发送相机流,这是连接到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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。