你能在Firebase Cloud Function

时间:2017-03-13 21:10:47

标签: firebase ffmpeg google-cloud-functions

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

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

7 个答案:

答案 0 :(得分:27)

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模块,它在npm install期间根据当前系统构建正确的ffmpeg二进制文件。由于Cloud Functions在云中构建代码,因此它将构建正确的ffmpeg二进制文件。

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

您可以在Cloud Functions for Firebase examples repo中看到它。

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');

(感谢Daniel Lessa在his answer中指出这个模块。)

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

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

使用预编译的ffmpeg二进制文件

的文件列表
./
../
index.js
ffmpeg

然后运行例如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
});

答案 1 :(得分: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()

答案 2 :(得分:3)

虽然您在技术上可以在Firebase Functions实例上运行FFMPEG,但您将很快达到小配额限制。

根据this answer,您可以使用函数来触发对GCP更强大的App Engine或计算引擎服务的请求。 App Engine进程可以从同一个存储桶中获取文件,处理转码,并将完成的文件上传回存储桶。如果您在链接中查看其他答案,则会有一位用户发布了一个样本仓库。

答案 3 :(得分:3)

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

spawn(
  'ffmpeg',
  ['-i', 'video.mp4'] 
)

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

答案 4 :(得分:0)

据我所知,ffmpeg没有预先安装在容器上。

当我需要转码媒体时,我查看了emscripten cross-compiled version of ffmpeg。它似乎在本地节点环境中工作正常,但我从来没有开始部署它(因为我们根本不需要转码)。

答案 5 :(得分:0)

DELETE FROM Table1 where Name IN (select Name from Table2 group by [Name] having count(Name)>=40)

https://github.com/firebase/functions-samples/blob/master/ffmpeg-convert-audio/functions/index.js

答案 6 :(得分:0)

实际上,不。 FFMPEG处理通常超过Cloud Functions quotas(上传10MB)的音频/视频文件。

您需要运行Node.js on GCP's AppEngine