Skip to content

Commit 453ae66

Browse files
authored
Fix-duration (#99)
* fix wav file duration #95 * fix mp3 file duration #95 * fix: mark file not vbr when header is start with "Info" * fix: fallback for waveHeader.averageBytePerSecond * test: correct riff duration
1 parent dd565aa commit 453ae66

4 files changed

Lines changed: 12 additions & 8 deletions

File tree

src/mpeg/mpegAudioHeader.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ export default class MpegAudioHeader implements IAudioCodec {
9090
file.seek(position + XingHeader.xingHeaderOffset(header.version, header.channelMode));
9191

9292
const xingData = file.readBlock(16);
93-
if (xingData.length === 16 && xingData.startsWith(XingHeader.FILE_IDENTIFIER)) {
93+
if (xingData.length === 16 && (xingData.startsWith(XingHeader.FILE_IDENTIFIER) || xingData.startsWith(XingHeader.FILE_IDENTIFIER_INFO))) {
9494
header._xingHeader = XingHeader.fromData(xingData);
9595
}
9696

src/mpeg/xingHeader.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export default class XingHeader {
1111
* Identifier that appears in a file to indicate the start of a Xing header.
1212
*/
1313
public static readonly FILE_IDENTIFIER = ByteVector.fromString("Xing", StringType.Latin1).makeReadOnly();
14+
public static readonly FILE_IDENTIFIER_INFO = ByteVector.fromString("Info", StringType.Latin1).makeReadOnly();
1415

1516
/**
1617
* An empty an unset Xing header
@@ -48,8 +49,10 @@ export default class XingHeader {
4849
public static fromData(data: ByteVector): XingHeader {
4950
Guards.truthy(data, "data");
5051

52+
const isInfoHeader = data.startsWith(XingHeader.FILE_IDENTIFIER_INFO);
53+
5154
// Check to see if a valid Xing header is available
52-
if (!data.startsWith(XingHeader.FILE_IDENTIFIER)) {
55+
if (!data.startsWith(XingHeader.FILE_IDENTIFIER) && !isInfoHeader) {
5356
throw new CorruptFileError("Not a valid Xing header");
5457
}
5558

@@ -69,7 +72,7 @@ export default class XingHeader {
6972
header._totalSize = 0;
7073
}
7174

72-
header._isPresent = true;
75+
header._isPresent = !isInfoHeader;
7376

7477
return header;
7578
}

src/riff/riffFile.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -379,8 +379,9 @@ export default class RiffFile extends File {
379379
}
380380

381381
codecs = [waveHeader];
382-
durationMilliseconds = dataChunk.originalDataSize * 8000
383-
/ waveHeader.bitsPerSample / waveHeader.audioSampleRate;
382+
durationMilliseconds = waveHeader.averageBytesPerSecond
383+
? dataChunk.originalDataSize * 1000 / waveHeader.averageBytesPerSecond
384+
: dataChunk.originalDataSize * 8000 / waveHeader.bitsPerSample / waveHeader.audioSampleRate;
384385
break;
385386

386387
case "AVI ":

test-unit/riff/riffFileTests.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ import {Testers} from "../utilities/testers";
359359
assert.strictEqual(file.properties.codecs.length, 1);
360360
assert.isOk(file.properties.codecs.find((c) => c instanceof RiffWaveFormatEx));
361361
assert.isNotOk(file.properties.codecs.find((c) => c instanceof RiffBitmapInfoHeader));
362-
assert.approximately(file.properties.durationMilliseconds, 405, 1);
362+
assert.approximately(file.properties.durationMilliseconds, 426, 1);
363363

364364
assert.isOk(file.tag);
365365
assert.instanceOf(file.tag, RiffTags);
@@ -399,7 +399,7 @@ import {Testers} from "../utilities/testers";
399399
assert.strictEqual(file.properties.codecs.length, 1);
400400
assert.isOk(file.properties.codecs.find((c) => c instanceof RiffWaveFormatEx));
401401
assert.isNotOk(file.properties.codecs.find((c) => c instanceof RiffBitmapInfoHeader));
402-
assert.approximately(file.properties.durationMilliseconds, 405, 1);
402+
assert.approximately(file.properties.durationMilliseconds, 426, 1);
403403

404404
assert.isOk(file.tag);
405405
assert.instanceOf(file.tag, RiffTags);
@@ -507,7 +507,7 @@ import {Testers} from "../utilities/testers";
507507
assert.isOk(file.properties.codecs);
508508
assert.strictEqual(file.properties.codecs.length, 1);
509509
assert.isOk(file.properties.codecs.find((c) => c instanceof RiffWaveFormatEx));
510-
assert.approximately(file.properties.durationMilliseconds, 405, 1);
510+
assert.approximately(file.properties.durationMilliseconds, 426, 1);
511511

512512
assert.isOk(file.tag);
513513
assert.instanceOf(file.tag, RiffTags);

0 commit comments

Comments
 (0)