【问题标题】:GStreamer video streaming low performanceGStreamer 视频流性能低下
【发布时间】:2022-03-18 00:19:53
【问题描述】:

我正在从树莓派流式传输 GStreamer 的 videotestsrc。流必须是 TCP。

我的服务器管道:

gst-launch-1.0 videotestsrc horizontal-speed=5 ! x264enc tune="zerolatency" threads=1 ! mpegtsmux ! tcpserversink host=10.0.0.7 port=3344

我的客户管道:

gst-launch-1.0 tcpclientsrc port=3344 host=10.0.0.7 ! tsdemux ! h264parse ! avdec_h264 ! autovideosink

它确实有效,我在客户端的 OpenGL 窗口中获得了想要的视频。但是:

  1. 树莓派需要大量的 CPU 资源,大约 60%。

  2. 质量很差。我总是遇到一些损坏的区域,例如颜色错误的矩形,并且视频有时会在短时间内卡住。

  3. 我在客户端收到这样的错误:解码 MB 5 13,字节流 2817 时出错

我之前使用过https://github.com/silvanmelchior/RPi_Cam_Web_Interface(当然使用树莓派相机而不是videotestsrc)。它具有非常低的延迟、良好的质量和几乎没有 CPU 能力。但它是用 PHP 编写的,我想在 C++ 应用程序中实现流。 GStreamer 对我来说似乎是一个不错的选择,因为这些工作就是它创建的目的。我也使用 GStreamer 进行音频流处理。

我的问题是:

  1. 为什么 GStreamer 需要这么多 CPU 能力,而 RPi_Cam_Web_Interface 几乎不需要? videotestsrc 有问题吗(因为它是实时创建的)?

  2. 为什么我的质量这么差,即使在使用环回接口和作为服务器和客户端的同一台计算机时?

  3. 如何提高设置的效率和质量?

【问题讨论】:

  • videotestsrc 确实尽可能快地创建样本。您可以通过将is-live=true 传递给videotestsrc 来模拟实时源。 RPi 还支持 H.264 硬件编码(我认为)。 x264enc 在软件中工作,这有很大的不同。查看如何通过 GStreamer 使用 RPi 的硬件编码器。
  • 谢谢。事实上,videotestsrc 是问题所在。我将 videotestsrc 录制到文件中,然后将文件播放到 tcpserversink。所有问题都解决了。

标签: gstreamer


【解决方案1】:

您可以通过使用 decodebin 而不是 avdec_h264 来减少 CPU 负载。 我也在努力提高性能,如果有人知道请帮忙

【讨论】:

  • 嗨,我解决了我的问题,现在我很擅长 gstreamer。如果您尝试执行我所做的操作,我建议您将视频测试src 录制到文件接收器,然后播放该文件。显然它也适用于将 live=true 添加到 videotestsrc,我没有尝试过。问题是 videotestsrc 会创建尽可能多的图像,这会导致大量 cpu 使用。
【解决方案2】:
  • 您为服务器和客户端管道使用相同的树莓派,因此它们使用相同的 soc 资源,它使用更多的 cpu 功率并散发热量,最好将散热器连接到树莓派。
  • 如果您有另一台 PC 或树莓派,您可以使用它进行调试,以发现之前的场景中服务器端或客户端或服务器客户端混合操作中出现的质量不良。
  • 您可以在管道中使用上限尝试不同的帧速率,然后更改帧速率并查看输出视频质量的差异。并为服务器管道尝试 v4l2src 并更改分辨率并检查输出场景的差异。这些是我优化流媒体管道所遵循的步骤

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-29
    • 2022-12-22
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多