From ca826321895912ea21464befda08b47eb6d3c0c7 Mon Sep 17 00:00:00 2001 From: Johnathan Amit-Kanarek Date: Wed, 2 Dec 2020 11:29:04 +0200 Subject: [PATCH] support setting sample-rate --- package-lock.json | 6 + package.json | 2 + readme.md | 10 + src/normalizer.js | 1066 ++++++++++++++++++++--------------------- src/normalizer.js.map | 2 +- src/normalizer.ts | 38 +- 6 files changed, 568 insertions(+), 556 deletions(-) diff --git a/package-lock.json b/package-lock.json index 602ce72..1278622 100644 --- a/package-lock.json +++ b/package-lock.json @@ -406,6 +406,12 @@ "integrity": "sha512-ytooy2ZoIW+nahlxsJaugfY9Q5VYkRb8vzcOQGf1k0OFlwAnpRn59wIuYx04oFjqFvXjszTwJSdVx3qaM3nISQ==", "dev": true }, + "@types/ffprobe-static": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/ffprobe-static/-/ffprobe-static-2.0.0.tgz", + "integrity": "sha512-rjyutd/DyrjuWqux7oswuH9kox71HjvlSTO0TKW+tqQVcP3RN570D/G/vzy41/KSZe3NAaOJvxkHXnAxaHAjdg==", + "dev": true + }, "@types/glob": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", diff --git a/package.json b/package.json index 4f186dd..a763d24 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "node": ">=6.0.0" }, "scripts": { + "build": "tsc --build", "start": "node_modules/.bin/tsc --lib es2015 src/normalizer.ts", "test": "ava" }, @@ -32,6 +33,7 @@ }, "devDependencies": { "@types/ffmpeg-static": "^2.0.0", + "@types/ffprobe-static": "^2.0.0", "@types/node": "^12.6.8", "ava": "^2.2.0", "typescript": "^3.5.3" diff --git a/readme.md b/readme.md index c26b635..bf4346a 100644 --- a/readme.md +++ b/readme.md @@ -24,6 +24,7 @@ const normalize = require('ffmpeg-normalize'); normalize({ input: 'input.mp4', output: 'output.mp4', + sampleRate: '48k', loudness: { normalization: 'ebuR128', target: @@ -51,6 +52,7 @@ Parameters: * input * output +* sampleRate * loudness * verbose @@ -68,6 +70,14 @@ Required: `true` Path to the output file. +#### sampleRate + +Type: `string|number` +Required: `false` +Default: `48k` + +Audio sample rate. + #### loudness Type: `object` diff --git a/src/normalizer.js b/src/normalizer.js index 8476a42..f832b5f 100644 --- a/src/normalizer.js +++ b/src/normalizer.js @@ -1,543 +1,523 @@ -'use strict'; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -var __assign = (this && this.__assign) || function () { - __assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; -var __rest = (this && this.__rest) || function (s, e) { - var t = {}; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { - if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) - t[p[i]] = s[p[i]]; - } - return t; -}; -exports.__esModule = true; -var ffmpeg_static_1 = require("ffmpeg-static"); -var ffprobe_static_1 = require("ffprobe-static"); -var child = require("child_process"); -var path = require("path"); -var fs = require("fs"); -var Logger = /** @class */ (function () { - function Logger() { - } - Logger.prototype.setVerbosity = function (isVerbose) { - this.isVerbose = isVerbose; - }; - Logger.prototype.log = function () { - var rest = []; - for (var _i = 0; _i < arguments.length; _i++) { - rest[_i] = arguments[_i]; - } - if (this.isVerbose) { - console.log.apply(console, rest); - } - }; - Logger.prototype.error = function () { - var rest = []; - for (var _i = 0; _i < arguments.length; _i++) { - rest[_i] = arguments[_i]; - } - if (this.isVerbose) { - console.error(rest); - } - }; - return Logger; -}()); -var logger = new Logger(); -var NormalizationSetting = /** @class */ (function () { - function NormalizationSetting(_a) { - var base = _a.base, min = _a.min, max = _a.max; - this.min = min; - this.max = max; - this.base = base; - } - NormalizationSetting.prototype.isValid = function (value) { - return value >= this.min && value <= this.max; - }; - return NormalizationSetting; -}()); -var Validator = /** @class */ (function () { - function Validator() { - } - Validator.prototype.validate = function (_a) { - var name = _a.name, value = _a.value; - if (this[name]) { - if (this[name].isValid(Number(value))) { - logger.log("Loudness parameter validator:: " + name + " is in range."); - return Number(value); - } - else { - logger.log("Loudness parameter validator:: " + name + " is not in range setting default " + this[name].base + "."); - return this[name].base; - } - } - else { - logger.log("Loudness parameter validator:: " + name + " is not defined in current normalization method."); - return null; - } - }; - return Validator; -}()); -var EbuValidator = /** @class */ (function (_super) { - __extends(EbuValidator, _super); - function EbuValidator() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.input_i = new NormalizationSetting({ - base: -23, - min: -70.0, - max: -5.0 - }); - _this.input_lra = new NormalizationSetting({ - base: 7.0, - min: 1.0, - max: 20.0 - }); - _this.input_tp = new NormalizationSetting({ - base: -2.0, - min: -9.0, - max: 0.0 - }); - return _this; - } - return EbuValidator; -}(Validator)); -var PeakValidator = /** @class */ (function (_super) { - __extends(PeakValidator, _super); - function PeakValidator() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.input_i = new NormalizationSetting({ - base: -23, - min: -99, - max: 0 - }); - return _this; - } - return PeakValidator; -}(Validator)); -var RmsValidator = /** @class */ (function (_super) { - __extends(RmsValidator, _super); - function RmsValidator() { - return _super !== null && _super.apply(this, arguments) || this; - } - return RmsValidator; -}(PeakValidator)); -; -var Loudness = /** @class */ (function () { - function Loudness(_a, validator) { - var input_i = _a.input_i, input_lra = _a.input_lra, input_tp = _a.input_tp, input_thresh = _a.input_thresh, target_offset = _a.target_offset; - if (validator) { - this.input_i = validator.validate({ name: 'input_i', value: input_i }); - this.input_lra = validator.validate({ name: 'input_lra', value: input_lra }); - this.input_tp = validator.validate({ name: 'input_tp', value: input_tp }); - this.input_thresh = validator.validate({ name: 'input_thresh', value: input_thresh }); - this.target_offset = validator.validate({ name: 'target_offset', value: target_offset }); - } - else { - this.input_i = Number(input_i); - this.input_lra = Number(input_lra); - this.input_tp = Number(input_tp); - this.input_thresh = Number(input_thresh); - this.target_offset = Number(target_offset); - } - } - return Loudness; -}()); -var LoudnessFactory = /** @class */ (function () { - function LoudnessFactory() { - } - LoudnessFactory.build = function (_a) { - var normalization = _a.normalization, target = _a.target; - var validator = LoudnessFactory.buildValidator(normalization); - var loudness = new Loudness(target, validator); - return loudness; - }; - LoudnessFactory.buildValidator = function (normalization) { - switch (normalization) { - case 'ebuR128': - return new EbuValidator(); - case 'peak': - return new PeakValidator(); - case 'rms': - return new RmsValidator(); - default: - throw new Error('Unsupported normalization type.'); - } - }; - return LoudnessFactory; -}()); -var CommandFactory = /** @class */ (function () { - function CommandFactory() { - } - CommandFactory.measure = function (_a) { - var input = _a.input, loudness = _a.loudness, rest = __rest(_a, ["input", "loudness"]); - var command = ffmpeg_static_1.path + " -hide_banner "; - command += "-i \"" + input + "\" "; - command += "-af loudnorm="; - command += "I=" + loudness.input_i + ":"; - command += "LRA=" + loudness.input_lra + ":"; - command += "tp=" + loudness.input_tp + ":"; - command += 'print_format=json -f null -'; - return new Command({ - text: command, - processAfter: function (_a) { - var stderr = _a.stderr; - return Parser.getMeasurements(stderr); - } - }); - }; - CommandFactory.change = function (_a) { - var input = _a.input, output = _a.output, loudness = _a.loudness, measured = _a.measured; - var command = ffmpeg_static_1.path + " -hide_banner "; - command += "-i \"" + input + "\" "; - command += "-af loudnorm="; - command += "I=" + loudness.input_i + ":"; - if (loudness.input_lra) { - command += "LRA=" + loudness.input_lra + ":"; - } - if (loudness.input_tp) { - command += "tp=" + loudness.input_tp + ":"; - } - if (measured) { - command += "measured_I=" + measured.input_i + ":"; - command += "measured_LRA=" + measured.input_lra + ":"; - command += "measured_tp=" + measured.input_tp + ":"; - command += "measured_thresh=" + measured.input_thresh + ":"; - command += "offset=" + measured.target_offset + " "; - } - else { - command += " "; - } - command += "-ar 48k -y "; - command += "\"" + output + "\""; - return new Command({ - text: command, - processAfter: function () { } - }); - }; - CommandFactory.getDuration = function (input) { - var command = ffmpeg_static_1.path + " -hide_banner -i \"" + input + "\" -f null -"; - return new Command({ - text: command, - processAfter: function (_a) { - var stderr = _a.stderr; - return Parser.getDuration(stderr); - } - }); - }; - CommandFactory.addPadding = function (input, output) { - var command = ffmpeg_static_1.path + " -hide_banner -i \"" + input + "\" -af apad,atrim=0:3 -y \"" + output + "\""; - return new Command({ - text: command, - processAfter: function () { } - }); - }; - CommandFactory.removePadding = function (input, output, duration, temporaryFile) { - var command = ffmpeg_static_1.path + " -hide_banner -i \"" + input + "\" -af apad,atrim=0:" + duration + " -y \"" + output + "\""; - return new Command({ - text: command, - processAfter: function () { - fs.unlinkSync(temporaryFile); - } - }); - }; - return CommandFactory; -}()); -var Command = /** @class */ (function () { - function Command(_a) { - var text = _a.text, processAfter = _a.processAfter; - this.state = 'initalized'; - this.text = text; - this.processAfter = processAfter; - } - Command.prototype.execute = function (_a) { - var _this = this; - var success = _a.success, fail = _a.fail; - this.state = 'progress'; - logger.log('Executing: ', this.text); - child.exec(this.text, function (error, stdout, stderr) { - _this.state = 'finished'; - _this.error = error; - _this.stderr = stderr; - _this.stdout = stdout; - logger.log(stdout, stderr); - if (_this.error) { - return fail(_this); - } - else if (_this.processAfter) { - _this.processed = _this.processAfter(_this); - } - return success(_this); - }); - }; - return Command; -}()); -var Normalizer = /** @class */ (function () { - function Normalizer() { - } - Normalizer.validate = function (_a) { - var _this = this; - var input = _a.input, output = _a.output, loudness = _a.loudness, rest = __rest(_a, ["input", "output", "loudness"]); - return new Promise(function (resolve, reject) { - loudness = LoudnessFactory.build(loudness); - return _this.fileHasAudio(input) - .then(function (hasAudio) { - if (hasAudio) { - return resolve(__assign({ input: input, - output: output, - loudness: loudness }, rest)); - } - else { - return reject(new Error("No audio found on " + input + ".")); - } - }); - }); - }; - Normalizer.fileHasAudio = function (input) { - return new Promise(function (resolve) { - try { - var command = new Command({ text: ffprobe_static_1.path + " -i \"" + input + "\" -show_streams -select_streams a -loglevel error" }); - command.execute({ - success: function (_a) { - var stdout = _a.stdout, stderr = _a.stderr; - var numberOfAudioStreams = Parser.getNumberOfAudioStreams(stdout); - return resolve(numberOfAudioStreams > 0); - }, - fail: function (_a) { - var stderr = _a.stderr; - logger.error(stderr); - return resolve(false); - } - }); - } - catch (error) { - logger.error(error); - return resolve(false); - } - }); - }; - Normalizer.addPadding = function (_a, resolve, reject) { - var input = _a.input, output = _a.output, originalDuration = _a.originalDuration, rest = __rest(_a, ["input", "output", "originalDuration"]); - var basename = path.basename(output); - var tempOutput = path.join(path.dirname(output), '__temporary.' + basename); - var command = CommandFactory.addPadding(input, tempOutput); - command.execute({ - success: function (_a) { - var stdout = _a.stdout, stderr = _a.stderr, processed = _a.processed; - if (stderr) { - logger.error(stderr); - } - return resolve(__assign({ input: tempOutput, output: output, padded: true, originalDuration: originalDuration, temporaryFile: tempOutput }, rest)); - }, - fail: reject - }); - }; - Normalizer.removePadding = function (_a, resolve, reject) { - var input = _a.input, output = _a.output, originalDuration = _a.originalDuration, temporaryFile = _a.temporaryFile, rest = __rest(_a, ["input", "output", "originalDuration", "temporaryFile"]); - var command = CommandFactory.removePadding(input, output, originalDuration, temporaryFile); - command.execute({ - success: function (_a) { - var stdout = _a.stdout, stderr = _a.stderr, processed = _a.processed; - if (stderr) { - logger.error(stderr); - } - return resolve(__assign({ input: input, output: output, originalDuration: originalDuration }, rest)); - }, - fail: reject - }); - }; - Normalizer.pad = function (_a) { - var input = _a.input, rest = __rest(_a, ["input"]); - return new Promise(function (resolve, reject) { - var command = CommandFactory.getDuration(input); - command.execute({ - success: function (_a) { - var stdout = _a.stdout, stderr = _a.stderr, processed = _a.processed; - if (stderr) { - logger.error(stderr); - } - if (processed < 3) { - Normalizer.addPadding(__assign({ input: input, originalDuration: processed }, rest), resolve, reject); - } - else { - return resolve(__assign({ input: input }, rest)); - } - }, - fail: reject - }); - }); - }; - Normalizer.measure = function (_a) { - var input = _a.input, output = _a.output, loudness = _a.loudness, rest = __rest(_a, ["input", "output", "loudness"]); - return new Promise(function (resolve, reject) { - var command = CommandFactory.measure({ input: input, output: output, loudness: loudness }); - command.execute({ - success: function (_a) { - var stdout = _a.stdout, stderr = _a.stderr, processed = _a.processed; - if (stderr) { - logger.error(stderr); - } - return resolve(__assign({ input: input, - output: output, - loudness: loudness, measured: new Loudness(processed) }, rest)); - }, - fail: function (error) { - if (error) { - logger.error(error); - return resolve(__assign({ input: input, - output: output, - loudness: loudness, measured: null }, rest)); - } - } - }); - }); - }; - Normalizer.change = function (_a) { - var input = _a.input, output = _a.output, loudness = _a.loudness, measured = _a.measured, padded = _a.padded, rest = __rest(_a, ["input", "output", "loudness", "measured", "padded"]); - return new Promise(function (resolve, reject) { - var command = CommandFactory.change({ input: input, output: output, loudness: loudness, measured: measured }); - command.execute({ - success: function (_a) { - var stdout = _a.stdout, stderr = _a.stderr; - if (padded) { - Normalizer.removePadding(__assign({ input: input, output: output, loudness: loudness, measured: measured, padded: padded }, rest), resolve, reject); - } - else { - return resolve({ - normalized: true, - info: __assign({ input: input, - output: output, - loudness: loudness, - measured: measured }, rest) - }); - } - }, - fail: function (error) { - return reject({ - normalized: false, - error: error, - info: __assign({ input: input, - output: output, - loudness: loudness, - measured: measured }, rest) - }); - } - }); - }); - }; - return Normalizer; -}()); -; -var Parser = /** @class */ (function () { - function Parser() { - } - /** - * @summary Parse the last 12 line of ffmpeg measure output. - * @param {string} stdout - Output from the measure command. - * @returns {JSON} - { - "input_i" : "-25.05", - "input_tp" : "-4.90", - "input_lra" : "1.80", - "input_thresh" : "-35.24", - "output_i" : "-25.02", - "output_tp" : "-5.12", - "output_lra" : "1.50", - "output_thresh" : "-35.13", - "normalization_type" : "dynamic", - "target_offset" : "0.02" - }*/ - Parser.getMeasurements = function (stdout) { - try { - var data = stdout.trim().split('\n'); - var parsed = ""; - for (var i = data.length - 12; i < data.length; ++i) { - var line = data[i].trim().replace('/\t/g', ''); - parsed += line; - } - var measurements = JSON.parse(parsed); - return measurements; - } - catch (error) { - logger.error(error); - return null; - } - ; - }; - /** - * @summary Parse the ffmpeg output to extract the duration of a file. - * @param {string} stdout - Output from the command - * @returns Duration in seconds - */ - Parser.getDuration = function (stdout) { - try { - var durationRegex = /Duration:\s+(\d\d):(\d\d):(\d\d.\d+)/; - var match = durationRegex.exec(stdout); - if (match) { - return 3600 * Number(match[1]) + 60 * Number(match[2]) + Number(match[3]); - } - logger.error('Did not find duration'); - } - catch (error) { - logger.error(error); - return null; - } - }; - /** - * @summary Parses ffprobe output to check if the media file has audio streams. - * @param {string} stdout - * @returns {number} number of audio streams - */ - Parser.getNumberOfAudioStreams = function (stdout) { - var matches = stdout.match(/\/STREAM/g); - return matches ? matches.length : 0; - }; - return Parser; -}()); -module.exports.normalize = function (input) { - return new Promise(function (resolve, reject) { - logger.setVerbosity(input.verbose || false); - var normalization = input.loudness.normalization || 'ebuR128'; - return Normalizer.validate(input) - .then(function (validated) { return Normalizer.pad(validated); }) - .then(function (paddedInput) { - switch (normalization) { - case 'ebuR128': - return Normalizer.measure(paddedInput) - .then(function (measured) { - return resolve(Normalizer.change(measured)); - }); - case 'rms': - case 'peak': - return resolve(Normalizer.change(paddedInput)); - default: - throw new Error('Not supported normalization type.'); - } - })["catch"](function (error) { - logger.error(error); - return reject(__assign({ normalized: false, error: error.message ? error.message : error }, input)); - }); - }); -}; +'use strict'; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var ffmpeg_static_1 = require("ffmpeg-static"); +var ffprobe_static_1 = require("ffprobe-static"); +var child = require("child_process"); +var path = require("path"); +var fs = require("fs"); +var Logger = (function () { + function Logger() { + } + Logger.prototype.setVerbosity = function (isVerbose) { + this.isVerbose = isVerbose; + }; + Logger.prototype.log = function () { + var rest = []; + for (var _i = 0; _i < arguments.length; _i++) { + rest[_i] = arguments[_i]; + } + if (this.isVerbose) { + console.log.apply(console, rest); + } + }; + Logger.prototype.error = function () { + var rest = []; + for (var _i = 0; _i < arguments.length; _i++) { + rest[_i] = arguments[_i]; + } + if (this.isVerbose) { + console.error(rest); + } + }; + return Logger; +}()); +var logger = new Logger(); +var NormalizationSetting = (function () { + function NormalizationSetting(_a) { + var base = _a.base, min = _a.min, max = _a.max; + this.min = min; + this.max = max; + this.base = base; + } + NormalizationSetting.prototype.isValid = function (value) { + return value >= this.min && value <= this.max; + }; + return NormalizationSetting; +}()); +var Validator = (function () { + function Validator() { + } + Validator.prototype.validate = function (_a) { + var name = _a.name, value = _a.value; + if (this[name]) { + if (this[name].isValid(Number(value))) { + logger.log("Loudness parameter validator:: " + name + " is in range."); + return Number(value); + } + else { + logger.log("Loudness parameter validator:: " + name + " is not in range setting default " + this[name].base + "."); + return this[name].base; + } + } + else { + logger.log("Loudness parameter validator:: " + name + " is not defined in current normalization method."); + return null; + } + }; + return Validator; +}()); +var EbuValidator = (function (_super) { + __extends(EbuValidator, _super); + function EbuValidator() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.input_i = new NormalizationSetting({ + base: -23, + min: -70.0, + max: -5.0 + }); + _this.input_lra = new NormalizationSetting({ + base: 7.0, + min: 1.0, + max: 20.0 + }); + _this.input_tp = new NormalizationSetting({ + base: -2.0, + min: -9.0, + max: 0.0 + }); + return _this; + } + return EbuValidator; +}(Validator)); +var PeakValidator = (function (_super) { + __extends(PeakValidator, _super); + function PeakValidator() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.input_i = new NormalizationSetting({ + base: -23, + min: -99, + max: 0 + }); + return _this; + } + return PeakValidator; +}(Validator)); +var RmsValidator = (function (_super) { + __extends(RmsValidator, _super); + function RmsValidator() { + return _super !== null && _super.apply(this, arguments) || this; + } + return RmsValidator; +}(PeakValidator)); +; +var Loudness = (function () { + function Loudness(_a, validator) { + var input_i = _a.input_i, input_lra = _a.input_lra, input_tp = _a.input_tp, input_thresh = _a.input_thresh, target_offset = _a.target_offset; + if (validator) { + this.input_i = validator.validate({ name: 'input_i', value: input_i }); + this.input_lra = validator.validate({ name: 'input_lra', value: input_lra }); + this.input_tp = validator.validate({ name: 'input_tp', value: input_tp }); + this.input_thresh = validator.validate({ name: 'input_thresh', value: input_thresh }); + this.target_offset = validator.validate({ name: 'target_offset', value: target_offset }); + } + else { + this.input_i = Number(input_i); + this.input_lra = Number(input_lra); + this.input_tp = Number(input_tp); + this.input_thresh = Number(input_thresh); + this.target_offset = Number(target_offset); + } + } + return Loudness; +}()); +var LoudnessFactory = (function () { + function LoudnessFactory() { + } + LoudnessFactory.build = function (_a) { + var normalization = _a.normalization, target = _a.target; + var validator = LoudnessFactory.buildValidator(normalization); + var loudness = new Loudness(target, validator); + return loudness; + }; + LoudnessFactory.buildValidator = function (normalization) { + switch (normalization) { + case 'ebuR128': + return new EbuValidator(); + case 'peak': + return new PeakValidator(); + case 'rms': + return new RmsValidator(); + default: + throw new Error('Unsupported normalization type.'); + } + }; + return LoudnessFactory; +}()); +var CommandFactory = (function () { + function CommandFactory() { + } + CommandFactory.measure = function (_a) { + var input = _a.input, loudness = _a.loudness, rest = __rest(_a, ["input", "loudness"]); + var command = ffmpeg_static_1.path + " -hide_banner "; + command += "-i \"" + input + "\" "; + command += "-af loudnorm="; + command += "I=" + loudness.input_i + ":"; + command += "LRA=" + loudness.input_lra + ":"; + command += "tp=" + loudness.input_tp + ":"; + command += 'print_format=json -f null -'; + return new Command({ + text: command, + processAfter: function (_a) { + var stderr = _a.stderr; + return Parser.getMeasurements(stderr); + } + }); + }; + CommandFactory.change = function (_a) { + var input = _a.input, output = _a.output, sampleRate = _a.sampleRate, loudness = _a.loudness, measured = _a.measured; + sampleRate = sampleRate || '48k'; + var command = ffmpeg_static_1.path + " -hide_banner "; + command += "-i \"" + input + "\" "; + command += "-af loudnorm="; + command += "I=" + loudness.input_i + ":"; + if (loudness.input_lra) { + command += "LRA=" + loudness.input_lra + ":"; + } + if (loudness.input_tp) { + command += "tp=" + loudness.input_tp + ":"; + } + if (measured) { + command += "measured_I=" + measured.input_i + ":"; + command += "measured_LRA=" + measured.input_lra + ":"; + command += "measured_tp=" + measured.input_tp + ":"; + command += "measured_thresh=" + measured.input_thresh + ":"; + command += "offset=" + measured.target_offset + " "; + } + else { + command += " "; + } + command += "-ar " + sampleRate + " -y "; + command += "\"" + output + "\""; + return new Command({ + text: command, + processAfter: function () { } + }); + }; + CommandFactory.getDuration = function (input) { + var command = ffmpeg_static_1.path + " -hide_banner -i \"" + input + "\" -f null -"; + return new Command({ + text: command, + processAfter: function (_a) { + var stderr = _a.stderr; + return Parser.getDuration(stderr); + } + }); + }; + CommandFactory.addPadding = function (input, output) { + var command = ffmpeg_static_1.path + " -hide_banner -i \"" + input + "\" -af apad,atrim=0:3 -y \"" + output + "\""; + return new Command({ + text: command, + processAfter: function () { } + }); + }; + CommandFactory.removePadding = function (input, output, duration, temporaryFile) { + var command = ffmpeg_static_1.path + " -hide_banner -i \"" + input + "\" -af apad,atrim=0:" + duration + " -y \"" + output + "\""; + return new Command({ + text: command, + processAfter: function () { + fs.unlinkSync(temporaryFile); + } + }); + }; + return CommandFactory; +}()); +var Command = (function () { + function Command(_a) { + var text = _a.text, processAfter = _a.processAfter; + this.state = 'initalized'; + this.text = text; + this.processAfter = processAfter; + } + Command.prototype.execute = function (_a) { + var _this = this; + var success = _a.success, fail = _a.fail; + this.state = 'progress'; + logger.log('Executing: ', this.text); + child.exec(this.text, function (error, stdout, stderr) { + _this.state = 'finished'; + _this.error = error; + _this.stderr = stderr; + _this.stdout = stdout; + logger.log(stdout, stderr); + if (_this.error) { + return fail(_this); + } + else if (_this.processAfter) { + _this.processed = _this.processAfter(_this); + } + return success(_this); + }); + }; + return Command; +}()); +var Normalizer = (function () { + function Normalizer() { + } + Normalizer.validate = function (_a) { + var _this = this; + var input = _a.input, output = _a.output, sampleRate = _a.sampleRate, loudness = _a.loudness, rest = __rest(_a, ["input", "output", "sampleRate", "loudness"]); + return new Promise(function (resolve, reject) { + loudness = LoudnessFactory.build(loudness); + return _this.fileHasAudio(input) + .then(function (hasAudio) { + if (hasAudio) { + return resolve(__assign({ input: input, + output: output, + sampleRate: sampleRate, + loudness: loudness }, rest)); + } + else { + return reject(new Error("No audio found on " + input + ".")); + } + }); + }); + }; + Normalizer.fileHasAudio = function (input) { + return new Promise(function (resolve) { + try { + var command = new Command({ text: ffprobe_static_1.path + " -i \"" + input + "\" -show_streams -select_streams a -loglevel error" }); + command.execute({ + success: function (_a) { + var stdout = _a.stdout, stderr = _a.stderr; + var numberOfAudioStreams = Parser.getNumberOfAudioStreams(stdout); + return resolve(numberOfAudioStreams > 0); + }, + fail: function (_a) { + var stderr = _a.stderr; + logger.error(stderr); + return resolve(false); + } + }); + } + catch (error) { + logger.error(error); + return resolve(false); + } + }); + }; + Normalizer.addPadding = function (_a, resolve, reject) { + var input = _a.input, output = _a.output, originalDuration = _a.originalDuration, rest = __rest(_a, ["input", "output", "originalDuration"]); + var basename = path.basename(output); + var tempOutput = path.join(path.dirname(output), '__temporary.' + basename); + var command = CommandFactory.addPadding(input, tempOutput); + command.execute({ + success: function (_a) { + var stdout = _a.stdout, stderr = _a.stderr, processed = _a.processed; + if (stderr) { + logger.error(stderr); + } + return resolve(__assign({ input: tempOutput, output: output, padded: true, originalDuration: originalDuration, temporaryFile: tempOutput }, rest)); + }, + fail: reject + }); + }; + Normalizer.removePadding = function (_a, resolve, reject) { + var input = _a.input, output = _a.output, originalDuration = _a.originalDuration, temporaryFile = _a.temporaryFile, rest = __rest(_a, ["input", "output", "originalDuration", "temporaryFile"]); + var command = CommandFactory.removePadding(input, output, originalDuration, temporaryFile); + command.execute({ + success: function (_a) { + var stdout = _a.stdout, stderr = _a.stderr, processed = _a.processed; + if (stderr) { + logger.error(stderr); + } + return resolve(__assign({ input: input, output: output, originalDuration: originalDuration }, rest)); + }, + fail: reject + }); + }; + Normalizer.pad = function (_a) { + var input = _a.input, rest = __rest(_a, ["input"]); + return new Promise(function (resolve, reject) { + var command = CommandFactory.getDuration(input); + command.execute({ + success: function (_a) { + var stdout = _a.stdout, stderr = _a.stderr, processed = _a.processed; + if (stderr) { + logger.error(stderr); + } + if (processed < 3) { + Normalizer.addPadding(__assign({ input: input, originalDuration: processed }, rest), resolve, reject); + } + else { + return resolve(__assign({ input: input }, rest)); + } + }, + fail: reject + }); + }); + }; + Normalizer.measure = function (_a) { + var input = _a.input, output = _a.output, loudness = _a.loudness, rest = __rest(_a, ["input", "output", "loudness"]); + return new Promise(function (resolve, reject) { + var command = CommandFactory.measure({ input: input, output: output, loudness: loudness }); + command.execute({ + success: function (_a) { + var stdout = _a.stdout, stderr = _a.stderr, processed = _a.processed; + if (stderr) { + logger.error(stderr); + } + return resolve(__assign({ input: input, + output: output, + loudness: loudness, measured: new Loudness(processed) }, rest)); + }, + fail: function (error) { + if (error) { + logger.error(error); + return resolve(__assign({ input: input, + output: output, + loudness: loudness, measured: null }, rest)); + } + } + }); + }); + }; + Normalizer.change = function (_a) { + var input = _a.input, output = _a.output, sampleRate = _a.sampleRate, loudness = _a.loudness, measured = _a.measured, padded = _a.padded, rest = __rest(_a, ["input", "output", "sampleRate", "loudness", "measured", "padded"]); + return new Promise(function (resolve, reject) { + var command = CommandFactory.change({ input: input, output: output, sampleRate: sampleRate, loudness: loudness, measured: measured }); + command.execute({ + success: function (_a) { + var stdout = _a.stdout, stderr = _a.stderr; + if (padded) { + Normalizer.removePadding(__assign({ input: input, output: output, loudness: loudness, measured: measured, padded: padded }, rest), resolve, reject); + } + else { + return resolve({ + normalized: true, + info: __assign({ input: input, + output: output, + sampleRate: sampleRate, + loudness: loudness, + measured: measured }, rest) + }); + } + }, + fail: function (error) { + return reject({ + normalized: false, + error: error, + info: __assign({ input: input, + output: output, + sampleRate: sampleRate, + loudness: loudness, + measured: measured }, rest) + }); + } + }); + }); + }; + return Normalizer; +}()); +; +var Parser = (function () { + function Parser() { + } + Parser.getMeasurements = function (stdout) { + try { + var data = stdout.trim().split('\n'); + var parsed = ""; + for (var i = data.length - 12; i < data.length; ++i) { + var line = data[i].trim().replace('/\t/g', ''); + parsed += line; + } + var measurements = JSON.parse(parsed); + return measurements; + } + catch (error) { + logger.error(error); + return null; + } + ; + }; + Parser.getDuration = function (stdout) { + try { + var durationRegex = /Duration:\s+(\d\d):(\d\d):(\d\d.\d+)/; + var match = durationRegex.exec(stdout); + if (match) { + return 3600 * Number(match[1]) + 60 * Number(match[2]) + Number(match[3]); + } + logger.error('Did not find duration'); + } + catch (error) { + logger.error(error); + return null; + } + }; + Parser.getNumberOfAudioStreams = function (stdout) { + var matches = stdout.match(/\/STREAM/g); + return matches ? matches.length : 0; + }; + return Parser; +}()); +module.exports.normalize = function (input) { + return new Promise(function (resolve, reject) { + logger.setVerbosity(input.verbose || false); + var normalization = input.loudness.normalization || 'ebuR128'; + return Normalizer.validate(input) + .then(function (validated) { return Normalizer.pad(validated); }) + .then(function (paddedInput) { + switch (normalization) { + case 'ebuR128': + return Normalizer.measure(paddedInput) + .then(function (measured) { + return resolve(Normalizer.change(measured)); + }); + case 'rms': + case 'peak': + return resolve(Normalizer.change(paddedInput)); + default: + throw new Error('Not supported normalization type.'); + } + }) + .catch(function (error) { + logger.error(error); + return reject(__assign({ normalized: false, error: error.message ? error.message : error }, input)); + }); + }); +}; +//# sourceMappingURL=normalizer.js.map \ No newline at end of file diff --git a/src/normalizer.js.map b/src/normalizer.js.map index f687c8c..3dfaf00 100644 --- a/src/normalizer.js.map +++ b/src/normalizer.js.map @@ -1 +1 @@ -{"version":3,"file":"normalizer.js","sourceRoot":"","sources":["normalizer.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"normalizer.js","sourceRoot":"","sources":["normalizer.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/normalizer.ts b/src/normalizer.ts index f566e92..0ee1ff6 100644 --- a/src/normalizer.ts +++ b/src/normalizer.ts @@ -63,6 +63,7 @@ class NormalizationSetting { } class Validator { + [key: string]: any; private type: string; public validate( { @@ -165,7 +166,7 @@ class LoudnessFactory { public static build({ normalization, target - }): Loudness { + }: any): Loudness { let validator = LoudnessFactory.buildValidator(normalization); let loudness = new Loudness(target, validator); return loudness; @@ -190,7 +191,7 @@ class CommandFactory { input, loudness, ...rest - }) { + }: any) { let command = `${ffmpeg_path} -hide_banner `; command += `-i "${input}" `; command += `-af loudnorm=`; @@ -210,9 +211,11 @@ class CommandFactory { static change({ input, output, + sampleRate, loudness, measured - }) { + }: any) { + sampleRate = sampleRate || '48k'; let command = `${ffmpeg_path} -hide_banner `; command += `-i "${input}" `; command += `-af loudnorm=`; @@ -233,7 +236,7 @@ class CommandFactory { else { command += " "; } - command += `-ar 48k -y `; + command += `-ar ${sampleRate} -y `; command += `"${output}"`; return new Command({ @@ -334,9 +337,10 @@ class Normalizer { { input, output, + sampleRate, loudness, ...rest - } + }: any ) { return new Promise((resolve, reject) => { loudness = LoudnessFactory.build(loudness); @@ -346,6 +350,7 @@ class Normalizer { return resolve({ input, output, + sampleRate, loudness, ...rest }) @@ -379,7 +384,7 @@ class Normalizer { }); } - private static addPadding({ input, output, originalDuration, ...rest }, resolve, reject) { + private static addPadding({ input, output, originalDuration, ...rest }: any, resolve: Function, reject: Function) { const basename = path.basename(output); const tempOutput = path.join(path.dirname(output), '__temporary.' + basename); @@ -405,7 +410,7 @@ class Normalizer { }); } - private static removePadding({ input, output, originalDuration, temporaryFile, ...rest }, resolve, reject) { + private static removePadding({ input, output, originalDuration, temporaryFile, ...rest }: any, resolve: Function, reject: Function) { let command = CommandFactory.removePadding(input, output, originalDuration, temporaryFile); command.execute({ success: ({ stdout, stderr, processed }: ChildProcessSuccessMessage) => { @@ -425,7 +430,7 @@ class Normalizer { }); } - public static pad({ input, ...rest }) { + public static pad({ input, ...rest }: any) { return new Promise((resolve, reject) => { let command = CommandFactory.getDuration(input); command.execute({ @@ -455,7 +460,7 @@ class Normalizer { output, loudness, ...rest - }) { + }: any) { return new Promise((resolve, reject) => { let command = CommandFactory.measure({ input, output, loudness }); command.execute({ @@ -492,13 +497,14 @@ class Normalizer { { input, output, + sampleRate, loudness, measured, padded, ...rest - }) { + }: any) { return new Promise((resolve, reject) => { - let command = CommandFactory.change({ input, output, loudness, measured }); + let command = CommandFactory.change({ input, output, sampleRate, loudness, measured }); command.execute({ success: ({ stdout, stderr }: { stdout: string, stderr: string }) => { @@ -510,6 +516,7 @@ class Normalizer { info: { input, output, + sampleRate, loudness, measured, ...rest @@ -527,6 +534,7 @@ class Normalizer { info: { input, output, + sampleRate, loudness, measured, ...rest @@ -603,7 +611,13 @@ class Parser { } } -module.exports.normalize = input => { +module.exports.normalize = (input: { + input: string, + output: string, + sampleRate: string|number, + loudness: any, + verbose: boolean, +}) => { return new Promise((resolve, reject) => { logger.setVerbosity(input.verbose || false); const normalization = input.loudness.normalization || 'ebuR128';