我在小程序中调用api录音,然后把录音文件上传到nodejs,成功后我想看一下录音文件,点开结果发现文件打不开
小程序代码:
// 结束录音
voiceEnd(e){
if(this.data.voiceShow != true) return
const that = this
recorderManager.stop()
recorderManager.onStop(async (res) => {
console.log('录音停止', res)
// tempFilePath = res.tempFilePath
this.setData({
tempFilePath:res.tempFilePath
})
innerAudioContext.src = res.tempFilePath
var uploadTask = wx.uploadFile({
filePath: res.tempFilePath,
name: 'voiceFile',
url: 'http://localhost:3000/api/voice',
header: {
"Content-Type": "multipart/form-data"
},
success:(e) => {
console.log('success',e);
},
fail: (e) => {
console.log('fail',e);
}
});
uploadTask.onProgressUpdate((e) => {
console.log(e);
console.log('期望上传的总字节数:' + e.totalBytesExpectedToSend);
console.log('已经上传的字节数' + e.totalBytesSent);
})
})
},
nodejs代码:
const express = require('express')
const ffmpeg = require('ffmpeg')
const router = express.Router()
const multer = require('multer')
// let upload = multer({ dest: 'routers/voiceup' })
// 处理上传文件时需要的数据
const { cutOutStr } = require('../utils/index')
const moment = require('moment')
let date = new Date()
let times = date.getTime()
let originalname;
let random = Math.floor(Math.random() * (1000 - 100 + 1)) + 100
let urlStr;
let src = ''
let storage = multer.diskStorage({
destination: function(req, file, cb) {
cb(null, 'routers/voiceup');
},
filename: function(req, file, cb) {
originalname = Buffer.from(file.originalname, "latin1").toString("utf8"); // 解决接收文件的文件名中文乱码问题
urlStr = originalname
times = date.getTime()
random = Math.floor(Math.random() * (10000 - 100 + 1)) + 100
src = 'http://localhost:3000/' + urlStr
cb(null, urlStr)
}
})
let upload = multer({ storage: storage });
router.post('/',upload.single('voiceFile'),(req,res) => {
try {
console.log('asssssssssssssssssssssss');
console.log('received',req.file);
// ffmpeg
res.send({code:200,msg:'上传成功'})
} catch(err) {
console.log(err);
res.status(500).send(err)
}
})
module.exports = router
这是为什么啊?有没有大锅帮忙看一下
问题可能出在文件的上传和保存过程中。在您的代码中,文件上传和保存看起来没有问题,但您可能忽略了音频文件的格式转换问题。微信小程序录音生成的文件格式可能不是常见的音频格式,因此在保存之前,您可能需要将其转换为可用的音频格式。
在Node.js中,您可以使用"ffmpeg"库来进行音频格式转换。但在您的代码中,虽然导入了ffmpeg
,但并没有实际进行音频格式转换的操作。
以下是在Node.js中使用ffmpeg
库来转换音频格式的示例代码:
const express = require('express');
const router = express.Router();
const multer = require('multer');
const ffmpeg = require('fluent-ffmpeg'); // 使用 "fluent-ffmpeg" 替代 "ffmpeg"
const storage = multer.diskStorage({
destination: function(req, file, cb) {
cb(null, 'routers/voiceup');
},
filename: function(req, file, cb) {
// 文件名的生成略去,与您现有代码相同
// ...
cb(null, urlStr);
},
});
const upload = multer({ storage: storage });
router.post('/', upload.single('voiceFile'), (req, res) => {
try {
console.log('received', req.file);
// 使用 "fluent-ffmpeg" 进行音频格式转换
const inputFilePath = req.file.path;
const outputFilePath = req.file.path + '.mp3'; // 转换为MP3格式,您可以根据需要更改为其他格式
ffmpeg(inputFilePath)
.toFormat('mp3')
.on('end', () => {
console.log('转换成功');
res.send({ code: 200, msg: '上传成功' });
})
.on('error', (err) => {
console.log('转换失败', err);
res.status(500).send(err);
})
.save(outputFilePath);
// 请注意:上述代码将音频文件转换为MP3格式,并保存到 outputFilePath 路径下。
// 您可以根据需要进行其他格式的转换,或直接覆盖原始文件。
} catch (err) {
console.log(err);
res.status(500).send(err);
}
});
module.exports = router;
请确保在Node.js环境中安装了"fluent-ffmpeg"库,您可以通过在项目目录中运行以下命令进行安装:
npm install fluent-ffmpeg
上述代码将在保存音频文件之前使用fluent-ffmpeg
将其转换为MP3格式。您可以根据需要修改为其他格式,例如AAC等。
在实际应用中,您可能还需要对上传的音频文件进行一些清理和管理,例如删除临时文件等,以确保系统资源得到有效利用。