--- category: Browser --- # useMediaControls Reactive media controls for both `audio` and `video` elements ## Usage ### Basic Usage ```vue ``` ### Providing Captions, Subtitles, etc... You can provide captions, subtitles, etc in the `tracks` options of the `useMediaControls` function. The function will return an array of tracks along with two functions for controlling them, `enableTrack`, `disableTrack`, and `selectedTrack`. Using these you can manage the currently selected track. `selectedTrack` will be `-1` if there is no selected track. ```vue ``` ## Type Declarations ```ts /** * Many of the jsdoc definitions here are modified version of the * documentation from MDN(https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement) */ export interface UseMediaSource { /** * The source url for the media */ src: string /** * The media codec type */ type?: string /** * Specifies the media query for the resource's intended media. */ media?: string } export interface UseMediaTextTrackSource { /** * Indicates that the track should be enabled unless the user's preferences indicate * that another track is more appropriate */ default?: boolean /** * How the text track is meant to be used. If omitted the default kind is subtitles. */ kind: TextTrackKind /** * A user-readable title of the text track which is used by the browser * when listing available text tracks. */ label: string /** * Address of the track (.vtt file). Must be a valid URL. This attribute * must be specified and its URL value must have the same origin as the document */ src: string /** * Language of the track text data. It must be a valid BCP 47 language tag. * If the kind attribute is set to subtitles, then srclang must be defined. */ srcLang: string } interface UseMediaControlsOptions extends ConfigurableDocument { /** * The source for the media, may either be a string, a `UseMediaSource` object, or a list * of `UseMediaSource` objects. */ src?: MaybeRefOrGetter /** * A list of text tracks for the media */ tracks?: MaybeRefOrGetter } export interface UseMediaTextTrack { /** * The index of the text track */ id: number /** * The text track label */ label: string /** * Language of the track text data. It must be a valid BCP 47 language tag. * If the kind attribute is set to subtitles, then srclang must be defined. */ language: string /** * Specifies the display mode of the text track, either `disabled`, * `hidden`, or `showing` */ mode: TextTrackMode /** * How the text track is meant to be used. If omitted the default kind is subtitles. */ kind: TextTrackKind /** * Indicates the track's in-band metadata track dispatch type. */ inBandMetadataTrackDispatchType: string /** * A list of text track cues */ cues: TextTrackCueList | null /** * A list of active text track cues */ activeCues: TextTrackCueList | null } export declare function useMediaControls( target: MaybeRef, options?: UseMediaControlsOptions, ): { currentTime: ShallowRef duration: ShallowRef waiting: ShallowRef seeking: ShallowRef ended: ShallowRef stalled: ShallowRef buffered: Ref<[number, number][], [number, number][]> playing: ShallowRef rate: ShallowRef volume: ShallowRef muted: ShallowRef tracks: Ref< { id: number label: string language: string mode: TextTrackMode kind: TextTrackKind inBandMetadataTrackDispatchType: string cues: { [x: number]: { endTime: number id: string onenter: ((this: TextTrackCue, ev: Event) => any) | null onexit: ((this: TextTrackCue, ev: Event) => any) | null pauseOnExit: boolean startTime: number readonly track: { readonly activeCues: /*elided*/ any | null readonly cues: /*elided*/ any | null readonly id: string readonly inBandMetadataTrackDispatchType: string readonly kind: TextTrackKind readonly label: string readonly language: string mode: TextTrackMode oncuechange: ((this: TextTrack, ev: Event) => any) | null addCue: (cue: TextTrackCue) => void removeCue: (cue: TextTrackCue) => void addEventListener: { ( type: K, listener: (this: TextTrack, ev: TextTrackEventMap[K]) => any, options?: boolean | AddEventListenerOptions, ): void ( type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions, ): void } removeEventListener: { ( type: K, listener: (this: TextTrack, ev: TextTrackEventMap[K]) => any, options?: boolean | EventListenerOptions, ): void ( type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions, ): void } dispatchEvent: { (event: Event): boolean (event: Event): boolean } } | null addEventListener: { ( type: K, listener: ( this: TextTrackCue, ev: TextTrackCueEventMap[K], ) => any, options?: boolean | AddEventListenerOptions, ): void ( type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions, ): void } removeEventListener: { ( type: K, listener: ( this: TextTrackCue, ev: TextTrackCueEventMap[K], ) => any, options?: boolean | EventListenerOptions, ): void ( type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions, ): void } dispatchEvent: { (event: Event): boolean (event: Event): boolean } } readonly length: number getCueById: (id: string) => TextTrackCue | null [Symbol.iterator]: () => ArrayIterator } | null activeCues: { [x: number]: { endTime: number id: string onenter: ((this: TextTrackCue, ev: Event) => any) | null onexit: ((this: TextTrackCue, ev: Event) => any) | null pauseOnExit: boolean startTime: number readonly track: { readonly activeCues: /*elided*/ any | null readonly cues: /*elided*/ any | null readonly id: string readonly inBandMetadataTrackDispatchType: string readonly kind: TextTrackKind readonly label: string readonly language: string mode: TextTrackMode oncuechange: ((this: TextTrack, ev: Event) => any) | null addCue: (cue: TextTrackCue) => void removeCue: (cue: TextTrackCue) => void addEventListener: { ( type: K, listener: (this: TextTrack, ev: TextTrackEventMap[K]) => any, options?: boolean | AddEventListenerOptions, ): void ( type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions, ): void } removeEventListener: { ( type: K, listener: (this: TextTrack, ev: TextTrackEventMap[K]) => any, options?: boolean | EventListenerOptions, ): void ( type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions, ): void } dispatchEvent: { (event: Event): boolean (event: Event): boolean } } | null addEventListener: { ( type: K, listener: ( this: TextTrackCue, ev: TextTrackCueEventMap[K], ) => any, options?: boolean | AddEventListenerOptions, ): void ( type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions, ): void } removeEventListener: { ( type: K, listener: ( this: TextTrackCue, ev: TextTrackCueEventMap[K], ) => any, options?: boolean | EventListenerOptions, ): void ( type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions, ): void } dispatchEvent: { (event: Event): boolean (event: Event): boolean } } readonly length: number getCueById: (id: string) => TextTrackCue | null [Symbol.iterator]: () => ArrayIterator } | null }[], | UseMediaTextTrack[] | { id: number label: string language: string mode: TextTrackMode kind: TextTrackKind inBandMetadataTrackDispatchType: string cues: { [x: number]: { endTime: number id: string onenter: ((this: TextTrackCue, ev: Event) => any) | null onexit: ((this: TextTrackCue, ev: Event) => any) | null pauseOnExit: boolean startTime: number readonly track: { readonly activeCues: /*elided*/ any | null readonly cues: /*elided*/ any | null readonly id: string readonly inBandMetadataTrackDispatchType: string readonly kind: TextTrackKind readonly label: string readonly language: string mode: TextTrackMode oncuechange: ((this: TextTrack, ev: Event) => any) | null addCue: (cue: TextTrackCue) => void removeCue: (cue: TextTrackCue) => void addEventListener: { ( type: K, listener: (this: TextTrack, ev: TextTrackEventMap[K]) => any, options?: boolean | AddEventListenerOptions, ): void ( type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions, ): void } removeEventListener: { ( type: K, listener: (this: TextTrack, ev: TextTrackEventMap[K]) => any, options?: boolean | EventListenerOptions, ): void ( type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions, ): void } dispatchEvent: { (event: Event): boolean (event: Event): boolean } } | null addEventListener: { ( type: K, listener: ( this: TextTrackCue, ev: TextTrackCueEventMap[K], ) => any, options?: boolean | AddEventListenerOptions, ): void ( type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions, ): void } removeEventListener: { ( type: K, listener: ( this: TextTrackCue, ev: TextTrackCueEventMap[K], ) => any, options?: boolean | EventListenerOptions, ): void ( type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions, ): void } dispatchEvent: { (event: Event): boolean (event: Event): boolean } } readonly length: number getCueById: (id: string) => TextTrackCue | null [Symbol.iterator]: () => ArrayIterator } | null activeCues: { [x: number]: { endTime: number id: string onenter: ((this: TextTrackCue, ev: Event) => any) | null onexit: ((this: TextTrackCue, ev: Event) => any) | null pauseOnExit: boolean startTime: number readonly track: { readonly activeCues: /*elided*/ any | null readonly cues: /*elided*/ any | null readonly id: string readonly inBandMetadataTrackDispatchType: string readonly kind: TextTrackKind readonly label: string readonly language: string mode: TextTrackMode oncuechange: ((this: TextTrack, ev: Event) => any) | null addCue: (cue: TextTrackCue) => void removeCue: (cue: TextTrackCue) => void addEventListener: { ( type: K, listener: (this: TextTrack, ev: TextTrackEventMap[K]) => any, options?: boolean | AddEventListenerOptions, ): void ( type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions, ): void } removeEventListener: { ( type: K, listener: (this: TextTrack, ev: TextTrackEventMap[K]) => any, options?: boolean | EventListenerOptions, ): void ( type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions, ): void } dispatchEvent: { (event: Event): boolean (event: Event): boolean } } | null addEventListener: { ( type: K, listener: ( this: TextTrackCue, ev: TextTrackCueEventMap[K], ) => any, options?: boolean | AddEventListenerOptions, ): void ( type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions, ): void } removeEventListener: { ( type: K, listener: ( this: TextTrackCue, ev: TextTrackCueEventMap[K], ) => any, options?: boolean | EventListenerOptions, ): void ( type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions, ): void } dispatchEvent: { (event: Event): boolean (event: Event): boolean } } readonly length: number getCueById: (id: string) => TextTrackCue | null [Symbol.iterator]: () => ArrayIterator } | null }[] > selectedTrack: ShallowRef enableTrack: ( track: number | UseMediaTextTrack, disableTracks?: boolean, ) => void disableTrack: (track?: number | UseMediaTextTrack) => void supportsPictureInPicture: boolean | undefined togglePictureInPicture: () => Promise isPictureInPicture: ShallowRef onSourceError: EventHookOn onPlaybackError: EventHookOn } export type UseMediaControlsReturn = ReturnType ```