Media decides what to render by looking at the file extension, and hands video off to a player. MediaVideoPlayer and MediaAudioPlayer are those players, and you can reach for either directly.
You need them directly in two situations: when the source has no usable extension — a blob: URL from MediaRecorder, a signed URL with the type in a query string — so Media cannot sniff it; and when the media is the component, as in an audio player that has no visual counterpart at all.
Both live on the ./components/* subpath rather than the root barrel, so they are not pulled into every bundle that imports something from Once UI.
A video surface with play/pause, a scrubbable progress bar and elapsed time. It is the right component for an extension-less source:
Play/pause, a scrubbable progress bar and elapsed/total time, laid out as a row rather than a surface. It takes every Column prop, so it sits in a layout like any other block.
onTimeUpdate fires on every timeupdate with the position in seconds. The player owns playback; the caller owns what that position means — highlighting the paragraph being narrated, advancing a transcript, moving a chapter marker.