如何将 jpeg 帧从 java 客户端流式传输到 python 服务器

Posted

技术标签:

【中文标题】如何将 jpeg 帧从 java 客户端流式传输到 python 服务器【英文标题】:how to stream jpeg frame from java client to python server 【发布时间】:2012-05-12 04:07:35 【问题描述】:

我正在开发一个 android 应用程序,其中我必须发送一个 jpeg 格式的帧,分配给一个 BufferedArrayOutputStream(代码中的 baos 变量)。我将此 baos 转换为字节数组以写入套接字。 在服务器端,我想以 jpeg 格式重建图像。如果我将变量中接收到的数据写入服务器上的“.jpg”文件,在打开文件时,会出现“以 ffx0 不是 jpeg 格式开头的文件”之类的错误。我认为这是因为 python 中的字符串变量将文件中的数据作为十六进制字符串写入。 客户端代码如下:-

Bitmap memoryImage = Bitmap.createBitmap(rgb, previewSize.width,previewSize.height,Bitmap.Config.ARGB_8888);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if(memoryImage.compress(CompressFormat.JPEG,100, baos))
    try 
        if(count==0)
            byte [] Finalbaos = baos.toByteArray();
            int tempLen = Finalbaos.length;
            Log.v("Client","ImageBytes :"+ tempLen);
            String dataMeta = Integer.toString(tempLen);
            Log.v("Client","Integer Size :"+ dataMeta.length());
            PrintWriter tempOut = new PrintWriter(socket.getOutputStream());
            if(tempOut!=null)
                tempOut.write(dataMeta);
                Log.v("Client","data size sent");
                tempOut.flush();
            

            DataInputStream in = new DataInputStream(socket.getInputStream());
            if(in!=null)
                Log.v("Client","read buffer created");
                String xyz = in.readLine();
                String temp = "recvd";
                Log.v("Client",xyz);
                if(xyz.equals(temp))
                    OutputStream out = socket.getOutputStream();
                    out.write(Finalbaos,0,tempLen);
                    out.flush();
                    Log.d("Client", "Client sent message");
                
            

服务器代码:

import socket,thread
import string
import array
host=""
port=54321
s=socket.socket()
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind((host,port))
s.listen(5)
conn,address=s.accept()
data=""
mylen=0
dataRecv=0
file1 = open("myfile.jpg","w")
totalLength=""
length=conn.recv(1024)
conn.send("recvd")
mylen=int(length)

while dataRecv<mylen:
    newData=""
    newData=conn.recv(1)
    if not newData:
        break
    data+=newData
    dataRecv+=len(newData)

result= array.array('B',data.decode("hex"))
file1.write(result)
file1.close()
print len(data)
conn.close()
s.close()

谁能告诉我如何在 python 或 C++ 中重建服务器上的框架

【问题讨论】:

【参考方案1】: mylen=len(length) 不会为您提供您尝试发送的长度。它会告诉您在之前的recv 中读取了多少字节。所以你弄错了长度。 在您的客户端,您使用String xyz = in.readLine();,它将阻塞直到遇到换行符。但是您永远不会在服务器端发送'\n',而是等待客户端的响应。所以你有一个僵局。 您在收到的数据上使用data.decode("hex")。除非你在另一边的java中做data.encode("hex")的等价物,否则那是行不通的。如果字符串不是二进制字符串的有效十六进制表示,它应该会给你一个错误。 result 是一个 array.array,您将其写入文件。 file1.write 需要一个字符串作为参数,如果你传递你的 result 对象,它会给你一个错误。

所以我什至看不出你的代码为什么能工作,为什么你的文件里有任何东西。

【讨论】:

mylen=len(length) 对我来说是一个愚蠢的错误。我已经对其进行了编辑,它应该是 int(length)。在发送帧的数据之前,我正在发送服务器应该接收的帧的大小。 感谢 mata 指出 readline() 中的错误。我期待它会自动检测行/字符串的结尾。另外,我还错误地认为 python 字符串将数据写入为“十六进制”编码。 - 我删除了 encode() 函数并将 '\n' 添加到服务器发送的 'recvd' 字符串中,我能够在我的服务器上获取帧 :) 非常感谢!任何想知道代码的人,请告诉我。 @geekoraul 你还有代码吗?

以上是关于如何将 jpeg 帧从 java 客户端流式传输到 python 服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何从 servlet 将文本响应流式传输到 jsp?

如何使用 WebRTC 将视频流式传输到 RTMP?

如何将视频数据流式传输到视频元素?

将数据帧从 python 传输到 julia

如何将视频从我的应用程序流式传输到网络?

如何将 JSON 数组从 NodeJS 流式传输到 postgres