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