Преобразование wav в mp3 в узле js

Существуют ли какие-либо пакеты npn для преобразования файла wav в файл mp3 в узле js? Я хочу запустить этот скрипт в лямбда-функции aws. Я пробовал пакеты sox и sox-audio, но они не поддерживаются в лямбде. Я погуглил ffmpeg, не нашел преобразования между wav в mp3.

Кто-нибудь дает хороший пакет конвертации в node js?

console.log('New Lambda Call');

var async = require('async');
var aws = require('aws-sdk');
var fs = require('fs');
var uuid = require('node-uuid');
var SoxCommand = require('sox-audio');
var sox = require('sox');

var s3 = new aws.S3({ apiVersion: '2006-03-01' });

exports.handler = function(event, context) {

    //console.log('Reading event option : ', JSON.stringify(event, null, 2));

    var src_bucket = event.Records[0].s3.bucket.name;
    var key = event.Records[0].s3.object.key;
    var src_key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
    var dest_bucket = "dmlambda";
    var desk_key = src_key;

    var params = {
        Bucket: src_bucket,
        Key: src_key
    };

    if (src_bucket == dest_bucket) {
        console.error("Destination bucket must not match source bucket.");
        return;
    }

    var typeMatch = src_key.match(/\.([^.]*)$/);
    if (!typeMatch) {
        console.error('unable to infer audio type for key ' + src_key);
        return;
    }

    console.log()

    var audioType = typeMatch[1];
    if (audioType != "wav") {
        console.log('skipping non wav audio ' + src_key);
        return;
    }

    s3.getObject(params, function(err, data){

        if (err) {

            console.log(err);

            var message = "Error getting object " + src_key + " from bucket " + src_bucket +
                ". Make sure they exist and your bucket is in the same region as this function.";
            console.log(message);

        } else {

            console.log('Audio Content type:', data.ContentType);

            fs.writeFile('./tmp/temp_'+src_key, data.Body, {encoding: null}, function(err){

                if(err){

                    console.log("download file write error"+ err);

                } else {

                    console.log('Added temp_'+src_key+' to queue');

                    var arr = src_key.split(".");
                    var filename = arr[0];

                    var command = SoxCommand()
                            .input('./tmp/temp_'+src_key)
                            .output('./tmp/'+filename+'.mp3')
                            .outputFileType('mp3')
                            .outputSampleRate(44100)
                            .outputBits(192 * 1024)
                            .outputChannels(2);

                    command.on('prepare', function(args) {

                        console.log('Preparing sox command with args ' + args.join(' '));

                    });

                    command.on('start', function(commandLine) {

                        console.log('Spawned sox with command ' + commandLine);

                    });

                    command.on('progress', function(progress) {

                        console.log('Processing progress: ', progress);

                    });

                    command.on('error', function(err, stdout, stderr) {

                        console.log('Cannot process audio: ' + err.message);
                        console.log('Sox Command Stdout: ', stdout);
                        console.log('Sox Command Stderr: ', stderr);

                    });

                    command.on('end', function() {

                        fs.unlink('./tmp/temp_'+src_key, function(err){

                            if(err){

                                console.log("delete error : ",err);

                            } else {

                                console.log('Moved temp_'+src_key);

                            }

                        });

                        console.log('Sox command succeeded!');

                        var stream = fs.createReadStream('./tmp/'+filename+'.mp3');

                        s3.putObject({
                            Bucket: dest_bucket,
                            Key: filename+'.mp3',
                            Body: stream
                          }, function(err, data){
                             if(err){

                                console.log("upload error : ",err);

                             } else {

                                fs.unlink('./tmp/'+filename+'.mp3', function(err){

                                    if(err){

                                        console.log("delete error : ",err);

                                    } else {

                                        console.log('Moved '+filename+'.mp3');

                                    }

                                 });

                            }

                         });

                    });

                    command.run();

                }  

            });

        }

    });

};

Лямбда-лог:

2015-08-13T05:39:21.845Z    vg7ewk1gk1bjvn30    New Lambda Call

START RequestId: a5ec9286-417d-11e5-9a79-310ba41a5a40

2015-08-13T05:39:21.990Z    a5ec9286-417d-11e5-9a79-310ba41a5a40    

2015-08-13T05:39:22.285Z    a5ec9286-417d-11e5-9a79-310ba41a5a40    Audio Content type: audio/x-wav

2015-08-13T05:39:22.320Z    a5ec9286-417d-11e5-9a79-310ba41a5a40    Added temp_RE4bc9f41b1738c6def250a58e32d473aa.wav to queue

2015-08-13T05:39:22.322Z    a5ec9286-417d-11e5-9a79-310ba41a5a40    Preparing sox command with args ./tmp/temp_RE4bc9f41b1738c6def250a58e32d473aa.wav -t mp3 -r 44100 -b 196608 -c 2 ./tmp/RE4bc9f41b1738c6def250a58e32d473aa.mp3

2015-08-13T05:39:22.366Z    a5ec9286-417d-11e5-9a79-310ba41a5a40    Cannot process audio: Cannot find sox

2015-08-13T05:39:22.366Z    a5ec9286-417d-11e5-9a79-310ba41a5a40    Sox Command Stdout: null

2015-08-13T05:39:22.366Z    a5ec9286-417d-11e5-9a79-310ba41a5a40    Sox Command Stderr: 

END RequestId: a5ec9286-417d-11e5-9a79-310ba41a5a40
Process exited before completing request

person Ijas Ahamed N    schedule 13.08.2015    source источник
comment
Что значит sox не поддерживается? Насколько я знаю, AWS Lambda позволяет запускать собственные исполняемые файлы. См. aws.amazon.com/blogs/compute/running- исполняемые файлы в aws-лямбда   -  person deleted user    schedule 13.08.2015


Ответы (2)


пакет npm для sox — это просто интерфейс для интерфейс командной строки sox.

В журнале ошибок написано Cannot process audio: Cannot find sox. Это потому, что у вас не установлен CLI sox. Установите его.

Чтобы включить интерфейс командной строки sox в Lambda, с AWS блог:

Включить собственные исполняемые файлы несложно; просто упакуйте их в ZIP-файл, который вы загружаете, а затем ссылайтесь на них (включая относительный путь в созданном вами ZIP-файле), когда вы вызываете их из Node.js или из других процессов, которые вы ранее запускали. Убедитесь, что вы включили следующее в начало кода функции:

process.env['ПУТЬ'] = process.env['ПУТЬ'] + ‘:’ + process.env[‘LAMBDA_TASK_ROOT’]

Подводя итог, вы хотите:

  1. загрузите интерфейс командной строки sox здесь,
  2. включите его в zip, который вы загружаете,
  3. включите специальную строку process.env ... вверху файла узла и
  4. бежать
person deleted user    schedule 13.08.2015
comment
Как это можно установить в aws lambda? - person Ijas Ahamed N; 13.08.2015
comment
@IjasAhamed: эта команда npm просто установит интерфейс sox js, а не CLI sox. Взгляните на редактирование для получения конкретных инструкций. - person deleted user; 13.08.2015
comment
ХОРОШО. Я понял. Есть ли пакеты для конвертации - person Ijas Ahamed N; 13.08.2015
comment
@IjasAhamed эээ... sox? Я не понимаю вашего вопроса. Вы имеете в виду пакет, который не использует отдельную библиотеку, отличную от js? - person deleted user; 13.08.2015

Поскольку вы уже используете AWS. Почему бы вам не использовать для этого эластичный транскодер вместо Lambda. Эластичный транскодер специально предназначен для перекодирования аудио/видеофайлов.

Вы даже можете активировать его на основе файлов, помещенных в корзину s3.

person Ludo - Off the record    schedule 27.03.2016
comment
Мне приходилось конвертировать около 50 аудиозаписей в минуту. Таким образом, эластичный транскодер слишком дорог. - person Ijas Ahamed N; 28.03.2016
comment
Если количество аудио или время перекодирования ($$$) не проблема. В этом руководстве объясняется, как преобразовать в mp3 файлы, поступающие в формат s3: hackernoon.com/ - person Tomir Schmite Jr.; 14.12.2017