限制 gstreamer 的 udpsink 发送速率



是否有一种方法来限制gstreamer的上行sink,如果我发送数据而不解复用它?

我有一个管道需要发送非复用流。

filesrc ! tee name=t ! tsdemux ! ffdec_h264 ! videosink t. udpsink

主要关注的是:filesrc ! udpsink

我没有看到任何通过filesrc, queue或udpsink选项来限制它的方法。使用sync不起作用,因为我假设,没有媒体流可以同步。因此,使用该管道的结果是数据尽可能快地通过udpsink提供,这是接收udpsrc无法处理的。

我们已经尝试使用appsrc作为基本元素编写我们自己的上行接收器,使用这个数据包限制方案(在数据包发送方法中有一个thread.sleep(throttleDelay);):

/**
 * Update the delay to pause the packet sending thread.
 * Calculated by dividing how many bytes (roughly) need to be sent <code>packMaxSize</code>
 * by the target bytes/sec rate to get how many seconds are needed. Then multiplying to get
 * time in milliseconds.
 */
private void updateThrottle() {
  if (targetRate > 0)
  {
    throttleDelay = (long)((1000.0 * packetMaxSize) / (double)targetRate);
    if (throttleDelay < 0) {
      throttleDelay = 0;
    }
  } else {
    throttleDelay = 0;
  }
}

但是无论速度设置为多少,这似乎都不起作用。太慢了,一帧就过了。太快的话,会有一两个通过。在"正确"的速度(500kb/s)下,帧以0.5-2帧/秒的速度进入,但它被严重破坏了。

在代码中这是正确的方法吗?gstreamer有任何限制吞吐量的方法吗?

您可能想要做的是使用RTP作为传输协议。通过使用提供的rtph264pay,您可以设置MTU大小,例如:

filesrc !  tsdemux ! tee name=t ! ffdec_h264 ! videosink t. rtph264pay mtu=1300 ! udpsink

相关内容

  • 没有找到相关文章

最新更新