流浪的菜袅 2023-07-16 19:08 采纳率: 79.5%
浏览 52
已结题

微信小程序录音文件上传后端显示文件已损坏

我在小程序中调用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

img

img

这是为什么啊?有没有大锅帮忙看一下

  • 写回答

1条回答 默认 最新

  • 普通网友 2023-07-22 10:19
    关注

    问题可能出在文件的上传和保存过程中。在您的代码中,文件上传和保存看起来没有问题,但您可能忽略了音频文件的格式转换问题。微信小程序录音生成的文件格式可能不是常见的音频格式,因此在保存之前,您可能需要将其转换为可用的音频格式。

    在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等。

    在实际应用中,您可能还需要对上传的音频文件进行一些清理和管理,例如删除临时文件等,以确保系统资源得到有效利用。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 8月18日
  • 已采纳回答 8月10日
  • 创建了问题 7月16日

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀