【问题标题】:Convert .m4a to .wav将 .m4a 转换为 .wav
【发布时间】:2017-09-24 12:05:16
【问题描述】:

我需要将缓冲区音频文件 .m4a 转换为缓冲区音频文件 .wav 以通过 NodeJS 发送到谷歌语音 api

var toWav = require('audiobuffer-to-wav')
var xhr = require('xhr')
var context = new AudioContext()

// request the MP3 as binary 
xhr({
  uri: 'audio/track.mp3',
  responseType: 'arraybuffer'
}, function (err, body, resp) {
  if (err) throw err
  // decode the MP3 into an AudioBuffer 
  audioContext.decodeAudioData(resp, function (buffer) {
    // encode AudioBuffer to WAV 
    var wav = toWav(buffer)

    // do something with the WAV ArrayBuffer ... 
  })
})

我有错误

AudioContext is not defined

【问题讨论】:

  • 然后会发生什么?
  • 所以我尝试使用 audiobuffer-to-wav 但 AudioContext() 是错误的
  • 具体是什么错误?
  • AudioContext is not defined audiobuffer-to-wav
  • nodejs中没有AudioContext。我认为你需要使用这个库客户端。

标签: node.js buffer google-speech-api


【解决方案1】:

使用 ffmpeg

(在mac上安装ffmpeg brew install ffmpeg

var ffmpeg = require('fluent-ffmpeg');

function convertFileFormat(file, destination, error, progressing, finish) {

ffmpeg(file)
    .on('error', (err) => {
        console.log('An error occurred: ' + err.message);
        if (error) {
            error(err.message);
        }
    })
    .on('progress', (progress) => {
        // console.log(JSON.stringify(progress));
        console.log('Processing: ' + progress.targetSize + ' KB converted');
        if (progressing) {
            progressing(progress.targetSize);
        }
    })
    .on('end', () => {
        console.log('converting format finished !');
        if (finish) {
            finish();
        }
    })
    .save(destination);

    }

    convertFileFormat('file.m4a', 'file.wav', function (errorMessage) {

        }, null, function () {
            console.log("success");
        });

【讨论】:

    【解决方案2】:

    如果您需要使用这个库服务器端,您可以使用web-audio-api 包模拟AudioContext 功能。

    const fs = require('fs');
    const toWav = require('audiobuffer-to-wav');
    const AudioContext = require('web-audio-api').AudioContext;
    const audioContext = new AudioContext;
    
    let resp = fs.readFileSync('sample.m4a');
    
    audioContext.decodeAudioData(resp, buffer => {
      let wav = toWav(buffer);
      // do something with the WAV ArrayBuffer ...
    });
    

    【讨论】:

    • 我在后端使用节点
    • 是的,我明白了。
    【解决方案3】:

    参考:https://askubuntu.com/questions/65331/how-to-convert-a-m4a-sound-file-to-mp3

    sudo apt-get install libav-tools
    
    avconv -i input.m4a ouptut.wav
    

    它对我有用!

    【讨论】:

    • 这是编程问题,而不是如何用软件来解决
    猜你喜欢
    • 2011-06-17
    • 2023-04-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    相关资源
    最近更新 更多