Guest User

Untitled

a guest
May 20th, 2022
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import beamcoder from 'beamcoder';
  2. import path from 'path';
  3. import { performance } from 'perf_hooks';
  4.  
  5. export async function run() {
  6.   const startTime = performance.now();
  7.   const demuxer = await beamcoder.demuxer(
  8.     `file:${path.resolve('example.wav')}`
  9.   );
  10.   const decoder = await beamcoder.decoder({
  11.     params: demuxer.streams[0].codecpar
  12.   });
  13.   const encoder = await beamcoder.encoder({
  14.     name: 'libopus',
  15.     time_base: demuxer.streams[0].time_base,
  16.     sample_fmt: 's16',
  17.     sample_rate: 24000,
  18.     channels: 1,
  19.     bit_rate: 64000,
  20.     channel_layout: 'mono'
  21.   });
  22.   const filterer = await beamcoder.filterer({
  23.     filterType: 'audio',
  24.     // FIXME: Should we use p=0 or p=1?
  25.     // If set to 1, the filter will pad the last audio frame with zeroes,
  26.     // so that the last frame will contain the same number of samples as the previous ones.
  27.     // Default value is 1
  28.     filterSpec: `asetnsamples=n=${(encoder.sample_rate / 1000) * 20}:p=1`,
  29.     inputParams: [
  30.       {
  31.         channelLayout: decoder.channel_layout,
  32.         sampleFormat: decoder.sample_fmt,
  33.         sampleRate: decoder.sample_rate,
  34.         timeBase: decoder.time_base
  35.       }
  36.     ],
  37.     outputParams: [
  38.       {
  39.         channelLayout: encoder.channel_layout,
  40.         sampleFormat: encoder.sample_fmt,
  41.         sampleRate: encoder.sample_rate
  42.       }
  43.     ]
  44.   });
  45.   const muxer = beamcoder.muxer({ filename: 'file:result.ogg' });
  46.  
  47.   const stream = muxer.newStream({
  48.     name: 'libopus',
  49.     extradata: Buffer.from('T3B1c0hlYWQBATgBwF0AAAAAAA==', 'base64'),
  50.     sample_rate: encoder.sample_rate,
  51.     sample_fmt: encoder.sample_fmt,
  52.     channels: demuxer.streams[0].codecpar.channels,
  53.     time_base: demuxer.streams[0].time_base
  54.   });
  55.   Object.assign(stream.codecpar, {
  56.     extradata: Buffer.from('T3B1c0hlYWQBATgBwF0AAAAAAA==', 'base64'),
  57.     sample_rate: encoder.sample_rate,
  58.     sample_fmt: encoder.sample_fmt,
  59.     channels: demuxer.streams[0].codecpar.channels,
  60.     time_base: demuxer.streams[0].time_base
  61.   });
  62.  
  63.   await muxer.openIO();
  64.   await muxer.writeHeader();
  65.  
  66.   while (true) {
  67.     const packet = await demuxer.read();
  68.     if (!packet) break;
  69.  
  70.     const packets = await decoder
  71.       .decode(packet)
  72.       .then((result) => filterer.filter(result.frames))
  73.       .then((result) => result[0].frames)
  74.       .then((frames) => encoder.encode(frames))
  75.       .then((result) => result.packets);
  76.  
  77.     for (const packet of packets) await muxer.writeFrame(packet);
  78.   }
  79.   await muxer.writeTrailer();
  80.   console.log(`Took ${(performance.now() - startTime).toFixed(1)}ms`);
  81.   global.gc()
  82. }
  83.  
  84. run();
  85.  
Add Comment
Please, Sign In to add comment