2

I need to send images or image descriptors from a client (smartphone) to a server (processing machine). The server tries to recognize the images/features in a video stream and sends back the IDs of the detected ones + maybe some additional data. Normally the recognition process does not last more than several seconds (considering a big number of images to be recognized). Ideally the processing server responds within milliseconds.

The images to be detected are sent in the "setup phase" (no problem if there's a big delay) and then the sampled video frames, where the recognition process is performed on, are being sent with a specific frequency, let's say 5 frames/second. (of course the frequency is variable)

What is the best communication protocol for implementing this? The code is going to be written in C/C++ but I'm more interested in how to workflow (the concept) would look like rather than code implementation.

Is HTTP sufficient for this? How about RTSP or maybe something else? Please keep in mind that the data goes from a smartphone (where the internet connection is not exceptional) to a processing machine (server, fast internet connection).

Thank you!

Edit: Thanks for your answers. Actually I was looking for a comparison between the existing communication protocols that can implement my specific need. As I said, I'm not interested in the complexity of the code that would implement the "connection". I would have liked to see some advantages/disadvantages between them, relative to my use case. On the other hand, the server performing the recognition has to be compliant with the communication protocol (+API) implemented by the application running on the smartphone, nothing more. That means I don't care how the server does it's job as long as it is able to understand client requests and return an answer that can be understood by the application making the request.

Something that I forgot to mention (my bad) is that I'm interested in ALL the communication protocols that are providing support for implementing this use-case.

4

2 回答 2

1

RTSP(实时流协议)不是您所需要的,因为它的设计理念非常不同。基本上,您需要的是一个允许您上传文件(或其中的一部分)的协议。

您可以使用 TCP 之类的低级协议,它允许您以任何方式流式传输您想要的任何内容,或者,您可以使用更高级别的协议(例如 HTTP),因为该协议包括分块传输编码机制(一种旨在让您将块(文件的片段)一个接一个地发送到上传服务器)。

在这两种情况下,您都可以将图像和视频上传到服务器。HTTP 更容易,因为它是一个简单的协议,您可以找到很多代码示例来上传文件,实际上,例如,当您将文件上传到 youtube 时,您使用的是 HTTP(在这种情况下没有分块)。无论如何,我建议您使用分块传输编码机制,因为它允许您恢复上传(在暂停或互联网断开后)。

使用 HTTP(通过 TCP)的另一个很好的理由是服务器端代码会更容易,因为所有网络服务器都可以帮助您专注于真正的问题,消除不需要的细节。

因此,HTTP 非常适合您的要求,但是您应该考虑到没有协议具有内置的节流方式。这意味着如果您想发送 5 帧/秒,您将需要编写代码来控制它。

但是,如果需要更高的控制,可以直接使用 TCP。

使用 TCP (这是伪代码)

socket = new Socket(SERVER_IP, PORT, TCP_PROTOCOL);
nextFrame = 0;
while(videoManager.IsThereFrame(nextFrame)){
   buffer = videoManager.ReadFrameAsByteArray(nextFrame++);
   if(AmISendingTooFast) waitForAWhile()

   socket.Write(buffer);
   if(error) repeat or save the nextFrame to try again later.
}
socket.Close();

结论

HTTP 非常适合您的需求,请使用它。如果您的要求更复杂,并且您希望获得额外的完全控制权,请使用 TCP,但请记住这会更难,并且您将没有网络服务器来帮助您。

我希望这可以帮助你。

于 2014-04-28T05:29:34.207 回答
0

你可能想考虑 Websockets,因为你使用的是 C++,我强烈推荐Websocketpp用于服务器端实现。Websocketpp 有一个直观的面向对象的界面,可以让您在收到数据时处理每个事件,并且可以处理大量并发客户端。它也被编写为允许多线程。在我的特殊情况下,我在 Websocketpp 之上编写了一个实时的多线程视频游戏服务器,所以我确信它可以工作。Websocketpp 建立在 Boost 库之上,在我看来,它之所以大放异彩,是因为它的 API 编写良好且易于使用。该库带有出色的示例代码,开发人员积极维护他的项目。通过使用成熟的 websockets 实现,您将不会进行任何会消耗 CPU 的轮询。您将能够在客户端和服务器端异步处理内容。

要使用 Websocketpp 服务器,您需要为常见事件注册一些回调处理程序。

  • 每当新客户端首次连接到服务器时,都会调用 on_open()。
  • on_close() 在客户端终止其连接时被调用。
  • 每当连接的客户端向服务器发送数据时,都会调用 on_message()。

因为为这些函数注册处理程序很容易,所以您真的不必担心协议,您可以只专注于特定于应用程序的逻辑。

为了回答您更新的问题,HTTP 不太适合流式传输,但已被广泛使用,因为过去没有好的替代方案。如果您研究 AJAX 的东西,您会发现 HTTP 与“长轮询”技术一起使用。也许您会发现这篇文章非常有用: 在什么情况下,AJAX 长/短轮询优于 HTML5 WebSockets?

我相信公认的答案非常好,您应该只参考那个答案,这样我就不必重复为什么我认为您应该选择 Websockets 的优点。

于 2014-04-29T23:08:23.853 回答