有没有办法限制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有没有办法限制吞吐量?
答案 0 :(得分:0)
您可能想要做的是使用RTP作为传输协议。通过使用提供的rtph264pay,您可以设置MTU大小,如下所示:
filesrc ! tsdemux ! tee name=t ! ffdec_h264 ! videosink t. rtph264pay mtu=1300 ! udpsink
应该诀窍。