mirror of
https://github.com/jambonz/jambonz-api-server.git
synced 2026-01-25 02:08:24 +00:00
* feat: schema change * feat: record all calls * add bucket test for S3 * wip: add S3 upload stream implementation * wip * wip: add ws server * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip: modify sub folder * wip: add record endpoint * wip: add record endpoint * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * fix: failing testcase * bucket credentials with tags * add tagging * wip * wip * wip * wip * wip * wip * fixed phone number is not in order * feat: schema change * feat: record all calls * add bucket test for S3 * wip: add S3 upload stream implementation * wip * wip: add ws server * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip: modify sub folder * wip: add record endpoint * wip: add record endpoint * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * fix: failing testcase * bucket credentials with tags * add tagging * wip * wip * wip * wip * wip * fixed phone number is not in order * add schema changes to upgrade script * use aws-sdk v3 * jambonz lamejs * jambonz lamejs * add back wav encoder * wip: add record format to schema * add record_format * fix: record file ext * fix: record file ext * fix: record file ext * fix: record file ext * fix download audio * bug fix: dtmf metadata is causing closure of websocket * fix: add extra data to S3 metadata * upgrade db script * bugfix: region was being ignored in test s3 upload --------- Co-authored-by: Dave Horton <daveh@beachdognet.com>
55 lines
1.5 KiB
JavaScript
55 lines
1.5 KiB
JavaScript
const { Transform } = require('stream');
|
|
const lamejs = require('@jambonz/lamejs');
|
|
|
|
class PCMToMP3Encoder extends Transform {
|
|
constructor(options) {
|
|
super(options);
|
|
|
|
const channels = options.channels || 1;
|
|
const sampleRate = options.sampleRate || 8000;
|
|
const bitRate = options.bitRate || 128;
|
|
|
|
this.encoder = new lamejs.Mp3Encoder(channels, sampleRate, bitRate);
|
|
this.channels = channels;
|
|
}
|
|
|
|
_transform(chunk, encoding, callback) {
|
|
// Convert chunk buffer into Int16Array for lamejs
|
|
const samples = new Int16Array(chunk.buffer, chunk.byteOffset, chunk.length / 2);
|
|
|
|
// Split input samples into left and right channel arrays if stereo
|
|
let leftChannel, rightChannel;
|
|
if (this.channels === 2) {
|
|
leftChannel = new Int16Array(samples.length / 2);
|
|
rightChannel = new Int16Array(samples.length / 2);
|
|
|
|
for (let i = 0; i < samples.length; i += 2) {
|
|
leftChannel[i / 2] = samples[i];
|
|
rightChannel[i / 2] = samples[i + 1];
|
|
}
|
|
} else {
|
|
leftChannel = samples;
|
|
}
|
|
|
|
// Encode the input data
|
|
const mp3Data = this.encoder.encodeBuffer(leftChannel, rightChannel);
|
|
|
|
if (mp3Data.length > 0) {
|
|
this.push(Buffer.from(mp3Data));
|
|
}
|
|
callback();
|
|
}
|
|
|
|
_flush(callback) {
|
|
// Finalize encoding and flush the internal buffers
|
|
const mp3Data = this.encoder.flush();
|
|
|
|
if (mp3Data.length > 0) {
|
|
this.push(Buffer.from(mp3Data));
|
|
}
|
|
callback();
|
|
}
|
|
}
|
|
|
|
module.exports = PCMToMP3Encoder;
|