我可以将传入的 BMP 图像流显示为视频吗? (Android 应用程序)

Can I display an incoming stream of BMP images as a video? (Android app)

是否可以将传入的 BMP 图像流作为具有超低延迟的视频播放(图像显示时间低于 20 毫秒)

图像将以每秒 20 张图像的频率出现。

这种天真的解决方案是否可行,或者图像是否应该使用 H.264/5 编码?

应该如何解决这个问题?

亲切的问候


Q : "Is this naive solution possible...?"


是的。

您可能也喜欢 阅读此内容。


Q : "...should the images be encoded using H264/5?"


见鬼去吧。

给定上述 20 Hz BMP-image ingress-rate,对于所有 V,每个图像大约有 50 [ms] isual-part的(主要分布)MVC-system.

在所说的 50 毫秒内,浪费的时间应该为零,并且任何东西都不会阻塞。

因此接收-引擎必须保持入口稳定data-flow,没有任何其他流量过载,un-coordinated 带宽(内存,I/O,...)吃东西(BMP-images 的大小目前还没有提到)并且必须提供一些方法,什么会被送入 presenter-engine 如果要显示的“下一个”数据不完整或根本不存在。

那么压缩呢?

压缩是一把 double-sided 剑 - 你显然减少了 data-volume(有一些 SER/DES-codecs 甚至以失去原始 data-richness 的一部分为代价,是的, 确切地 - 故意有损压缩方案 ), 同时通常添加一些额外的 data-re-framing 并且, 也许, R/S 或其他“line-code” error-detection/error-correction, 所以最终体积 data-to-xmit 不需要像纯 compression-part 本身在理论上允许的那么小。

结果?

所有这些都付出了巨大的代价 - 在 SER/coder-side 上,这里是为了将尽可能少的数据输入(明知 low-bandwidth / 最常见的 un-manageable 延迟)传输,以及在 decoder/DES-side.

因此,假设 20 Hz 刷新率留给一个 frame-repaint 的总共不超过 50 毫秒,receiver-engine 处理和 presenter-engine 处理的总和不能花费更多比那些每帧 50 毫秒。任何 decode-related 和 DESerialiser-related 处理都是决定因素。

然而,如果适当的设计和完美的工程能够正确且足够稳健地完成这项工作,则可能会成功。

检查您的目标设备是否有:

  • 运输资源限制
    (即消耗多少时间以及每次到达分配/锁定哪些资源),
  • memory-I/O
    (延迟和内存-I/O 任何交错 data-flow 模式的并发限制),
  • cache-hierarchy
    (如果存在于设备上)尺寸、成本和 I/O-限制),
  • processing limits
    (如果是多核,NUMA越多,谨防non-uniform内存-I/O陷阱)
  • presenter-engine硬件瓶颈
    (内存-I/O,显示设备缓冲- I/O 限制和任何其他 add-on 延迟)

因为这些细节中的任何一个都可能 de-rail 您的 (error-resilient) 数据的顺畅流动最终会在适当的时间呈现在目标设备上,以达到 20 FPS 的目标。

祝你好运!

注意事项:
如果您可以直接利用 data-reduction 来源,请抓住机会并做到这一点,例如在任何情况下,比如你先验地知道所有目标 presenter-engines 都是 B/W,永远不要“发送”彩色 BMP,剥离关闭所有 per-frame colour-table 和 high-level colour-profile 技巧和流不只是原始的 right-sized 栅格数据,匹配 worst-case 目标终端设备的处理和延迟上限场景。
仔细检查通用 BMP-data-format 定义的所有这些冗余和主要浪费(重复)部分,不要 re-broadcast 'em

;)