本文介绍了NodeJ-Fluent-FFMPEG找不到FFMPEG用于Firebase云功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试学习如何使用 ffmpeg-fluent 编写Firebase云函数,并且正在引用此示例代码.我已经复制了代码,只将 gcs 的初始化更改为 const gcs = admin.storage(); .在节点10上的部署成功,但是在上传 mp3 文件以测试该功能时,它给了我以下错误.

I am trying to learn how to write a firebase cloud function with ffmpeg-fluent and am referring to this sample code. I have copied the code, only changing the initialisation of gcs to 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.

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

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

{
  "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
}

推荐答案

此处 ffmpeg_static.path 路径未定义

let command = ffmpeg(tempFilePath)
      .setFfmpegPath(ffmpeg_static.path)
      .audioChannels(1)
      .audioFrequency(16000)
      .format('flac')
      .output(targetTempFilePath);

您应该做的是安装"ffmpeg-installer/ffmpeg".您可以在这里找到它: https://www.npmjs.com/package/@ffmpeg-installer/ffmpeg

what you should do instead is install "ffmpeg-installer/ffmpeg". You can find it here: 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);

这篇关于NodeJ-Fluent-FFMPEG找不到FFMPEG用于Firebase云功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-18 13:41