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
+31
View File
@@ -447,6 +447,26 @@ export class IsobmffDemuxer extends Demuxer {
})();
}
async getDurationFromMetadata(): Promise<number | null> {
await this.readMetadata();
if (this.movieDurationInTimescale <= 0) {
// The duration is often zero for fragmented files for example; return `null` to signal that the duration
// must be computed instead.
return null;
}
let endTimestamp = this.movieDurationInTimescale / this.movieTimescale;
if (this.tracks.length > 0) {
const minFirstTimestamp = Math.min(
...(await Promise.all(this.tracks.map(x => x.inputTrack!.getFirstTimestamp()))),
);
endTimestamp += minFirstTimestamp;
}
return endTimestamp;
}
getSampleTableForTrack(internalTrack: InternalTrack) {
if (internalTrack.sampleTable) {
return internalTrack.sampleTable;
@@ -2560,6 +2580,17 @@ abstract class IsobmffTrackBacking implements InputTrackBacking {
return null;
}
async getDurationFromMetadata() {
const track = this.internalTrack;
if (track.durationInMediaTimescale <= 0) {
return null;
}
assert(track.inputTrack);
return (await track.inputTrack.getFirstTimestamp()) + track.durationInMediaTimescale / track.timescale;
}
async getLiveRefreshInterval() {
return null;
}