Custom video players need consistent control over play, pause, volume, seek, and fullscreen across different browsers. The native HTML5 video API is inconsistent (e.g., fullscreen methods vary).
VideoController wraps the native video element with a consistent interface: play(), pause(),
togglePlay(), setVolume(), setCurrentTime(), enterFullscreen(), etc. It also provides
reactive properties (isPlaying, currentTime, duration) and subscriptions for UI updates.
VideoPlayer, MediaPlayer, CoursePlayer, WebinarViewer