Text Track Components
The vtt module, @react-av/vtt
, provides several components for incorporating text tracks into your media player.
Cue
The Cue
component allows you to render a VTTCue
object as a React component. This calls the VTTCue.getCueAsHTML()
method to render the cue as HTML.
You must choose which wrapper element to place around the Cue
component. This is because the VTTCue.getCueAsHTML()
method returns a DocumentFragment
which can only have one root element. The Cue
component will throw an error if you try to render it without a wrapper element. This is done via the as
prop. All other props are passed to this wrapper element.
import { Cue } from '@react-av/vtt';
import { VTTCue } from '@react-av/vtt-core';
() => (
<Cue
as="span"
cue={new VTTCue(0, 10, 'Hello World')}
/>
);
Track
The Track
component allows you to add tracks to your media player. You should use this component instead of the built-in track
element.
Our Track
component accepts the same props as the built-in track
element:
kind
- the kind of track (captions, subtitles, descriptions, chapters, or metadata). Defaults tosubtitles
.src
- the URL of the track file. Required.srclang
- the language of the track. Defaults to empty string.label
- the label of the track. Defaults to empty string.default
- whether the track is the default track. Defaults tofalse
.id
- the ID of the track. Defaults to nothing.
import * as Media from '@react-av/core';
() => (
<Media.Root>
<Media.Container>
<Media.Video />
</Media.Container>
<Track kind="subtitles" srclang="en" src="subtitles.vtt" default />
</Media.Root>
);
InterfaceOverlay
When using the Media.Viewport
component, you may want to render a custom overlay on top of the video element. This overlay may contain buttons or other UI elements that you want to be rendered on top of the video element. However, when using captions, these UI elements may be rendered on top of the captions. To prevent this, wrap the UI elements in the InterfaceOverlay
component, which will be used by our WebVTT renderer to prevent collisions with captions.
Since the viewport allows for hover states, we provide a inactiveClassName
to style this inactive state. You may also use the CSS selector div[data-media-overlay-inactive="true"]
to style this state.
If you wish to force an active state for the overlay, you can use the persistent
prop.
import * as Media from '@react-av/core';
import { InterfaceOverlay } from '@react-av/vtt';
() => (
<Media.Root>
<Media.Container>
<Media.Video />
</Media.Container>
<Media.Viewport>
<InterfaceOverlay>
{ /* Your UI elements */ }
</InterfaceOverlay>
</Media.Viewport>
</Media.Root>
);