你能在Firebase云功能中呼叫FFMPEG吗?

Dav*_*rks 16 ffmpeg firebase google-cloud-functions

根据Firebase云功能文档,您可以在云功能中利用ImageMagick:https: //firebase.google.com/docs/functions/use-cases

是否有可能做类似的事情,但呼吁FFMPEG而不是ImageMagick?虽然缩略图像非常棒,但我还希望能够将传入图像附加到存储在Firebase存储上的视频文件中.

Bre*_*wen 30

ffmpeg没有预装(几乎只是ImageMagick); 要查看确切安装的内容,请查看Dockerfile:https://github.com/GoogleCloudPlatform/nodejs-docker/blob/master/runtime-image/Dockerfile.

但是,您可以在使用上载代码时上载任意二进制文件,gcloud beta functions deploy因为上载了当前目录(除外node_modules)中的所有内容.

注意:您只有磁盘写访问权限/tmp/.

选项1:使用ffmpeg-static npm模块

ffmpeg-static是一个npm模块,它根据当前系统构建正确的ffmpeg二进制文件npm install.由于Cloud Functions在云中构建代码,因此它将构建正确的ffmpeg二进制文件.

https://github.com/eugeneware/ffmpeg-static

您可以在Cloud Functions for Firebase示例库中看到它的实际效果.

const ffmpeg = require('fluent-ffmpeg');
const ffmpeg_static = require('ffmpeg-static');

var cmd = ffmpeg('/tmp/video.avi')
  .setFfmpegPath(ffmpeg_static.path)
  .videoBitrate(1024)
  .videoCodec('divx')
  .format('avi')
  .on('end', () => {
    // ...
  })
  .on('error', err => {
    console.error(err);
  })
  .save('/tmp/file-out.avi');
Run Code Online (Sandbox Code Playgroud)

(感谢Daniel Lessa在他的回答中指出了这个模块.)

选项2:上传您自己的二进制文件

您可以在上传过程中包含一个ffmpeg二进制文件,然后使用类似的命令运行shell命令child_process.exec.您需要为目标平台(Debian/jessie)编译的ffmpeg二进制文件.

带有预编译的ffmpeg二进制文件的文件列表

./
../
index.js
ffmpeg
Run Code Online (Sandbox Code Playgroud)

然后运行例如 gcloud beta functions deploy myFunc --trigger-http

index.js

var exec = require('child_process').exec;
var cmd = 'ffmpeg -i /tmp/myvideo.mp4 /tmp/image-%d.jpg';

exec(cmd, function(error, stdout, stderr) {
  // command output is in stdout
});
Run Code Online (Sandbox Code Playgroud)

  • `ffmpeg` 现已包含在 Cloud Functions 环境中 (4认同)

wab*_*bit 11

ffmpeg 现在包含在 Cloud Functions 环境中,因此可以直接使用:

spawn(
  'ffmpeg',
  ['-i', 'video.mp4'] 
)
Run Code Online (Sandbox Code Playgroud)

已安装软件包的完整列表:https : //cloud.google.com/functions/docs/reference/nodejs-system-packages


小智 6

从技术上讲,您可以在Firebase Functions实例上运行FFMPEG,但您很快就会达到较小的配额限制。

按照此答案,您可以改为使用“函数”触发对GCP功能更强大的App Engine或Compute Engine服务的请求。App Engine进程可以从同一存储桶中抓取文件,进行转码,然后将完成的文件上传回存储桶。如果您在链接上检查其他答案,则一个用户发布了一个示例存储库。


小智 5

使用lib https://github.com/eugeneware/ffmpeg-static

const ffmpeg = require('fluent-ffmpeg');
const ffmpeg_static = require('ffmpeg-static');


let cmd = ffmpeg.('filePath.mp4')
   .setFfmpegPath(ffmpeg_static.path)
   .setInputFormat('mp4')
   .output('outputPath.mp4')
   ...
   ...
   .run()
Run Code Online (Sandbox Code Playgroud)