Вывод сведений о файле с использованием ffprobe в слое ffmpeg AWS Lambda - PullRequest
1 голос
/ 08 марта 2019

Я пытаюсь вывести детали аудиофайла с помощью ffmpeg, используя опцию ffprobe. Но это просто возвращает «ноль» в данный момент? Я добавил слой ffmpeg в Lambda. Кто-нибудь может определить, почему это не работает?

const { spawnSync } = require("child_process");
const { readFileSync, writeFileSync, unlinkSync } = require("fs");
const util = require('util');
var fs = require('fs');
let path = require("path");

exports.handler = (event, context, callback) => {

    spawnSync(
        "/opt/bin/ffprobe",
        [
            `var/task/myaudio.flac`
        ],
        { stdio: "inherit" }
        );
};

Это официальный лямбда-слой AWS, который я использую, это отличный проект, но немного не хватает документации.

https://github.com/serverlesspub/ffmpeg-aws-lambda-layer

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Прежде всего, я бы порекомендовал использовать NodeJS 8.10 вместо NodeJs 6.10 (скоро будет EOL, хотя AWS неясно, как долго он будет поддерживаться)

Кроме того, я бы не использовал обработчик старого стиля с обратным вызовом.

Рабочий пример, приведенный ниже - поскольку он загружает файл из Интернета (его не удосуживает создать пакет для развертывания в lambda с загруженным файлом), у него немного больше времени для работы.

const { spawnSync } = require("child_process");
const { readFileSync, writeFileSync, unlinkSync } = require("fs");
const util = require('util');
var fs = require('fs');
let path = require("path");
const https = require('https');


exports.handler = async (event) => {
    const source_url = 'https://upload.wikimedia.org/wikipedia/commons/b/b2/Bell-ring.flac'
    const target_path = '/tmp/test.flac'

    async function downloadFile()  {
        return new Promise((resolve, reject) => {
            const file = fs.createWriteStream(target_path);
            const request = https.get(source_url, function(response) {
              const stream = response.pipe(file)
              stream.on('finish', () => {resolve()})
            });
        });
    }

    await downloadFile()

    const test = spawnSync(
        "/opt/bin/ffprobe",
        [
            target_path
        ]
        );

    console.log(test.output.toString('utf8'))

    const response = {
        statusCode: 200,
        body: JSON.stringify([test.output.toString('utf8')]),
    };
    return response;
}

NB! В производственном процессе обязательно создайте уникальный временный файл, так как экземпляры, на которых запускается функция Lambda, часто передаются от вызова к вызову, вы не хотите, чтобы множественные вызовы наступали на файлы друг друга! Когда закончите, удалите временный файл, иначе у вас может не хватить свободного места на экземпляре, выполняющем ваши функции. Папка / tmp может занимать 512 МБ, поэтому она может быстро исчерпаться, если вы работаете со многими большими файлами flac

0 голосов
/ 08 марта 2019

Я не совсем знаком с этим слоем, однако, глядя на git-репозиторий построителя миниатюр, он выглядит так: child_process - это обещание , так что вы должны ждать его результата, используя .then(), иначе он возвращает ноль, потому что не ждет результата.

Так что попробуйте что-то вроде:

return spawnSync(
    "/opt/bin/ffprobe",
    [
        `var/task/myaudio.flac`
    ],
    { stdio: "inherit" }
    ).then(result => {
      return result;
    })
    .catch(error => {
      //handle error
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...