Skip to content

Commit

Permalink
MP4 parser: calculate duration using time-to-sample-table
Browse files Browse the repository at this point in the history
  • Loading branch information
Borewit committed Nov 1, 2023
1 parent 1c73f80 commit e299137
Showing 1 changed file with 13 additions and 3 deletions.
16 changes: 13 additions & 3 deletions lib/mp4/MP4Parser.ts
Expand Up @@ -213,14 +213,24 @@ export class MP4Parser extends BasicParser {
if (audioTracks.length >= 1) {
const audioTrack = audioTracks[0];

const duration = audioTrack.duration / audioTrack.timeScale;
this.metadata.setFormat('duration', duration); // calculate duration in seconds
if (audioTrack.timeScale > 0) {
const duration = audioTrack.duration / audioTrack.timeScale; // calculate duration in seconds
this.metadata.setFormat('duration', duration);
}

const ssd = audioTrack.soundSampleDescription[0];
if (ssd.description) {
this.metadata.setFormat('sampleRate', ssd.description.sampleRate);
this.metadata.setFormat('bitsPerSample', ssd.description.sampleSize);
this.metadata.setFormat('numberOfChannels', ssd.description.numAudioChannels);

if (audioTrack.timeScale === 0 && audioTrack.timeToSampleTable.length > 0) {
const totalSampleSize = audioTrack.timeToSampleTable
.map(ttstEntry => ttstEntry.count * ttstEntry.duration)
.reduce((total, sampleSize) => total + sampleSize);
const duration = totalSampleSize / ssd.description.sampleRate;
this.metadata.setFormat('duration', duration);
}
}
const encoderInfo = encoderDict[ssd.dataFormat];
if (encoderInfo) {
Expand Down Expand Up @@ -484,7 +494,7 @@ export class MP4Parser extends BasicParser {
},

/**
* time to sample
* time-to-sample table
*/
stts: async (len: number) => {
const stts = await this.tokenizer.readToken<AtomToken.ITableAtom<AtomToken.ITimeToSampleToken>>(new AtomToken.SttsAtom(len));
Expand Down

0 comments on commit e299137

Please sign in to comment.