在极低带宽场景下压缩原始帧

问题描述 投票:0回答:1

编辑:评论指出我应该澄清哪里需要帮助

鉴于条件

  • 32字节数据包,其中一些可能会丢失
  • 2Mbps最大速度
  • C++ 用于捕获、发送和可能的处理

如何压缩每一帧以获得合适的 fps 并看到物体?

场景是关于驾驶第一人称视角,质量并不重要,只要你能看到你在做什么,反应性才是


我正在试验遥控汽车,并寻找一种将实时视频数据从汽车传输到显示器的方法。

到目前为止,我能够从 USB 网络摄像头获取 YUV 格式的原始帧,并使用 C++ 数组中的树莓派 3b 通过 v4l2 将每个帧转换为 RGB,并通过 C++ RF24 库传输数据

压缩数据将通过一对 NRF24L01+ 模块进行传输,该模块的最大速率为 2MBits(通话时间调制),因此我知道可用带宽非常有限。 初始传输后,数据将通过 USB 串行或蓝牙模块 HC-05 重定向到我的自定义 Android 应用程序

  • 通过这些模块进行流式传输已使用 HEVC 进行了演示,这是一个预处理剪辑而不是实时应用程序
  • 与演示不同,我没有通过网络进行流式传输或使用网络驱动程序,这就是为什么我认为低端视频流是可能的

我正在寻找的解决方案: 实时的、极其压缩的流,是最低限度且足够快的流,足以看到汽车的行驶方向并做出反应,对颜色或分辨率不感兴趣,线框也可以。 每个流数据包的最大长度限制为 32 字节。并且必须用 Java 重新组合(对于 Android 应用程序)

我尝试过的解决方案:

  • 压缩为8位颜色,无法将数据包放在Android端
  • 未压缩的流媒体,只是低分辨率:帧时间较慢(每帧大约几秒)
embedded video-streaming real-time
1个回答
0
投票

到目前为止,我能够从 USB 网络摄像头获取 YUV 格式的原始帧 使用 C++ 数组中的树莓派 3b 格式化并转换为 RGB, 通过v4l2,并通过c++ RF24库传输数据

当您拥有原始 YUV 帧时,如果传输速率较低并且您的需求与图形使用无关,则无需将其转换为 RGB。 YUV 格式已经通过消除 RGB 数据中的一些视觉(人类)冗余来减小尺寸。进一步的子采样颜色格式(如果还没有)可以帮助您进一步减小输入帧的大小。

最低限度且足够快,可以看到汽车要去哪里并做出反应, 对颜色或分辨率不感兴趣,线框也可以

您的问题相当开放。因此,我在这里具体说明您的要求:

以“原始”CIF 视频质量 (352x288) 输入帧为例。即使输入被子采样为 YUV 420,每帧也需要大约 1.2 Mb。而且,如果您只关心 30 fps 视频来了解汽车的行驶方向,则每秒需要 (1.2 x 30) Mb。这将是每秒很多字节,这就是您需要编解码器在传输之前对视频帧进行编码的地方。 RF 库,IMO,不压缩。由于您几乎不关心视频格式/分辨率等,因此当今大多数可用的编解码器将完全满足您的要求。

您需要什么:

  1. 您需要一个编解码器(SW 或 HW)将输入 YUV 转换为压缩比特流(AV/HEVC 等)。凭借 2 Mbps 的传输能力,您将能够传输分辨率相当合理的视频。这不是低带宽:)

  2. 使用您的工具/库进行传输。

  3. 在Android端,您可以编写一个使用MediaExtractor/MediaCodec来提取和解码传输/压缩数据的应用程序。您可以将解码的数据用于您的任何目的。

© www.soinside.com 2019 - 2024. All rights reserved.