Pet*_*ter 5 ffmpeg node.js firebase fluent-ffmpeg firebase-storage
背景
我正在节点中连接 firebase 功能。目的是将入站音频剪辑解析为设定长度。使用 ffmpeg 和 Fluent-ffmpeg。
问题
当在 firebase 中触发该函数时,当 Fluent-Ffmpeg 尝试访问 Ffmpeg 二进制文件时,我收到 ENOENT 错误
Firebase 调试输出
错误:{错误:在 Process.ChildProcess._handle.onexit (internal/child_process.js)的exports._errnoException(util.js:1018:11)处生成./Cloud/functions/node_modules/ffmpeg-binaries/bin/ffmpeg ENOENT: 193:32) 在 onErrorNT (internal/child_process.js:367:16) 在 _combinedTickCallback (internal/process/next_tick.js:80:11) 在 process._tickDomainCallback (internal/process/next_tick.js:128:9) 代码:'ENOENT',errno:'ENOENT',系统调用:'spawn ./Cloud/functions/node_modules/ffmpeg-binaries/bin/ffmpeg',路径:'./Cloud/functions/node_modules/ffmpeg-binaries/bin/ffmpeg ',
spawnargs: [ '-formats' ] }
预期结果
入站文件被下载到临时目录,进行裁剪,然后作为裁剪后的文件重新上传到 Firebase 存储。
环境
代码 [已更新以反映 Svenskunganka 的更改。现在有效]
const ffmpeg = require('fluent-ffmpeg');
const PREVIEW_PREFIX = 'preview_';
exports.generatePreviewClip = functions.storage.object('audioFiles').onChange(event => {
//console.log('Times this function has run: ', run++);
const object = event.data; // The Storage 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.
const resourceState = object.resourceState; // The resourceState is 'exists' or 'not_exists' (for file/folder deletions).
const metageneration = object.metageneration; // Number of times metadata has been generated. New objects have a value of 1.
// Exit if this is triggered on a file that is not an audio file.
if (!contentType.startsWith('audio/')) {
console.log('This is not an audio file.');
console.log('This is the file:', filePath);
return;
}
// Get the file name.
const fileName = path.basename(filePath);
console.log('Working with filename', fileName);
// Exit if the file is already an audio clip.
if (fileName.startsWith(PREVIEW_PREFIX)) {
console.log('Already a preview clip.');
return;
}
// Exit if this is a move or deletion event.
if (event.data.resourceState === 'not_exists') {
console.log('This is a deletion event.');
return;
}
// Exit if file exists but is not new and is only being triggered
// because of a metadata change.
if (resourceState === 'exists' && metageneration > 1) {
console.log('This is a metadata change event.');
return;
}
// Download file from bucket.
const bucket = gcs.bucket(fileBucket);
const tempFilePath = path.join(os.tmpdir(), fileName);
return bucket.file(filePath).download({
destination: tempFilePath
}).then(() => {
console.log('Audio file downloaded locally to temp directory', tempFilePath);
var ffmpegPath = require("ffmpeg-binaries").ffmpegPath();
var ffprobePath = require("ffmpeg-binaries").ffprobePath();
// Generate a croped file using ffmpeg.
var command = new ffmpeg(tempFilePath);
command.setFfmpegPath(ffmpegPath);
command.setFfprobePath(ffprobePath);
command
.setStartTime('00:00:03')
.setDuration('10')
.output(tempFilePath)
.on('end', function() {
console.log('Audio Crop Done Successfully');
})
.on('error', function(err)
{
console.log('Error:', err);
}).run();
}).then(() => {
console.log('Preview file created at', tempFilePath);
// We add a 'preview_' prefix to the audio file name. that's how it will appear in firebase.
const previewFileName = PREVIEW_PREFIX + fileName;
console.log('previewFileName is', previewFileName)
const previewFilePath = path.join(path.dirname(filePath), previewFileName);
console.log('previewFilePath is', previewFilePath);
// Uploading the preview file.
return bucket.upload(tempFilePath, {destination: previewFilePath});
// Once the file has been uploaded delete the local file to free up disk space.
}).then(() => fs.unlinkSync(tempFilePath));
// [END audio file generation]
});
Run Code Online (Sandbox Code Playgroud)
我的 ffmpeg-binaries/bin 目录的内容和结构
-rwxrwxrwx 1 sherpa staff 24M Dec 10 2016 ffmpeg
-rwxr--r-- 1 sherpa staff 35M Jan 12 2017 ffmpeg.exe
-rwxr--r-- 1 sherpa staff 35M Jan 12 2017 ffplay.exe
-rwxrwxrwx 1 sherpa staff 24M Dec 10 2016 ffprobe
-rwxr--r-- 1 sherpa staff 35M Jan 12 2017 ffprobe.exe
-rwxrwxrwx 1 sherpa staff 22M Dec 10 2016 ffserver
Run Code Online (Sandbox Code Playgroud)
我尝试过的事情
感谢您的任何建议。
我们在问题的评论中解决了该问题,但我会为可能遇到相同问题的任何未来用户发布答案。问题在于提供给该setFfmpegPath()方法的路径是相对的,而应该是绝对的。ffmpeg-binaries模块导出几个辅助函数,您可以调用它来获取其二进制文件的路径:
var ffmpeg = require("fluent-ffmpeg")
var ffmpegPath = require("ffmpeg-binaries")
ffmpeg
.setFfmpegPath(ffmpegPath)
...
Run Code Online (Sandbox Code Playgroud)
确保您已经ffmpeg-binaries安装了npm i -S ffmpeg-binaries.
2018 年 11 月 7 日更新:
该ffmpeg-binaries软件包在版本中发布了一个新的重大更改,删除了它导出的所有函数,而只是导出指向所在4.0.0目录的字符串。ffmpeg这是在 commit 中更改的009e4d5。
我已经更新了答案以反映这些更改。
| 归档时间: |
|
| 查看次数: |
5754 次 |
| 最近记录: |