我正在尝试使用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层,这是一个很好的项目,但是缺少文档。
答案 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
});