Ограничение скорости отправки удпинкера gstreamer
Есть ли способ ограничить udpsink gstreamer, если я отправляю данные без демультиплексирования?
У меня есть канал, который должен отправить поток без мультиплексирования.
filesrc ! tee name=t ! tsdemux ! ffdec_h264 ! videosink t. udpsink
Где главная проблема заключается в следующем: filesrc ! udpsink
Я не вижу способа ограничить его с помощью параметров filesrc, queue или udpsink. С помощью sync
не работает, так как, я предполагаю, нет медиапотока для синхронизации. Таким образом, результатом использования этого конвейера является то, что данные передаются через udpsink как можно быстрее, что не может обработать принимающий udpsrc.
Мы попытались написать наш собственный udpsink, используя 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;
}
}
Но это, похоже, не работает, независимо от того, на какую скорость установлена. Слишком медленно и один кадр проходит. Слишком быстро и один или два проходят. На "правильной" скорости (500 кБ / с) кадры поступают со скоростью 0,5-2 кадра в секунду, но они ужасно искажены.
Это правильный способ сделать это в коде? Есть ли у gstreamer способ ограничения пропускной способности?
1 ответ
Что вы, вероятно, хотите сделать, это использовать RTP в качестве транспортного протокола. Используя предоставленную rtph264pay, вы можете установить размер MTU, например:
filesrc ! tsdemux ! tee name=t ! ffdec_h264 ! videosink t. rtph264pay mtu=1300 ! udpsink
Должен подвох.