データを逆多重化せずに送信している場合、gstreamer の udpsink を制限する方法はありますか?
ストリームを多重化せずに送信する必要があるパイプがあります。
filesrc ! tee name=t ! tsdemux ! ffdec_h264 ! videosink t. udpsink
主な懸念事項は次のとおりです。filesrc ! udpsink
filesrc、queue、または udpsink オプションで制限する方法がわかりません。同期するメディアストリームがないと仮定しているため、使用sync
は機能しません。したがって、そのパイプラインを使用した結果、データは可能な限り高速に udpsink を介して供給されますが、これは受信側の udpsrc では処理できません。
apprc を基本要素として使用して、独自の 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;
}
}
しかし、これは速度がどのように設定されていても機能しないようです。遅すぎて 1 フレームが通過します。速すぎると、1 つまたは 2 つが通過します。「適切な」速度 (500 kB/秒) では、フレームは 0.5 ~ 2 FPS で受信されますが、ひどく破損しています。
これはコードでこれを行う正しい方法ですか? gstreamer にスループットを制限する方法はありますか?