为什么用视频速率降低帧速率会导致CPU性能显着下降?

时间:2016-10-17 19:34:47

标签: gstreamer

我对videorate元素的理解是帧率校正是通过简单地丢帧而不是#34;花式算法来实现的。用来。我已经描述了gst-launch-1.0管道的CPU使用情况,并且我发现当帧速率降低到1 FPS以下时,CPU的使用率反而直观地显着增加。enter image description here 样本管道(您可以通过更改帧率分数来观察性能损失):

gst-launch-1.0 filesrc location=test.mp4 ! qtdemux ! h264parse ! avdec_h264 ! videorate drop-only=true ! video/x-raw,framerate=1/10 ! autovideosink

我希望降低帧率会减少整个管道中所需的处理量。任何对这种现象的见解都将受到赞赏。

系统信息:Centos 7,GStreamer 1.4.5

编辑:似乎这也发生在videotestsrc上,但前提是你在源上指定了一个高帧速率。

videotestsrc pattern=snow ! video/x-raw,width=1920,height=1080,framerate=25/1 ! videorate drop-only=true ! video/x-raw,framerate=1/10 ! autovideosink

从videotestsrc上限中删除帧率会使CPU使用率降至1%,并且随着视频帧速率的增加,使用率会增加。同时,将源设置为25/1 FPS会将CPU使用率提高到50%,并且随着视频帧速率的增加而降低。

2 个答案:

答案 0 :(得分:2)

Tozar我将专门解决您在上述评论中发布的管道问题。

如果您每10秒钟只发送一次帧,则可能不需要使用h264。在10秒的时间内,帧将完全改变,并且没有数据相似性可以编码以节省带宽。编码器可能只是假设需要一个新的关键帧。你可以选择jpegenc和rtpjpegpay作为替代品。

如果你正在重新编码内容,你肯定会每十秒看到一次CPU峰值。这是不可避免的。

如果你想在进行转换的机器上尽可能地降低CPU使用率,你可以去解析传入的h264数据,拉出关键帧(IDR帧),然后将它们传递给次要目的地。这将假设原始发射机发送关键帧(无内部刷新)。这并不容易。

您可能想要形成一个关于您尝试做什么的更一般的问题。机器在进行转型时的作用是什么?是否必须自己使用数据?什么类型的机器每10秒接收一次帧,它的作用是什么?

答案 1 :(得分:1)

videorate很棘手,您需要将其与管道中的其他所有元素一起考虑。您还需要了解切断实际可用的CPU时间。例如,如果您正在解码60fps文件并以1fps显示它,那么您仍然会吃掉大量的CPU。您可以在fakesink设置为true的情况下输出到sync,以查看实际可以节省多少CPU。

我建议添加一些调试信息,以便更好地了解videorate的行为。

export GST_DEBUG=2,videorate:7

然后你可以在推送时按下“推缓冲”:

gst-launch-1.0 [PIPELINE] 2>&1 | grep "pushing buffer"

..以及在接收数据时存储缓冲区:

gst-launch-1.0 [PIPELINE] 2>&1 | grep "storing buffer"

在解码filesrc的情况下,你会看到突发的CPU活动,因为解码器将运行60帧,实现管道填充,暂停,等到need-buffers事件进来,然后突然再次100%CPU来填充管道。

还有其他因素。就像你可能需要注意的是,在某些瓶颈之间有queue个元素,并设置了正确的max-size属性。或者您的接收器或源元素可能以意想不到的方式运行。

为了获得问题的最佳答案,我建议发布您打算使用的确切管道,无论是否有视频。如果您有类似“autovideosink”的内容,请将其更改为系统上实际解析的元素。

以下是我测试的一些管道:

gst-launch-1.0 videotestsrc pattern=snow ! video/x-raw,width=320,height=180,framerate=60/1 ! videorate ! videoscale method=lanczos ! video/x-raw,width=1920,height=1080,framerate=60/1 ! ximagesink htop中30%的CPU

gst-launch-1.0 videotestsrc pattern=snow ! video/x-raw,width=320,height=180,framerate=60/1 ! videorate ! videoscale method=lanczos ! video/x-raw,width=1920,height=1080,framerate=1/10 0%,htop高峰值10%