我正在尝试使用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
});