77 lines
1.8 KiB
JavaScript
77 lines
1.8 KiB
JavaScript
|
|
"use strict";
|
|
|
|
var opus = require('../../');
|
|
var fs = require('fs');
|
|
|
|
//
|
|
// Generate a sin tone.
|
|
//
|
|
var freq = 123;
|
|
var time = 5;
|
|
var rate = 48000;
|
|
|
|
// Allocate a buffer for the tone. We use 16-bit samples.
|
|
var samples = rate*time;
|
|
var length = samples*2;
|
|
var b = new Buffer(length);
|
|
|
|
// Generate the tone.
|
|
for( var i = 0; i < rate*time; i++ ) {
|
|
var value = Math.round( Math.sin( 2*Math.PI*i*freq/rate ) * Math.pow( 2, 14 ) );
|
|
b.writeInt16LE( value, i*2 );
|
|
}
|
|
|
|
//
|
|
// Create the encoder.
|
|
//
|
|
|
|
// Use 20ms frames.
|
|
var frame_size = rate * 0.02;
|
|
var encoder = new opus.OpusEncoder( rate );
|
|
|
|
// Open the output streams.
|
|
var output = fs.createWriteStream( 'out.opus' );
|
|
var input_raw = fs.createWriteStream( 'in.pcm' );
|
|
var output_raw = fs.createWriteStream( 'out.pcm' );
|
|
|
|
var read = 0;
|
|
while( b.length > 0 ) {
|
|
var size = Math.min( b.length, frame_size );
|
|
|
|
// If the input buffer is smaller than the frame_size, copy it into a new 0-padded buffer.
|
|
if( size < frame_size ) {
|
|
var temp = new Buffer( frame_size );
|
|
temp.fill(0);
|
|
b.copy( temp );
|
|
b = temp;
|
|
}
|
|
|
|
// We encode frame_size 16-bit samples. This requires a frame_size*2 buffer of bytes.
|
|
var bufferSize = frame_size * 2;
|
|
var toEncode = b.slice(0, bufferSize);
|
|
console.log( frame_size );
|
|
|
|
// Encode and decode.
|
|
var encoded = encoder.encode( toEncode );
|
|
var decoded = encoder.decode( encoded );
|
|
|
|
// Write the results in the output files.
|
|
input_raw.write( toEncode );
|
|
output.write( encoded );
|
|
output_raw.write( decoded );
|
|
|
|
// Move the buffer forward by the buffer size.
|
|
b = b.slice( bufferSize );
|
|
}
|
|
|
|
output.end();
|
|
input_raw.end();
|
|
output_raw.end();
|
|
|
|
console.log( 'Wrote following files.' );
|
|
console.log( 'in.pcm : Input PCM signal' );
|
|
console.log( 'out.opus : OPUS encoded input signal' );
|
|
console.log( 'out.pcm : Decoded PCM signal' );
|
|
|