【问题标题】:Fastest approach to send OpenCV Mat from PC to Android through Sockets通过套接字将 OpenCV Mat 从 PC 发送到 Android 的最快方法
【发布时间】:2016-04-27 13:10:45
【问题描述】:

我已经创建了一个将 PC 显示流式传输到 Android 的应用程序,并且我已经成功创建了几乎实时获取 PC 屏幕的代码。现在,我想将此数据(在 Mat 中)发送到我的 Android 设备。

我之前创建过 Socket 连接,并且我知道如何将数据从 PC 发送到 Android 的基础知识。我尝试将每一帧保存为png 格式,然后通过Sockets 发送,但速度很慢,而且实时性也不高。

我的问题:将 OpenCV Mat 从 PC(近)实时发送到 Android 的最快方法是什么?

附带说明:我的 PC 代码是用 C++ 编写的,而 Android 代码是用 Java 编写的。当我在我的 PC 上看到要流式传输的 PC 内容时,它是非常实时的。

【问题讨论】:

  • 什么框架尺寸?什么样的帧率?当它跟不上时,你能承受掉帧吗?它必须是无损的(如压缩)吗?你是如何生成png的?到磁盘,还是直接到内存?您是否使用过压缩设置——它是下面的 zlib,并且在更高的压缩级别下不太可能足够快。一般来说,这将是压缩和速度之间的权衡。
  • @DanMašek 帧大小可以是可以无延迟发送的最佳(半高清?)。帧率应该在20以上,不,无损不是必须的,但如果能做到就好了。我生成到磁盘,(我目前不确定如何使用imwrite 写入内存),经过一些实验后,我将压缩级别保持在 3/4。
  • 要直接写入内存缓冲区,请使用imencode 函数。 (还有相反的imdecode)。
  • 720p,这将是 1280x720x3=2.7MiB/frame raw,20 FPS 54 MiB(或大约 420 mBit)。您可以通过一个小型千兆 LAN 相当好地推动它,但我的猜测是 android 设备是移动的,所以这已经有点太多了。这意味着您需要一些严格的压缩比才能使其达到合理的水平。孤立帧(如 PNG)的通用无损压缩不会削减它,尤其是在接近您要求的速度时。所以一些有损但很快的东西,也许是 MJPEG。更好的是一些真正的视频编解码器,可以利用帧之间的相似性。
  • 如果您的 PC 具有出色的 GPU,您可以尝试使用 CUDA using openCV 压缩 h264。这个让您使用回调,因此您不需要编码到文件中,而是可以直接流式传输。或者,从 OpenCV 代码开始破解您自己的内存编码器(例如MJPEG),您似乎只需要更改类 BitStream 以调用回调而不是写入文件。

标签: java android c++ sockets opencv


【解决方案1】:

经过大量尝试,我基本上可以解决我的问题。这是MJPEG 服务器的代码 - Error while using QTcpSocket。 (除了一个小问题,大部分都已修复)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 2018-01-22
    • 2016-08-31
    • 2013-02-01
    • 1970-01-01
    • 2015-03-26
    • 2020-07-17
    • 2015-08-31
    相关资源
    最近更新 更多