【发布时间】: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 窗口中获得了想要的视频。但是:
-
树莓派需要大量的 CPU 资源,大约 60%。
-
质量很差。我总是遇到一些损坏的区域,例如颜色错误的矩形,并且视频有时会在短时间内卡住。
-
我在客户端收到这样的错误:解码 MB 5 13,字节流 2817 时出错
我之前使用过https://github.com/silvanmelchior/RPi_Cam_Web_Interface(当然使用树莓派相机而不是videotestsrc)。它具有非常低的延迟、良好的质量和几乎没有 CPU 能力。但它是用 PHP 编写的,我想在 C++ 应用程序中实现流。 GStreamer 对我来说似乎是一个不错的选择,因为这些工作就是它创建的目的。我也使用 GStreamer 进行音频流处理。
我的问题是:
-
为什么 GStreamer 需要这么多 CPU 能力,而
RPi_Cam_Web_Interface几乎不需要?videotestsrc有问题吗(因为它是实时创建的)? -
为什么我的质量这么差,即使在使用环回接口和作为服务器和客户端的同一台计算机时?
-
如何提高设置的效率和质量?
【问题讨论】:
-
videotestsrc确实尽可能快地创建样本。您可以通过将is-live=true传递给videotestsrc来模拟实时源。 RPi 还支持 H.264 硬件编码(我认为)。x264enc在软件中工作,这有很大的不同。查看如何通过 GStreamer 使用 RPi 的硬件编码器。 -
谢谢。事实上,videotestsrc 是问题所在。我将 videotestsrc 录制到文件中,然后将文件播放到 tcpserversink。所有问题都解决了。
标签: gstreamer