当我尝试创建使用H264传输视频的管道时,我会得到一些巨大的延迟,最多10秒钟将视频从我的机器传输到...我的机器!这对于我的目标是不可接受的,我想就我(或其他人)做错的事情咨询Stackoverflow。

我从GSTRTPBIN文档页面上获取管道,并稍作修改它们以使用Speex:

这是发件人管道:#!/bin/sh

gst-launch -v gstrtpbin name=rtpbin \
        v4l2src ! ffmpegcolorspace ! ffenc_h263 ! rtph263ppay ! rtpbin.send_rtp_sink_0 \
                  rtpbin.send_rtp_src_0 ! udpsink host=127.0.0.1 port=5000                            \
                  rtpbin.send_rtcp_src_0 ! udpsink host=127.0.0.1 port=5001 sync=false async=false    \
                  udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0                           \
        pulsesrc ! audioconvert ! audioresample  ! audio/x-raw-int,rate=16000 !    \
                  speexenc bitrate=16000 ! rtpspeexpay ! rtpbin.send_rtp_sink_1                   \
                  rtpbin.send_rtp_src_1 ! udpsink host=127.0.0.1 port=5002                            \
                  rtpbin.send_rtcp_src_1 ! udpsink host=127.0.0.1 port=5003 sync=false async=false    \
                  udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1

接收器管道:

!/bin/sh

gst-launch -v\
    gstrtpbin name=rtpbin                                          \
    udpsrc caps="application/x-rtp,media=(string)video, clock-rate=(int)90000, encoding-name=(string)H263-1998" \
            port=5000 ! rtpbin.recv_rtp_sink_0                                \
        rtpbin. ! rtph263pdepay ! ffdec_h263 ! xvimagesink                    \
     udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0                               \
     rtpbin.send_rtcp_src_0 ! udpsink port=5005 sync=false async=false        \
    udpsrc caps="application/x-rtp,media=(string)audio, clock-rate=(int)16000, encoding-name=(string)SPEEX, encoding-params=(string)1, payload=(int)110" \
            port=5002 ! rtpbin.recv_rtp_sink_1                                \
        rtpbin. ! rtpspeexdepay ! speexdec ! audioresample ! audioconvert ! alsasink \
     udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1                               \
     rtpbin.send_rtcp_src_1 ! udpsink host=127.0.0.1 port=5007 sync=false async=false

这些管道是H263和Speex的组合,工作得足够好。我在相机和Micropohne附近捕捉手指,然后看到动作并同时听到声音。

然后,我更改了管道沿视频路径使用H264。

发件人变为:#!/bin/sh

gst-launch -v gstrtpbin name=rtpbin \
        v4l2src ! ffmpegcolorspace ! x264enc bitrate=300 ! rtph264pay ! rtpbin.send_rtp_sink_0 \
                  rtpbin.send_rtp_src_0 ! udpsink host=127.0.0.1 port=5000                            \
                  rtpbin.send_rtcp_src_0 ! udpsink host=127.0.0.1 port=5001 sync=false async=false    \
                  udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0                           \
        pulsesrc ! audioconvert ! audioresample  ! audio/x-raw-int,rate=16000 !    \
                  speexenc bitrate=16000 ! rtpspeexpay ! rtpbin.send_rtp_sink_1                   \
                  rtpbin.send_rtp_src_1 ! udpsink host=127.0.0.1 port=5002                            \
                  rtpbin.send_rtcp_src_1 ! udpsink host=127.0.0.1 port=5003 sync=false async=false    \
                  udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1

接收器变为:#!/bin/sh

gst-launch -v\
    gstrtpbin name=rtpbin                                          \
    udpsrc caps="application/x-rtp,media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264" \
            port=5000 ! rtpbin.recv_rtp_sink_0                                \
        rtpbin. ! rtph264depay ! ffdec_h264 ! xvimagesink                    \
     udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0                               \
     rtpbin.send_rtcp_src_0 ! udpsink port=5005 sync=false async=false        \
    udpsrc caps="application/x-rtp,media=(string)audio, clock-rate=(int)16000, encoding-name=(string)SPEEX, encoding-params=(string)1, payload=(int)110" \
            port=5002 ! rtpbin.recv_rtp_sink_1                                \
        rtpbin. ! rtpspeexdepay ! speexdec ! audioresample ! audioconvert ! alsasink \
     udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1                               \
     rtpbin.send_rtcp_src_1 ! udpsink host=127.0.0.1 port=5007 sync=false async=false

这就是Ubuntu 10.04下发生的情况。我没有注意到Ubuntu 9.04上的巨大延误 - 延误在2-3秒处,afair。

有帮助吗?

解决方案

在FreeNode的#x264中的“ sharktooth”的帮助下,我发现GST-Plugins的GIT版本支持“零延迟”预设。

http://cgit.freedesktop.org/gstreamer/gst-plugins-ugly

我对您的示例进行了调整,以设置“ X264enc Pass = Qualizer = 20 Tune = Zerolatency”,并且潜伏期似乎保持在0.7-0.9秒。我不知道如何将其降低。

其他提示

那里的东西是缓冲,很可能是编码器。它必须使用的数据越多,它可以实现的有效压缩就越有效。我不熟悉该编码器,但是通常有一个缓冲量的设置。

X264默认情况下,请缓冲输入以使用更多数据可以使用。 Ubuntu 10.04的延迟增加很可能是因为它被卡在旧版本上,然后在引入-mbtree和-rc-lookahead之前。

这页Mewiki 您可以查看如何在应禁用的内容上计算延迟,以及以下内容,以减少延迟:

减少X264的延迟是可能的,但降低了质量。如果您不想要延迟,请设置 - 调整zerolatency。如果您可以处理较小的延迟(即1秒钟以下),则值得调整允许此选择的选项。这是您可以遵循的一系列步骤,以逐步减少延迟。当您的潜伏期足够低时停止:

  1. 从默认设置开始
  2. 杀死同步观察
  3. 将RC-lookahead降至不少于〜10
  4. 将线程置于较低的值(即说6而不是12)
  5. 使用切片线
  6. 禁用RC-lookahead
  7. 禁用B框架
  8. 现在您处于-Tune Zerolatency

因此,您应该首先尝试将其添加到命令行中

sync-lookahead = 0,rc-lookahead = 10(我不确定应用程序中命令行的格式)

这应该以低压缩效率成本剃光大部分延迟。如果您有很多核心(例如,带有HT的四核),也许值得做。4。

根据sharktooth的建议,请使用Tune = Zerolatency,如果还不够的话。

有关该主题的更多信息: http://x264dev.multimedia.cx/archives/249

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top