Add metadata-based duration retrieval

This commit is contained in:
Vanilagy
2026-03-13 17:03:36 +01:00
parent c43ca025d9
commit a9a455e132
23 changed files with 517 additions and 49 deletions
+18 -2
View File
@@ -1,5 +1,5 @@
import { AUDIO_CODECS, AudioCodec, inferCodecFromCodecString, MediaCodec, VIDEO_CODECS, VideoCodec } from '../codec';
import { Demuxer } from '../demuxer';
import { Demuxer, DurationMetadataRequestOptions } from '../demuxer';
import { Input } from '../input';
import {
InputAudioTrack,
@@ -52,6 +52,7 @@ export class HlsDemuxer extends Demuxer {
metadataPromise: Promise<void> | null = null;
tracks: InputTrack[] = [];
segmentedInputs: HlsSegmentedInput[] = [];
hasMasterPlaylist = true;
constructor(input: Input) {
super(input);
@@ -153,7 +154,8 @@ export class HlsDemuxer extends Demuxer {
} else if (line.startsWith('#EXTINF:')) {
// This is a media playlist, not a master playlist
const segmentedInput = new HlsSegmentedInput(this, this.input._entryPath, lines);
this.segmentedInputs.push(segmentedInput);
this.segmentedInputs = [segmentedInput];
this.hasMasterPlaylist = false;
const input = segmentedInput.toInput();
this.tracks = await input.getTracks();
@@ -569,6 +571,12 @@ export class HlsDemuxer extends Demuxer {
return segmentedInput;
}
async getDurationFromMetadata(options: DurationMetadataRequestOptions): Promise<number | null> {
return this.hasMasterPlaylist
? null
: this.segmentedInputs[0]!.getDurationFromMetadata(options);
}
async getMetadataTags(): Promise<MetadataTags> {
return {};
}
@@ -693,6 +701,14 @@ abstract class HlsInputTrackBacking implements InputTrackBacking {
return this.internalTrack.averageBitrate;
}
async getDurationFromMetadata(options: DurationMetadataRequestOptions): Promise<number | null> {
if (!this.internalTrack.backingTrack) {
throw new TrackNotHydratedError();
}
return this.internalTrack.backingTrack._backing.getDurationFromMetadata(options);
}
async getLiveRefreshInterval(): Promise<number | null> {
if (!this.internalTrack.backingTrack) {
throw new TrackNotHydratedError();
-1
View File
@@ -12,7 +12,6 @@ const IV_STRING_REGEX = /^0[xX][0-9a-fA-F]+$/;
export type HlsSegment = Segment & {
sequenceNumber: number | null;
location: HlsSegmentLocation;
duration: number;
encryption: HlsEncryptionInfo | null;
firstSegment: HlsSegment | null;
initSegment: HlsSegment | null;