[英]NodeJs - Fluent-FFMPEG cannot find FFMPEG for firebase cloud functions
I am trying to learn how to write a firebase cloud function with ffmpeg-fluent
and am referring to this sample code .我正在尝试学习如何使用ffmpeg-fluent
编写 firebase 云 function 并参考此示例代码。 I have copied the code, only changing the initialisation of gcs
to const gcs = admin.storage();
我已经复制了代码,只是将gcs
的初始化更改为const gcs = admin.storage();
. . The deployment on Node 10 was successful, but upon uploading an mp3
file to test the function, it gave me the following error.在节点 10 上部署成功,但是在上传mp3
文件以测试 function 时,它给了我以下错误。
Error: Cannot find ffmpeg at /srv/node_modules/fluent-ffmpeg/lib/processor.js:136:22
at FfmpegCommand.proto._getFfmpegPath (/srv/node_modules/fluent-ffmpeg/lib/capabilities.js:90:14)
at FfmpegCommand.proto._spawnFfmpeg (/srv/node_modules/fluent-ffmpeg/lib/processor.js:132:10)
at FfmpegCommand.proto.availableFormats.proto.getAvailableFormats (/srv/node_modules/fluent-ffmpeg/lib/capabilities.js:517:10)
at /srv/node_modules/fluent-ffmpeg/lib/capabilities.js:568:14
at nextTask (/srv/node_modules/async/dist/async.js:4578:27)
at Object.waterfall (/srv/node_modules/async/dist/async.js:4589:9)
at Object.awaitable(waterfall) [as waterfall] (/srv/node_modules/async/dist/async.js:208:32)
at FfmpegCommand.proto._checkCapabilities (/srv/node_modules/fluent-ffmpeg/lib/capabilities.js:565:11)
at /srv/node_modules/fluent-ffmpeg/lib/processor.js:298:14
Can someone enlighten me what installation steps have I missed out?有人可以告诉我我错过了哪些安装步骤吗?
Here is the code segment from the repository earlier.这是之前存储库中的代码段。
index.js index.js
const functions = require('firebase-functions');
const gcs = require('@google-cloud/storage')();
const path = require('path');
const os = require('os');
const fs = require('fs');
const ffmpeg = require('fluent-ffmpeg');
const ffmpeg_static = require('ffmpeg-static');
// Makes an ffmpeg command return a promise.
function promisifyCommand(command) {
return new Promise((resolve, reject) => {
command.on('end', resolve).on('error', reject).run();
});
}
/**
* When an audio is uploaded in the Storage bucket We generate a mono channel audio automatically using
* node-fluent-ffmpeg.
*/
exports.generateMonoAudio = functions.storage.object().onFinalize(async (object) => {
const fileBucket = object.bucket; // The Storage bucket that contains the file.
const filePath = object.name; // File path in the bucket.
const contentType = object.contentType; // File content type.
// Exit if this is triggered on a file that is not an audio.
if (!contentType.startsWith('audio/')) {
console.log('This is not an audio.');
return null;
}
// Get the file name.
const fileName = path.basename(filePath);
// Exit if the audio is already converted.
if (fileName.endsWith('_output.flac')) {
console.log('Already a converted audio.');
return null;
}
// Download file from bucket.
const bucket = gcs.bucket(fileBucket);
const tempFilePath = path.join(os.tmpdir(), fileName);
// We add a '_output.flac' suffix to target audio file name. That's where we'll upload the converted audio.
const targetTempFileName = fileName.replace(/\.[^/.]+$/, '') + '_output.flac';
const targetTempFilePath = path.join(os.tmpdir(), targetTempFileName);
const targetStorageFilePath = path.join(path.dirname(filePath), targetTempFileName);
await bucket.file(filePath).download({destination: tempFilePath});
console.log('Audio downloaded locally to', tempFilePath);
// Convert the audio to mono channel using FFMPEG.
let command = ffmpeg(tempFilePath)
.setFfmpegPath(ffmpeg_static.path)
.audioChannels(1)
.audioFrequency(16000)
.format('flac')
.output(targetTempFilePath);
await promisifyCommand(command);
console.log('Output audio created at', targetTempFilePath);
// Uploading the audio.
await bucket.upload(targetTempFilePath, {destination: targetStorageFilePath});
console.log('Output audio uploaded to', targetStorageFilePath);
// Once the audio has been uploaded delete the local file to free up disk space.
fs.unlinkSync(tempFilePath);
fs.unlinkSync(targetTempFilePath);
return console.log('Temporary files removed.', targetTempFilePath);
});
package.json package.json
{
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts": {
"lint": "eslint .",
"serve": "firebase emulators:start --only functions",
"shell": "firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "10"
},
"dependencies": {
"@google-cloud/storage": "^5.0.1",
"child-process-promise": "^2.2.1",
"ffmpeg-static": "^4.2.5",
"firebase-admin": "^8.10.0",
"firebase-functions": "^3.6.1",
"fluent-ffmpeg": "^2.1.2",
"fs-extra": "^8.1.0",
"sharp": "^0.25.3"
},
"devDependencies": {
"eslint": "^5.12.0",
"eslint-plugin-promise": "^4.0.1",
"firebase-functions-test": "^0.2.0"
},
"private": true
}
Here the ffmpeg_static.path
path is undefined这里ffmpeg_static.path
路径未定义
let command = ffmpeg(tempFilePath)
.setFfmpegPath(ffmpeg_static.path)
.audioChannels(1)
.audioFrequency(16000)
.format('flac')
.output(targetTempFilePath);
what you should do instead is install "ffmpeg-installer/ffmpeg".你应该做的是安装“ffmpeg-installer/ffmpeg”。 You can find it here: https://www.npmjs.com/package/@ffmpeg-installer/ffmpeg你可以在这里找到它: https://www.npmjs.com/package/@ffmpeg-installer/ffmpeg
Then set the correct path like:然后设置正确的路径,如:
const ffmpegPath = require('@ffmpeg-installer/ffmpeg').path;
const ffmpeg = require('fluent-ffmpeg');
let command = ffmpeg(tempFilePath)
.setFfmpegPath(ffmpegPath)
.audioChannels(1)
.audioFrequency(16000)
.format('flac')
.output(targetTempFilePath);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.