mirror of
https://github.com/zoriya/v10.git
synced 2026-08-16 02:45:09 +00:00
75 lines
3.0 KiB
JavaScript
75 lines
3.0 KiB
JavaScript
import { createComposition } from "../../../core/composition/create-composition.js";
|
|
import { makeShareSignals } from "../../../core/composition/share-signals.js";
|
|
import { loadVideoSegments } from "../../behaviors/dom/load-segments.js";
|
|
import { trackCurrentTime } from "../../behaviors/dom/track-current-time.js";
|
|
import { parseMultivariantPlaylist } from "../../../media/hls/parse-multivariant.js";
|
|
import { getResolvedSelectedTrackDuration } from "../../../media/utils/track-selection.js";
|
|
import { calculatePresentationDuration } from "../../behaviors/calculate-presentation-duration.js";
|
|
import { endOfStream } from "../../behaviors/dom/end-of-stream.js";
|
|
import { setupVideoBufferActors } from "../../behaviors/dom/setup-buffer-actors.js";
|
|
import { setupMediaSource } from "../../behaviors/dom/setup-mediasource.js";
|
|
import { updateMediaSourceDuration } from "../../behaviors/dom/update-mediasource-duration.js";
|
|
import { resolvePresentation } from "../../behaviors/resolve-presentation.js";
|
|
import { resolveVideoTrack } from "../../behaviors/resolve-track.js";
|
|
import { pickHighestResolutionVideoTrack } from "../../../media/primitives/select-tracks.js";
|
|
import { selectVideoTrack } from "../../behaviors/select-tracks.js";
|
|
//#region src/playback/engines/background-video/engine.ts
|
|
const shareSignals = makeShareSignals();
|
|
/**
|
|
* Create a background-video playback engine.
|
|
*
|
|
* Subtractive composition over the HLS engine baseline:
|
|
* audio-side, text-side, ABR-driven, preload-monitoring, and play/seek
|
|
* load-trigger behaviors are removed. `selectVideoTrack` (with a
|
|
* max-resolution picker by default) replaces `switchVideoQuality`, pinning
|
|
* a single rendition for the session. The initial state seeds
|
|
* `loadActivated: true` so the composition behaves as if preload has
|
|
* already been activated — appropriate for ambient / hero / GIF-replacement
|
|
* surfaces that should start loading the moment a src is set.
|
|
*
|
|
* Native `loop` / `muted` / `autoplay` are adapter concerns and live on
|
|
* `BackgroundVideoMediaElement` rather than the engine.
|
|
*
|
|
* @example
|
|
* ```ts
|
|
* let signals: BackgroundVideoEngineSignals;
|
|
* const engine = createBackgroundVideoEngine({
|
|
* onSignalsReady: (refs) => {
|
|
* signals = refs;
|
|
* },
|
|
* });
|
|
*
|
|
* signals.context.mediaElement.set(videoEl);
|
|
* signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });
|
|
*
|
|
* await engine.destroy();
|
|
* ```
|
|
*/
|
|
function createBackgroundVideoEngine(config = {}) {
|
|
const finalConfig = {
|
|
...config,
|
|
picker: config.picker ?? pickHighestResolutionVideoTrack,
|
|
parsePresentation: config.parsePresentation ?? parseMultivariantPlaylist,
|
|
resolveDuration: getResolvedSelectedTrackDuration
|
|
};
|
|
return createComposition([
|
|
resolvePresentation,
|
|
calculatePresentationDuration,
|
|
selectVideoTrack,
|
|
resolveVideoTrack,
|
|
loadVideoSegments,
|
|
setupMediaSource,
|
|
updateMediaSourceDuration,
|
|
setupVideoBufferActors,
|
|
trackCurrentTime,
|
|
endOfStream,
|
|
shareSignals
|
|
], {
|
|
config: finalConfig,
|
|
initialState: { loadActivated: true }
|
|
});
|
|
}
|
|
//#endregion
|
|
export { createBackgroundVideoEngine };
|
|
|
|
//# sourceMappingURL=engine.js.map
|