3

データを逆多重化せずに送信している場合、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 にスループットを制限する方法はありますか?

4

1 に答える 1

0

おそらくやりたいことは、RTPをトランスポートプロトコルとして使用することです。提供されている rtph264pay を使用すると、MTU サイズを設定できます。たとえば、次のようになります。

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

トリックにすべきです。

于 2013-06-26T21:05:08.020 に答える