【问题标题】:Is there a standardized method to send JPG images over network with TCP/IP?是否有标准化的方法通过 TCP/IP 网络发送 JPG 图像?
【发布时间】:2020-03-09 15:56:09
【问题描述】:

我正在寻找一种通过网络传输 JPG 图像的标准化方法。还需要一个 C++ 编程接口,它可以很容易地集成到现有软件中。

我正在开发一个处理数字化信号并将其压缩为 JPG 图像的 GPGPU 程序。图像的大小可以由用户定义,通常图像为 1024 x 2048 或 2048 x 4096 像素。我已经编写了我的“自己的”协议,它首先发送一个标头(以字节为单位的图像大小、宽度、高度和相应的通道),然后通过 TCP 发送 JPG 数据本身。之后,接收方发送确认所有数据均已接收并正确显示,以便可以发送下一张图像。到目前为止一切顺利,不幸的是我的方法仅达到 12 fps,这不能满足项目要求。

我确信有更好的方法具有更高的帧速率。 Netflix 和 Amzon 等流媒体服务对超高清视频采用哪种方法?当然,我google了很多,但我找不到任何令人满意的结果。

【问题讨论】:

  • 一般 Netflix 或其他供应商基本上使用 HTTP 流是什么,但它们会缓冲内容,例如缓冲电影的前 5 分钟,在您观看电影时继续下载和缓冲系统
  • 您是在寻找图像传输还是视频流?这是两个不同的东西。
  • 您声明您当前的"approach reaches just 12 fps"。您是否进行了剖析以找到瓶颈?是生成 jpeg 时的 CPU 使用率还是传输这些 jpeg 时的网络带宽?还是别的什么?
  • 我正在寻找逐图像传输的图像。不幸的是,无法预先缓冲一些图像,因为它们应该实时显示。我没有准确地描述它,但我很确定瓶颈的原因是接收方的确认。如果我跳过确认,发射器发送速度太快,以至于图像不再正确显示在接收器上。但是,我更喜欢标准化的程序,因为我确信这个问题已经被专家们认真解决了很长时间。
  • 如果只是从您机器上的本地文件中读取 JPG,您能够以多快的速度渲染它们?视频有自己的格式,例如 mpeg-4。视频格式利用了下一帧与前一帧可能只有微小差异这一事实,因此压缩率可以更高。

标签: c++ tcp jpeg


【解决方案1】:

这不是对您问题的直接回答,而是建议您可能需要更改发送电影的方式。

这里有一个计算:假设您可以从您的网络中获得 1Gb/s 的吞吐量。如果每个 2048x4096 文件压缩到大约 10MB(80Mb),那么:

1000000000 ÷ (80 × 1000000) 等于; 12.5

因此,您每秒可以发送大约 12 帧。这意味着,如果您想要显示连续的 JPG 流,如果您想要更快的帧速率,则需要更快的网络。

如果您的流是固定长度的电影,那么您可以缓冲数据并在缓冲足够的数据后开始播放电影,以便在等待整个电影下载之前以所需的帧速率播放。如果您想以每秒 24 帧的速度播放,那么您需要在播放之前缓冲至少 2/3rds 的电影,因为播放速度是下载速度的两倍。

正如另一个答案中所述,您应该使用流编解码器,以便您还可以利用连续帧之间的压缩,而不仅仅是单独压缩当前帧。

总而言之,如果流永远不会结束(例如,实时流),您的播放速率将受到每秒可以传输的帧数的限制。

如果您有固定长度的电影,可以使用缓冲来隐藏吞吐量和延迟瓶颈。

【讨论】:

    【解决方案2】:

    我没有想到某个特定的库已经可以很好地完成这些事情,但要记住一些事项:

    1. 大多数图像/屏幕共享/视频流应用程序以有损方式专门使用 UDP、RTP、RTSP 来传输视频流数据。他们使用 TCP 控制流数据,例如发送关键命令,或客户端/服务器之间关于呈现内容的通信,但流数据不是 TCP。
    2. 如果您正在流式传输视频,请参阅this
    3. 发送单个图像您只需要有效的方法来压缩、序列化和反序列化,并且您可能希望以批处理方式执行此操作,而不是一次只发送一个。将 10 个 jpeg 批处理在一起,对其进行压缩、序列化,发送。

    您提到了 fps,所以听起来您正在尝试流式传输视频,而不仅仅是快速复制图像。我不完全确定您要做什么。您能否详细说明数字化信号以及为什么它们必须以 jpeg 格式显示?不能是其他格式,以后在接收端转成jpeg吗?

    【讨论】:

    • 澄清一下,我实际上想发送图片而不是视频。模拟信号来自雷达传感器,并由数字化仪 (~4x200MB/s) 进行采样。捕获的数据由 RDMA 通过 PCIe 传输到 GPU。在这个 GPU 上,对数据执行雷达算法。然后将处理后的数据(浮点数)映射到 BMP24 中的像素。我认为在通过网络发送数据之前对其进行压缩会很有用。 GPU 适合这种压缩,我想利用它的优势。您更喜欢哪种格式?你认为 JPG 的解码是一个瓶颈(不是在 GPU 上)吗?
    • @One3Three7:GPU 应该能够编码为视频。我问过你解码的速度有多快,你已经说过你期望超过 100 fps 的播放速度,所以我把它作为可能的瓶颈排除了。
    • @jhx 然后我有一个误解,我指的是处理和编码数据,而不是渲染和解码。我会检查解码和渲染的速度。
    • @One3Three7:请注意,我的答案示例中使用的 1Gb/s 通常能够处理 60 fps 的高清质量视频。所以流格式提供了更好的压缩,即允许每秒传送更多的帧。唯一需要的缓冲是处理偶尔的网络抖动(如果您特别不想看到抖动,可能需要 10 秒的缓冲)。
    【解决方案3】:

    是否有标准化的方法通过 TCP/IP 通过网络发送 JPG 图像?

    有几种互联网协议通常用于通过 TCP 传输文件。也许最常用的协议是 HTTP。另一种较旧的方法是 FTP。

    Netflix 和 Amzon 等流媒体服务对超高清视频采用哪种方法?

    首先,他们根本不使用 JPEG。他们使用一些视频压缩编解码器(例如 MPEG),不仅在空间上压缩数据,而且在时间上(连续的帧倾向于保存相似的数据)。他们可能用于流式传输数据的协议示例是 DASH,它通过 HTTP 运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-29
      • 2018-10-24
      • 2011-06-05
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多