Невозможно преобразовать видеофайл в аудиофайл внутри лямбда-функции AWS с помощью Node js - PullRequest
0 голосов
/ 20 февраля 2019

Я не могу преобразовать видеофайл в аудиофайл внутри лямбда-функции AWS с помощью Node JS.При запуске моей лямбда-функции она не выдает никакой ошибки, она выполняется без какой-либо ошибки.Но размер аудиофайла по-прежнему равен 0 МБ.Я не могу найти ошибки или какие-либо проблемы в моем коде.

Вот мой код,

const fs = require('fs');
const childProcess = require('child_process');
const AWS = require('aws-sdk');
const path = require('path');
AWS.config.update({
    region : 'us-east-2'
});
const s3 = new AWS.S3({apiVersion: '2006-03-01'});


exports.handler = (event, context, callback) => {
    process.env.PATH = process.env.PATH + ':/tmp/';
    process.env['FFMPEG_PATH'] = '/tmp/ffmpeg';
    const BIN_PATH = process.env['LAMBDA_TASK_ROOT'];
    process.env['PATH'] = process.env['PATH'] + ':' + BIN_PATH;

    childProcess.exec(
        'cp /var/task/ffmpeg /tmp/.; chmod 755 /tmp/ffmpeg;',
        function (error, stdout, stderr) {
            if (error) {
                console.log('Error occured',error);
            } else {
                var ffmpeg = '/tmp/ffmpeg';
                var createStream = fs.createWriteStream("/tmp/video.mp3");
                createStream.end();
                var params = {
                    Bucket: "test-bucket",
                    Key: event.Records[0].s3.object.key
                };
                s3.getObject(params, function(err, data) {
                    if (err) {
                        console.log("Error", err);
                    }
                    fs.writeFile("/tmp/vid.mp4", data.Body, function (err) {
                        if (err) console.log(err.code, "-", err.message);
                        return callback(err);
                    }, function() {
                        try {
                            var stats = fs.statSync("/tmp/vid.mp4");
                            console.log("size of the file1 ", stats["size"]);
                            try {
                                console.log("Yeah");
                                const inputFilename = "/tmp/vid.mp4";
                                const mp3Filename = "/tmp/video.mp3";
                                // // Convert the FLV file to an MP3 file using ffmpeg.
                                const ffmpegArgs = [
                                    '-i', inputFilename,
                                    '-vn', // Disable the video stream in the output.
                                    '-acodec', 'libmp3lame', // Use Lame for the mp3 encoding.
                                    '-ac', '2', // Set 2 audio channels.
                                    '-q:a', '6', // Set the quality to be roughly 128 kb/s.
                                    mp3Filename,
                                ];
                                try {
                                    const process = childProcess.spawnSync(ffmpeg, ffmpegArgs);
                                    console.log("stdout ", process.stdout);
                                    console.log("stderr ", process.stderr);
                                    console.log("tmp files ");
                                    fs.readdir('/tmp/', (err, files) => {
                                        files.forEach(file => {
                                            var stats = fs.statSync(`/tmp/${file}`);
                                            console.log("size of the file2 ", stats["size"]);
                                          console.log(file);
                                        });
                                      });

                                } catch (e) {
                                    console.log("error while converting video to audio ", e);
                                }

                                // return process;
                            } catch (e) {
                                console.log(e);
                            }
                        } catch (e) {
                            console.log("file is not complete", e);
                        }
                    }, function () {
                        console.log("checking ");
                        var stats = fs.statSync("/tmp/video.mp3");
                        console.log("size of the file2 ", stats["size"]);
                    });

                    return callback(err);
                });
            }
        }
    )
}

Рабочий процесс кода

Прежде всего, я скачал двоичный exec-файл ffmpeg и поместил его в каталог моего проекта.После этого я сжал свой проект и поместил его в лямбда-функцию.Эта лямбда-функция будет запускаться всякий раз, когда новые файлы загружаются в корзину S3.Я проверил / tmp / storage файлы и аудиофайл .mp3, но его размер равен 0 МБ.

Примечание

А также, в моем коде нижене звонит или эта часть не доходит.Когда я просматриваю журналы Cloudwatch, я не вижу сообщений этой консоли.Я не знаю, почему эта функция не вызывает.

function () {
        console.log("checking ");
        var stats = fs.statSync("/tmp/video.mp3");
        console.log("size of the file2 ", stats["size"]);
    });

Пожалуйста, помогите мне найти решение этой проблемы.Я потратил много раз, чтобы выяснить эту проблему.Но я не могу найти решение.Любые предложения приветствуются!Спасибо,

1 Ответ

0 голосов
/ 21 февраля 2019

Есть много ограничений, которые могут заставить лямбду бомбить при попытке сделать конверсию.Первое, что вам нужно сделать, это скомпилировать ffmpeg для AWS Linux, обычно вы должны компилировать статические ссылки вместо динамических ссылок.

Другой подход состоит в том, чтобы использовать докер-контейнер и запускать его на aws ecs fargate, это позволит вам намного легче контролировать зависимости, и у вас не будет никаких ограничений по времени выполнения, и вы все равно можете произвести аутсорсинг.управление машинами в AWS.

Транскодирование видео на Lambda https://intoli.com/blog/transcoding-on-aws-lambda/

Предварительно скомпилированный ffmpeg https://johnvansickle.com/ffmpeg/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...