在ffmpeg AWS Lambda层中使用ffprobe输出文件详细信息

时间:2019-03-07 21:23:24

标签: javascript node.js amazon-web-services ffmpeg aws-lambda

我正在尝试使用ffprobe选项使用ffmpeg输出音频文件的详细信息。但是现在它只是返回“ null”吗?我在Lambda中添加了ffmpeg图层。谁能发现为什么这行不通?

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 Lambda层,这是一个很好的项目,但是缺少文档。

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

2 个答案:

答案 0 :(得分:2)

首先,我建议使用NodeJS 8.10而不是NodeJs 6.10(尽管AWS尚不清楚支持的时间长短,但很快就会停产)

此外,我不会将旧样式处理程序与回调一起使用。

下面的工作示例-由于它可以从Internet下载文件(不必费心创建一个程序包,并在上传了文件的情况下在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文件夹可以容纳512MB,因此,如果您使用许多较大的flac文件,它可以很快用完

答案 1 :(得分:0)

我对这一层并不完全熟悉,但是从查看缩略图生成器的git repo来看,它看起来像child_process is a promise,所以您应该等待使用.then()的结果,否则正在返回null,因为它不等待结果。

因此,请尝试以下操作:

return spawnSync(
    "/opt/bin/ffprobe",
    [
        `var/task/myaudio.flac`
    ],
    { stdio: "inherit" }
    ).then(result => {
      return result;
    })
    .catch(error => {
      //handle error
    });