node-fdkaac
Fraunhofer FDK AAC is a high-quality open-source AAC encoder. For all AAC and M4A encoding needs, a Node.js wrapper of the full fdkaac command line frontend (by nu774) based on libfdk-aac encoder.
The encoder reads linear PCM audio in either WAV, raw PCM or CAF format and encodes it into an M4A or an AAC file.
Requirements
- Linux or MacOS (Windows is NOT support by this package)
- libfdk-aac, fdkaac and ffmpeg installed (instructions see below)
- node 12.20.* or newer
Installation
You can install it with npm
:
$ npm install --save node-fdkaac
If you have not installed libfdk-aac, fdkaac and ffmpeg yet, you find a bash script to compile the source code as install.sh
in this package.
install.sh requirements:
- automake
- libtool
- git
Run on Debian
$ sudo apt-get install automake libtool git ffmpeg
$ chmod +x install.sh
$ sudo ./install.sh
Run on MacOS with brew
$ brew install automake libtool git ffmpeg
$ chmod +x install.sh
$ sudo ./install.sh
Example
Encode from file to file
const Fdkaac = require("node-fdkaac").Fdkaac;
const encoder = new Fdkaac({
output: "./audio-files/demo.m4a",
bitrate: 192,
}).setFile("./audio-files/demo.wav");
encoder
.encode()
.then(() => {
// Encoding finished
})
.catch((error) => {
// Something went wrong
});
Encode from file to buffer
const Fdkaac = require("node-fdkaac").Fdkaac;
const encoder = new Fdkaac({
output: "buffer",
bitrate: 192,
}).setFile("./audio-files/demo.wav");
encoder
.encode()
.then(() => {
// Encoding finished
const buffer = encoder.getBuffer();
})
.catch((error) => {
// Something went wrong
});
Encode from buffer to file
[...]
const Fdkaac = require("node-fdkaac").Fdkaac;
const encoder = new Fdkaac({
"output": "./audio-files/demo.m4a",
"bitrate": 192
}).setBuffer(audioFileBuffer);
encoder.encode()
.then(() => {
// Encoding finished
})
.catch((error) => {
// Something went wrong
});
Encode from buffer to buffer
[...]
const Fdkaac = require("node-fdkaac").Fdkaac;
const encoder = new Fdkaac({
"output": "buffer",
"bitrate": 192
}).setBuffer(audioFileBuffer);
encoder.encode()
.then(() => {
// Encoding finished
const buffer = encoder.getBuffer();
})
.catch((error) => {
// Something went wrong
});
Get status of encoder as object
const Fdkaac = require("node-fdkaac").Fdkaac;
const encoder = new Fdkaac({
output: "buffer",
bitrate: 192,
}).setFile("./audio-files/demo.wav");
encoder
.encode()
.then(() => {
// Encoding finished
})
.catch((error) => {
// Something went wrong
});
const status = encoder.getStatus();
Get status of encoder as EventEmitter
const Fdkaac = require("node-fdkaac").Fdkaac;
const encoder = new Fdkaac({
output: "buffer",
bitrate: 192,
}).setFile("./audio-files/demo.wav");
const emitter = encoder.getEmitter();
emitter.on("progress", ([progress, eta]) => {
// On progress of encoding; in percent and estimated time of arrival as 00:00
});
emitter.on("finish", () => {
// On finish
});
emitter.on("error", (error) => {
// On error
});
encoder
.encode()
.then(() => {
// Encoding finished
})
.catch((error) => {
// Something went wrong
});
Decode from file to file
const Fdkaac = require("node-fdkaac").Fdkaac;
const decoder = new Fdkaac({
output: "./audio-files/demo.wav",
}).setFile("./audio-files/demo.m4a");
decoder
.decode()
.then(() => {
// Decoding finished
})
.catch((error) => {
// Something went wrong
});
Decode from file to buffer
const Fdkaac = require("node-fdkaac").Fdkaac;
const decoder = new Lame({
output: "buffer",
}).setFile("./audio-files/demo.m4a");
decoder
.decode()
.then(() => {
// Decoding finished
const buffer = decoder.getBuffer();
})
.catch((error) => {
// Something went wrong
});
Decode from buffer to file
[...]
const Fdkaac = require("node-fdkaac").Fdkaac;
const decoder = new Lame({
"output": "./audio-files/demo.wav"
}).setBuffer(m4aInputBuffer);
decoder.decode()
.then(() => {
// Decoding finished
})
.catch((error) => {
// Something went wrong
});
Decode from buffer to buffer
[...]
const Fdkaac = require("node-fdkaac").Fdkaac;
const decoder = new Lame({
"output": "buffer"
}).setBuffer(mp4aInputBuffer);
decoder.decode()
.then(() => {
// Decoding finished
const buffer = decoder.getBuffer();
})
.catch((error) => {
// Something went wrong
});
All options
Option | Description | Values | Default |
---|---|---|---|
output | Output filename | Path | |
profile | Target profile (MPEG4 audio object type, AOT) |
2 (MPEG-4 AAC LC), 5 (MPEG-4 HE-AAC; SBR), 23 (MPEG-4 AAC LD), 29 (MPEG-4 HE-AAC v2; SBR+PS), 39 (MPEG-4 AAC ELD) |
2 |
bitrate | Target bitrate (for CBR) | Number | undefined |
bitrate-mode | Bitrate configuration mode. Available VBR quality value depends on other parameters such as profile, sample rate, or number of channels. |
0 (CBR), 1 -5 (VBR; higher value => higher bitrate) |
0 |
bandwidth | Frequency bandwidth (lowpass cut-off frequency) in Hz. Available on AAC LC only. | Number | undefined |
afterburner | Configure afterburner mode. When enabled, quality is increased at the expense of additional computational workload. |
0 (Off), 1 (On) |
1 |
lowdelay-sbr | Configure SBR activity on AAC ELD. |
-1 (Use ELD SBR auto configuration, 0 (Disable SBR on ELD), 1 (Enable SBR on ELD) |
0 |
sbr-ratio | Controls activation of downsampled SBR. |
0 (Use lib default), 1 (Use downsampled SBR; default for ELD+SBR), 2 (Use dual-rate SBR; default for HE-AAC) |
0 |
transport-format | Transport format. Tagging and gapless playback is only available on M4A. |
0 (M4A), 1 (ADIF), 2 (ADTS), 6 (LATM MCP=1), 7 (LATM MCP=0), 10 (LOAS/LATM; LATM within LOAS) |
0 |
adts-crc-check | Add CRC protection on ADTS header. | Boolean | false |
header-period | StreamMuxConfig/PCE repetition period in the transport layer. | Number | undefined |
gapless-mode | Method to declare amount of encoder delay (and padding) in M4A container. These values are mandatory for proper gapless playback on player side. |
0 (iTunSMPB), 1 (ISO standard; edts and sgpd), 2 (Both) |
0 |
include-sbr-delay | When specified, count SBR decoder delay in encoder delay. | Boolean | false |
ignorelength | Ignore length field of data chunk in input WAV file. | Boolean | false |
moov-before-mdat | Place moov box before mdat box in M4A container. This option might be important for some hardware players, that are known to refuse moov box placed after mdat box. | Boolean | false |
raw | Regard input as raw PCM. | Boolean | false |
raw-channels | Specify number of channels of raw input | Number | 2 |
raw-rate | Specify sample rate of raw input. | Number | 44100 |
raw-format | Specify sample format of raw input (details see nu774/fdkaac). | String | S16L |
meta | Meta data for M4A container. | Object | undefined |
Meta options
Option | Description | Values | Default |
---|---|---|---|
title | Set title tag. | String | undefined |
artist | Set artist tag. | String | undefined |
album | Set album tag. | String | undefined |
genre | Set genre tag. | String | undefined |
date | Set date tag. | String | undefined |
composer | Set composer tag. | String | undefined |
grouping | Set grouping tag. | String | undefined |
comment | Set comment tag. | String | undefined |
album-artist | Set album artist tag. | String | undefined |
track | Set track tag, with or without number of total tracks. | Number[/Total] | undefined |
disk | Set disk tag, with or without number of total discs. | Number[/Total] | undefined |
tempo | Set tempo (BPM) tag. | Number | undefined |
tag | Set iTunes predefined tag with explicit fourcc key and value. See iTunesMetadata for known predefined keys. | <fcc>:<value> | undefined |
long-tag | Set arbitrary tag as iTunes custom metadata. Stored in com.apple.iTunes field. | <fcc>:<value> | undefined |
Option description text from fdkaac by nu774. Based on fdkaac commit 4682fe4 from Jan 16, 2017.