function VideoSynchronizer(options) {
  options = options ?? Frozen.EMPTY_OBJECT;

  this._clock = undefined;
  this._element = undefined;
  this._clockSubscription = undefined;
  this._seekFunction = undefined;
  this._lastPlaybackRate = undefined;

  this.clock = options.clock;
  this.element = options.element;

  /**
   * Gets or sets the simulation time that marks the start of the video.
   * @type {JulianDate}
   * @default Iso8601.MINIMUM_VALUE
   */
  this.epoch = options.epoch ?? Iso8601.MINIMUM_VALUE;

  /**
   * Gets or sets the amount of time in seconds the video's currentTime
   * and the clock's currentTime can diverge before a video seek is performed.
   * Lower values make the synchronization more accurate but video
   * performance might suffer.  Higher values provide better performance
   * but at the cost of accuracy.
   * @type {number}
   * @default 1.0
   */
  this.tolerance = options.tolerance ?? 1.0;

  this._seeking = false;
  this._seekFunction = undefined;
  this._firstTickAfterSeek = false;
}
Synchronizes a video element with a simulation clock.

@alias VideoSynchronizer
@constructor

@param {object} [options] Object with the following properties:
@param {Clock} [options.clock] The clock instance used to drive the video.
@param {HTMLVideoElement} [options.element] The video element to be synchronized.
@param {JulianDate} [options.epoch=Iso8601.MINIMUM_VALUE] The simulation time that marks the start of the video.
@param {number} [options.tolerance=1.0] The maximum amount of time, in seconds, that the clock and video can diverge.

@demo {@link https://sandcastle.cesium.com/index.html?src=Video.html|Video Material Demo}