4

我正在使用 gstreamer 从网络摄像头捕获视频,使用 x264 对其进行编码并使用 gstrtpbin 对其进行流式传输。它工作得很好。但是,它使用了我所有四个内核的大约 50% 和大量内存。有什么办法可以降低 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)
4

3 回答 3

1

我也看到过这个问题 - 使用 sync=false 似乎会触发 100% CPU。还有另一个线程Streaming RTP/RTSP: sync/timestamp questions讨论了这个问题。高温高压

于 2013-03-10T11:32:28.270 回答
0

我会运行 oprofile/sysprof 来查看最大的违规者是哪个代码。通过使用较少的抽象接收器和源(例如,直接使用 xvimagesink 而不是 fpsdisplaysink),您也许可以节省一点。如果可以,请避免使用 ffmpegcolorspace (原则上颜色空间转换,如果不需要,元素不会做任何事情,只会造成很少的开销)。

于 2011-05-18T14:01:26.710 回答
0

如果您不需要帧速率计算等等,因此它是叠加的,您可以通过这种方式减少一些 CPU 消耗,但正如 joeforker 所指出的,h264 的计算量非常大,因此尽管管道中进行了所有优化,我怀疑你会看到超过 10-15% 的改进,除非其中一个元素是错误的。这就是 ensonic 对分析的评论非常有用的地方,特别是如果您愿意重写一些元素,即用您自己的替换那些已交付的元素。

于 2011-10-05T05:02:24.510 回答