【发布时间】:2017-09-02 08:14:19
【问题描述】:
我的问题:
如何正确地将图像从 ios swift 客户端应用程序转换并发送到 java 服务器?(不使用大量外部 sdk)
在 swift 中使用哪种类型的套接字(我是 swift 新手,真的找不到任何合适的套接字)?
请给我一个示例代码,因为我完全不熟悉 swift 语法和库。
我的程序的预期结果 - ios swift 应用程序应该有效地连接到我的 java 服务器并将视频帧的图像实时发送到它。然后图像应在 Java 服务器计算机上转换为 bufferedImage 并作为视频播放!
关于之前提出的问题 - 我只发现了一个类似的问题,但答案不是很丰富。
详情
所以,我在我的 mac 上编写了一个 Java 服务器程序,我想添加一个功能,用户应该能够从他的 iPhone(ios 设备)将实时视频源发送到我的 Java 服务器程序。
ios 应用是在 xcode 上用 swift 编写的。
-
为了做到这一点,我从 swift 程序中的视频帧中捕获 CGImage 并将其转换为 UIImage ;然后我将此 UIImage 转换为 byte[] 数据,如下所示:-
let cgImage:CGImage = context.createCGImage(cameraImage, from: cameraImage.extent)! //cameraImage is grabbed from video frame image = UIImage.init(cgImage: cgImage) let data = UIImageJPEGRepresentation(image, 1.0) -
然后使用 SwiftSocket/TCPClient (https://github.com/swiftsocket/SwiftSocket) 将此字节 [] 数据发送到运行我的 Java 服务器的 IP 地址和端口
client?.send(data: data!) -
这里的客户端是一个 TCPClient 类型的对象,它在 swift xcode 中声明如下:(https://github.com/swiftsocket/SwiftSocket/blob/master/Sources/TCPClient.swift)
client = TCPClient(address: host, port: Int32(port)) client?.connect(timeout: 10) -
连接成功,Java 服务器程序生成一个 MobileServer 线程来处理这个客户端。 DataInput 和 OutputStreams 使用 ServerSocket 打开。这是 Java 服务器生成的 MobileServer 线程的 run() 方法(其中“in”是从 ServerSocket 派生的 DataInputStream)
public void run() { try{ while(!stop) { int count=-1; count = in.available(); if(count>0) System.out.println("LENGTH="+count); byte[] arr=new byte[count]; System.out.println("byte="+arr); in.read(arr); BufferedImage image=null; try{ InputStream inn = new ByteArrayInputStream(arr); image = ImageIO.read(inn); inn.close(); }catch(Exception f){ f.printStackTrace();} System.out.println("IMaGE="+image); if(image!=null) appendToFile(image); } }catch(Exception l){ l.printStackTrace(); } } 问题是我的 Java 服务器正在接收一些奇怪的字节序列,这些字节序列可能无法正确转换为 BufferedImage,因此在查看存储在文件中的“视频”时,我只能看到一条“图像”,而iPhone 捕捉良好。(基本上图像没有从 ios 应用程序正确传输到我的服务器!)
整个 Swift 程序的 viewController.swift 用于视频捕获都来自这个 github 项目 (https://github.com/FlexMonkey/LiveCameraFiltering)
编辑 - 我已经找出问题并将其发布为答案,但这仍然只是一种解决方法,因为服务器视频源仍然挂起很多,我不得不降低发送的图像字节数据的质量由迅速的客户。肯定有更好的做事方式,我要求人们分享他们的知识。
【问题讨论】:
标签: java swift video-streaming client-server uiimagejpegrepresentation