converter.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import {promises} from 'fs';
  2. import {join} from 'path';
  3. import {spawn} from 'child_process';
  4. function ffmpeg(buffer, args = [], ext = '', ext2 = '') {
  5. return new Promise(async (resolve, reject) => {
  6. try {
  7. const tmp = join(global.__dirname(import.meta.url), '../tmp', + new Date + '.' + ext);
  8. const out = tmp + '.' + ext2;
  9. await promises.writeFile(tmp, buffer);
  10. spawn('ffmpeg', [
  11. '-y',
  12. '-i', tmp,
  13. ...args,
  14. out,
  15. ])
  16. .on('error', reject)
  17. .on('close', async (code) => {
  18. try {
  19. await promises.unlink(tmp);
  20. if (code !== 0) return reject(code);
  21. resolve({
  22. data: await promises.readFile(out),
  23. filename: out,
  24. delete() {
  25. return promises.unlink(out);
  26. },
  27. });
  28. } catch (e) {
  29. reject(e);
  30. }
  31. });
  32. } catch (e) {
  33. reject(e);
  34. }
  35. });
  36. }
  37. /**
  38. * Convert Audio to Playable WhatsApp Audio
  39. * @param {Buffer} buffer Audio Buffer
  40. * @param {String} ext File Extension
  41. * @return {Promise<{data: Buffer, filename: String, delete: Function}>}
  42. */
  43. function toPTT(buffer, ext) {
  44. return ffmpeg(buffer, [
  45. '-vn',
  46. '-c:a', 'libopus',
  47. '-b:a', '128k',
  48. '-vbr', 'on',
  49. ], ext, 'ogg');
  50. }
  51. /**
  52. * Convert Audio to Playable WhatsApp PTT
  53. * @param {Buffer} buffer Audio Buffer
  54. * @param {String} ext File Extension
  55. * @return {Promise<{data: Buffer, filename: String, delete: Function}>}
  56. */
  57. function toAudio(buffer, ext) {
  58. return ffmpeg(buffer, [
  59. '-vn',
  60. '-c:a', 'libopus',
  61. '-b:a', '128k',
  62. '-vbr', 'on',
  63. '-compression_level', '10',
  64. ], ext, 'opus');
  65. }
  66. /**
  67. * Convert Audio to Playable WhatsApp Video
  68. * @param {Buffer} buffer Video Buffer
  69. * @param {String} ext File Extension
  70. * @return {Promise<{data: Buffer, filename: String, delete: Function}>}
  71. */
  72. function toVideo(buffer, ext) {
  73. return ffmpeg(buffer, [
  74. '-c:v', 'libx264',
  75. '-c:a', 'aac',
  76. '-ab', '128k',
  77. '-ar', '44100',
  78. '-crf', '32',
  79. '-preset', 'slow',
  80. ], ext, 'mp4');
  81. }
  82. export {
  83. toAudio,
  84. toPTT,
  85. toVideo,
  86. ffmpeg,
  87. };