Gstreamer pipleline的CPU使用率和内存

问题描述:

我使用gstreamer从网络摄像头捕获视频,使用x264对其进行编码并使用gstrtpbin进行流式处理。它效果很好。但是,它使用了我所有四个内核中的大约50%以及大量内存。有什么我可以做的,以降低CPU和内存使用量?这是管道。Gstreamer pipleline的CPU使用率和内存

pipeline_description = "gstrtpbin latency=0 max-latency=100 drop-on-latency=true use-pipeline-clock=true ntp-sync=true name=rtpbin " \ 
     "autovideosrc ! video/x-raw-yuv,width=640,height=480,framerate=30/1 ! " \ 
     "tee name=t_vid ! queue ! fpsdisplaysink name=fpssink text-overlay=false video-sink=xvimagesink signal-fps-measurements=true t_vid. ! " \ 
     "queue ! videorate ! ffmpegcolorspace ! x264enc pass=qual tune=zerolatency quantizer=40 ! queue ! rtph264pay ! rtpbin.send_rtp_sink_0 " \ 
     "rtpbin.send_rtp_src_0 ! udpsink port=%d host=%s sync=false async=false rtpbin.send_rtcp_src_0 ! " \ 
     "udpsink port=%d host=%s sync=false async=false name=vrtcpsink udpsrc port=%d ! " \ 
     "rtpbin.recv_rtcp_sink_0 autoaudiosrc ! queue ! audioresample ! audioconvert ! alawenc ! rtppcmapay ! rtpbin.send_rtp_sink_1 " \ 
     "rtpbin.send_rtp_src_1 ! udpsink port=%d host=%s sync=false async=false rtpbin.send_rtcp_src_1 ! " \ 
     "udpsink port=%d host=%s sync=false async=false udpsrc port=%d ! rtpbin.recv_rtcp_sink_1" % (VRTP_SEND_PORT, DEST, 
     VRTCP_SEND_PORT, DEST, VRTCP_RECV_PORT, ARTP_SEND_PORT, DEST, ARTCP_SEND_PORT, DEST, ARTCP_RECV_PORT) 
+2

在VGA分辨率下每秒30帧编码到h.264是很多/计算! – joeforker 2011-04-04 18:01:52

+0

@joeforker:这对于性能来说确实是一个很好的答案,因为我意识到了这一点,并且我看到与HDMI渲染的区别非常快。 – YumYumYum 2011-04-07 17:40:21

+0

队列全部使用内存。您可能可以移动它们或限制其大小。 – joeforker 2011-04-07 20:16:02

我会运行oprofile/sysprof来查看哪些代码是最大的违规者。通过使用更少的抽象接收器和来源(例如,直接使用xvimagesink而不是fpsdisplaysink),您可能会节省一点。如果可以的话,避免使用ffmpegcolorspace(原则上使用颜色空间转换,如果不需要,元素将不会执行任何操作,只会导致很少的开销)。

如果你不需要帧速率计算和更多的覆盖,你可以这样削减一些CPU的消耗,但正如joeforker所指出的,h264在计算上相当密集,所以尽管所有的优化在你的管道中,我怀疑你会看到超过10-15%的改进,除非其中一个元素是越野车。在这里,ensonic对分析的评论将非常有用,尤其是如果你愿意用自己的方法重写某些元素,即替换已发布的元素。

我也见过这个问题 - 使用sync = false似乎触发100%的CPU。还有另一个线程Streaming RTP/RTSP: sync/timestamp problems谈到这一点。 HTH