Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import beamcoder from 'beamcoder';
- import path from 'path';
- import { performance } from 'perf_hooks';
- export async function run() {
- const startTime = performance.now();
- const demuxer = await beamcoder.demuxer(
- `file:${path.resolve('example.wav')}`
- );
- const decoder = await beamcoder.decoder({
- params: demuxer.streams[0].codecpar
- });
- const encoder = await beamcoder.encoder({
- name: 'libopus',
- time_base: demuxer.streams[0].time_base,
- sample_fmt: 's16',
- sample_rate: 24000,
- channels: 1,
- bit_rate: 64000,
- channel_layout: 'mono'
- });
- const filterer = await beamcoder.filterer({
- filterType: 'audio',
- // FIXME: Should we use p=0 or p=1?
- // If set to 1, the filter will pad the last audio frame with zeroes,
- // so that the last frame will contain the same number of samples as the previous ones.
- // Default value is 1
- filterSpec: `asetnsamples=n=${(encoder.sample_rate / 1000) * 20}:p=1`,
- inputParams: [
- {
- channelLayout: decoder.channel_layout,
- sampleFormat: decoder.sample_fmt,
- sampleRate: decoder.sample_rate,
- timeBase: decoder.time_base
- }
- ],
- outputParams: [
- {
- channelLayout: encoder.channel_layout,
- sampleFormat: encoder.sample_fmt,
- sampleRate: encoder.sample_rate
- }
- ]
- });
- const muxer = beamcoder.muxer({ filename: 'file:result.ogg' });
- const stream = muxer.newStream({
- name: 'libopus',
- extradata: Buffer.from('T3B1c0hlYWQBATgBwF0AAAAAAA==', 'base64'),
- sample_rate: encoder.sample_rate,
- sample_fmt: encoder.sample_fmt,
- channels: demuxer.streams[0].codecpar.channels,
- time_base: demuxer.streams[0].time_base
- });
- Object.assign(stream.codecpar, {
- extradata: Buffer.from('T3B1c0hlYWQBATgBwF0AAAAAAA==', 'base64'),
- sample_rate: encoder.sample_rate,
- sample_fmt: encoder.sample_fmt,
- channels: demuxer.streams[0].codecpar.channels,
- time_base: demuxer.streams[0].time_base
- });
- await muxer.openIO();
- await muxer.writeHeader();
- while (true) {
- const packet = await demuxer.read();
- if (!packet) break;
- const packets = await decoder
- .decode(packet)
- .then((result) => filterer.filter(result.frames))
- .then((result) => result[0].frames)
- .then((frames) => encoder.encode(frames))
- .then((result) => result.packets);
- for (const packet of packets) await muxer.writeFrame(packet);
- }
- await muxer.writeTrailer();
- console.log(`Took ${(performance.now() - startTime).toFixed(1)}ms`);
- global.gc()
- }
- run();
Add Comment
Please, Sign In to add comment