mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-21 20:53:21 -08:00
39 lines
1.6 KiB
TypeScript
39 lines
1.6 KiB
TypeScript
import type { Input, InputAudioTrack, InputVideoTrack } from 'mediabunny'
|
|
import type { PlaybackMedia } from './media'
|
|
import { isHlsSource } from './input'
|
|
|
|
export async function resolveDuration({ input, videoTrack, audioTrack }: Pick<PlaybackMedia, 'input' | 'videoTrack' | 'audioTrack'>): Promise<number> {
|
|
const tracks = [videoTrack, audioTrack].filter((track): track is InputVideoTrack | InputAudioTrack => track !== null)
|
|
const referenceTrack = videoTrack || audioTrack
|
|
const isLive = Boolean(referenceTrack && await referenceTrack.isLive())
|
|
|
|
let duration: number | null = Number.NaN
|
|
if (tracks.length > 0) {
|
|
duration = await input.getDurationFromMetadata(tracks, { skipLiveWait: true })
|
|
if (duration === null && !isLive)
|
|
duration = await input.computeDuration(tracks, { skipLiveWait: true })
|
|
}
|
|
return isLive ? Number.POSITIVE_INFINITY : duration ?? Number.NaN
|
|
}
|
|
|
|
export async function selectPlaybackTracks(input: Input, src: unknown): Promise<PlaybackMedia> {
|
|
const videoTrack = await input.getPrimaryVideoTrack()
|
|
const audioTrack = videoTrack
|
|
? await videoTrack.getPrimaryPairableAudioTrack()
|
|
: await input.getPrimaryAudioTrack()
|
|
const duration = await resolveDuration({ input, videoTrack, audioTrack })
|
|
const referenceTrack = videoTrack || audioTrack
|
|
const isHls = isHlsSource(src)
|
|
|
|
return {
|
|
input,
|
|
videoTrack,
|
|
audioTrack,
|
|
duration,
|
|
isLive: Number.isFinite(duration) ? false : Boolean(referenceTrack && await referenceTrack.isLive()),
|
|
isHls,
|
|
videoMode: isHls ? 'auto' : 'manual',
|
|
audioMode: isHls ? 'auto' : 'manual',
|
|
}
|
|
}
|