限制gstreamer的udpsink的发送率

时间:2013-06-17 13:51:04

标签: java gstreamer java-gstreamer

有没有办法限制gstreamer的udpsink,如果我在没有多路分解的情况下发送数据呢?

我有一个需要发送未经过多路复用的流的管道。

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

主要关注点是:filesrc ! udpsink

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

我们尝试使用appsrc作为基本元素编写自己的udpsink,使用此数据包限制方案(数据包发送方法中有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;
  }
}

但无论速度设定为何,这似乎都不起作用。太慢,一帧通过。太快了,一两个人通过。在“正确”的速度(500 kB / s)下,帧的速度为0.5-2 FPS,但它的损坏程度非常大。

这是在代码中进行此操作的正确方法吗? gstreamer有没有办法限制吞吐量?

1 个答案:

答案 0 :(得分:0)

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

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

应该诀窍。