使用FFMPEG AWS LAMBDA层中的FFProbe输出文件详细信息



我正在尝试使用FFMPEG使用FFPROBE选项输出音频文件的详细信息。但这只是在返回" 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

首先,我建议在nodejs 6.10上使用nodejs 8.10(很快将是EOL,尽管AWS尚不清楚将支持多长时间)

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

下面的一个工作示例 - 因为它从Internet下载了文件(不愿意创建一个包裹以在lambda上部署使用文件)给它更多的时间工作时间。

const { spawnSync } = require('child_process');
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文件

,它可能会用完。

我对此层并不完全熟悉,但是从查看缩略图构建器的git仓库,看起来Child_process似乎是一个承诺,因此您应该在等待它的结果。

所以尝试类似:

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

最新更新