1

我一直在尝试使用node-lame 库将文件从上传的比特率编码为 32 kbps 以节省空间,就像我使用Sharp压缩图像一样。

我的代码首先检查文件是否为音频文件。如果是,则制作编码器,并且应该对其进行编码:

if (aud.test(user_file)){

        const encoder = new Lame({
            "output": req.file.path,
            "bitrate": 32,
        }).setFile(req.file.path);
        
        await encoder
            .encode()
            .then(() => {})
            .catch((error) => {
                // Something went wrong
            });
    }

问题是它实际上并没有被编码。我也试过这个,.then但没有帮助。

.then(data => {
    fs.writeFileSync(req.file.path + '.mp3', data);
    user_file = user_file + '.mp3';
    fs.unlinkSync(req.file.path)
})

这应该是一个相当简单的库,所以我不知道我做错了什么。我正在尝试从文件到文件进行编码。

也试过这个:

const encoder = new Lame({
            "output": user_file + '.mp3',
            "bitrate": 32,
        }).setFile(req.file.path);
4

1 回答 1

1

我继续为此编写了一个演示。你可以在这里找到完整的 repo。我已经证实这确实有效,但请记住,这只是一个概念证明。

这是我的 Express 服务器的样子:


const express = require('express');
const fs = require('fs');
const path = require('path');
const fileUpload = require('express-fileupload');
const Lame = require('node-lame').Lame;

const app = express();

app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(fileUpload());

// File upload path
app.post('/upload', async (req, res) => {
  const fileToEncode = req.files.uploadedFile;
  if (!fileToEncode) {
    res.status(500).end();
    return;
  }

  const filePath = path.resolve('./uploads', fileToEncode.name);
  const outputPath = path.resolve('./uploads', fileToEncode.name + '-encoded.mp3');

  // Save uploaded file to disk
  await fileToEncode.mv(filePath);

  try {
    const encoder = new Lame({ 
      output: outputPath,
      bitrate: 8,
    }).setFile(filePath);
    await encoder.encode();
    res.download(outputPath);
  } catch (encodingError) {
    console.error(encodingError);
    res.status(500).send(encodingError);
  }

  // Removed files we saved on disk
  res.on('finish', async () => {
    await fs.unlinkSync(filePath);
    await fs.unlinkSync(outputPath);
  })
});

// Home page
app.get('*', (req, res) => {
    res.status(200).send(`
    <!DOCTYPE html>
    <html>
    <body>

    <p id="status"></p>

    <form method="post" enctype="multipart/form-data" action="/upload" onsubmit="handleOnSubmit(event, this)">
      <input name="uploadedFile" type="file" />
      <button id="submit">Submit Query</button>
    </form>

    <script>
    async function handleOnSubmit(e,form) {
      const statusEl = document.getElementById("status");
      statusEl.innerHTML = "Uploading ...";
      e.preventDefault();
      const resp = await fetch(form.action, { method:'post', body: new FormData(form) });
      const blob = await resp.blob();
      const href = await URL.createObjectURL(blob);
      Object.assign(document.createElement('a'), {
        href,
        download: 'encoded.mp3',
      }).click();
      statusEl.innerHTML = "Done. Check your console.";
    }
    </script>

    </body>
    </html>    
    `);
});

process.env.PORT = process.env.PORT || 3003;

app.listen(process.env.PORT, () => { 
    console.log(`Server listening on port ${process.env.PORT}`);
});
于 2021-09-01T00:38:02.923 回答