Initial working version
This commit is contained in:
+56
@@ -0,0 +1,56 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.OpusParser = void 0;
|
||||
const Token = require("token-types");
|
||||
const Opus = require("./Opus");
|
||||
const VorbisParser_1 = require("../vorbis/VorbisParser");
|
||||
/**
|
||||
* Opus parser
|
||||
* Internet Engineering Task Force (IETF) - RFC 6716
|
||||
* Used by OggParser
|
||||
*/
|
||||
class OpusParser extends VorbisParser_1.VorbisParser {
|
||||
constructor(metadata, options, tokenizer) {
|
||||
super(metadata, options);
|
||||
this.tokenizer = tokenizer;
|
||||
this.lastPos = -1;
|
||||
}
|
||||
/**
|
||||
* Parse first Opus Ogg page
|
||||
* @param {IPageHeader} header
|
||||
* @param {Buffer} pageData
|
||||
*/
|
||||
parseFirstPage(header, pageData) {
|
||||
this.metadata.setFormat('codec', 'Opus');
|
||||
// Parse Opus ID Header
|
||||
this.idHeader = new Opus.IdHeader(pageData.length).get(pageData, 0);
|
||||
if (this.idHeader.magicSignature !== "OpusHead")
|
||||
throw new Error("Illegal ogg/Opus magic-signature");
|
||||
this.metadata.setFormat('sampleRate', this.idHeader.inputSampleRate);
|
||||
this.metadata.setFormat('numberOfChannels', this.idHeader.channelCount);
|
||||
}
|
||||
parseFullPage(pageData) {
|
||||
const magicSignature = new Token.StringType(8, 'ascii').get(pageData, 0);
|
||||
switch (magicSignature) {
|
||||
case 'OpusTags':
|
||||
this.parseUserCommentList(pageData, 8);
|
||||
this.lastPos = this.tokenizer.position - pageData.length;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
calculateDuration(header) {
|
||||
if (this.metadata.format.sampleRate && header.absoluteGranulePosition >= 0) {
|
||||
// Calculate duration
|
||||
const pos_48bit = header.absoluteGranulePosition - this.idHeader.preSkip;
|
||||
this.metadata.setFormat('numberOfSamples', pos_48bit);
|
||||
this.metadata.setFormat('duration', pos_48bit / 48000);
|
||||
if (this.lastPos !== -1 && this.tokenizer.fileInfo.size && this.metadata.format.duration) {
|
||||
const dataSize = this.tokenizer.fileInfo.size - this.lastPos;
|
||||
this.metadata.setFormat('bitrate', 8 * dataSize / this.metadata.format.duration);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.OpusParser = OpusParser;
|
||||
Reference in New Issue
Block a user