我需要从客户端(智能手机)向服务器(处理机器)发送图像或图像描述符。服务器尝试识别视频流中的图像/特征,并发回检测到的ID的ID +可能是一些附加数据。通常,识别过程不会持续超过几秒钟(考虑到要识别的大量图像)。理想情况下,处理服务器会在几毫秒内响应。
要检测的图像在"设置阶段" (没有问题,如果有很大的延迟),然后执行识别过程的采样视频帧以特定频率发送,比如5帧/秒。 (当然频率是可变的)
实施此功能的最佳通信协议是什么?代码将用C / C ++编写,但我对如何工作流(概念)看起来更感兴趣而不是代码实现。
HTTP足够吗? RTSP或者别的怎么样?请记住,数据来自智能手机(互联网连接不例外)到处理机(服务器,快速互联网连接)。
谢谢!
编辑: 谢谢你的回答。实际上我正在寻找可以实现我特定需求的现有通信协议之间的比较。正如我所说,我对实现"连接"的代码的复杂性不感兴趣。相对于我的用例,我希望看到它们之间的优点/缺点。 另一方面,执行识别的服务器必须符合由智能手机上运行的应用程序实现的通信协议(+ API),仅此而已。这意味着我不关心服务器如何完成它的工作,只要它能够理解客户端请求并返回一个可以由发出请求的应用程序理解的答案。
我忘记提及的一些事情(我的不好)是我对所有为实现此用例提供支持的通信协议感兴趣。
答案 0 :(得分:1)
RTSP(实时流协议)不是您所需要的,因为它的设计考虑了一个非常不同的想法。基本上你需要的是一个允许你上传文件(或部分文件)的协议。
你可以使用像TCP 这样的低级协议,它允许你根据需要流式传输任何内容,或者你可以使用更高级别的协议,如HTTP 鉴于此协议包括 Chunked transfer encoding 机制(一种旨在允许您逐个发送chuncks(文件片段)到上传服务器的机制)。
在这两种情况下,您都可以将图像和视频上传到服务器。 HTTP更容易,因为它是一个简单的协议,您可以找到许多代码示例来上传文件,例如,当您将文件上传到youtube时,您正在使用HTTP(在这种情况下没有chuncked)。无论如何,我建议您使用Chunked传输编码机制,因为它允许您恢复上传(暂停或互联网断开连接后)。
使用HTTP(通过TCP)的另一个好理由是服务器端代码将更容易,因为所有Web服务器都可以帮助您专注于真正的问题,从而消除不需要的细节。
因此, 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,但记住会更难,并且您不会有网络服务器来帮助您。
我希望这会对你有所帮助。
答案 1 :(得分:0)
您可能需要考虑Websockets,并且由于您使用的是C ++,我强烈建议Websocketpp用于服务器端实现。 Websocketpp具有直观的面向对象的接口,允许您在接收数据时处理每个事件,并且可以处理大量并发客户端。编写它也允许多线程。在我的特殊情况下,我在Websocketpp上编写了一个实时的多线程视频游戏服务器,所以我确信它有效。 Websocketpp建立在Boost库的基础之上,在我看来,它之所以闪耀,是因为API编写得很好且易于使用。该库附带了优秀的示例代码,开发人员积极维护他的项目。通过使用成熟的websockets实现,您将不会进行任何烧毁CPU的轮询。您将能够在客户端和服务器端异步处理内容。 Websockets也可以在大多数Web浏览器中使用Javascript本地使用,但如果您不使用Web浏览器或webview,您可以找到适用于不同语言的免费Websocket客户端。
要使用Websocketpp服务器,请为常见事件注册一些回调处理程序。
因为很容易为这些函数注册处理程序,所以你真的不必担心协议,你可以专注于特定于应用程序的逻辑。
要回答您更新的问题,HTTP不太适合流媒体,但已被广泛使用,因为过去曾经没有好的选择。如果你研究AJAX的东西,你会发现HTTP与“长轮询”技术一起使用。也许你会发现这篇文章非常有用: In what situations would AJAX long/short polling be preferred over HTML5 WebSockets?
我相信接受的答案是如此之好,你应该只提到那个,这样我就不必重复为什么我认为你应该选择Websockets的优点。