使用 ffmpeg 的 Firebase 功能在模拟器上成功,但部署时内存不足

问题描述 投票:0回答:1

我需要一些帮助。我在 Firebase 存储中有一个

.mov
文件。该文件时长 25 秒,
106 MB
。我编写了一个可调用的 Firebase 函数,它使用
ffmpeg
将文件转换为
.mp4
文件并将其保存到 Firebase 存储中。当我使用函数模拟器测试该函数时,它可以正常工作。该函数成功返回,我看到转换后的文件出现在存储中。转换后的视频大约
6 MB
,下载后可以正常播放。

当我部署此函数并在生产环境中对完全相同的视频文件运行它时,该函数失败并显示:

'使用了 407 MiB,超出了 256 MiB 的内存限制。考虑 增加内存限制,请参阅 https://cloud.google.com/functions/docs/configuring/memory'

作为测试,我编辑了该函数并将其分配的内存更改为

1 GiB
。然后我在生产中再次测试该功能。现在我收到同样的错误:

'使用了 1029 MiB,超出了 1024 MiB 的内存限制。考虑 增加内存限制,请参阅 https://cloud.google.com/functions/docs/configuring/memory'

这是我的功能代码:

const {initializeApp} = require("firebase-admin/app");
const {onCall} = require("firebase-functions/v2/https");
const { getStorage, getDownloadURL } = require('firebase-admin/storage');

initializeApp();

exports.convertVideo = onCall((request) => {
  const ffmpegPath = require('@ffmpeg-installer/ffmpeg').path;
  const ffmpeg = require('fluent-ffmpeg');
  ffmpeg.setFfmpegPath(ffmpegPath);
  const originalLocation = request.data.originalLocation;
  const convertedLocation = request.data.convertedLocation;
  const originalVideoFile = getStorage().bucket().file(originalLocation);
  const newVideoFile = getStorage().bucket().file(convertedLocation);

  return new Promise(async (resolve, reject) => {
    await originalVideoFile.download({destination: '/tmp/original'}).catch(console.error);
    
    ffmpeg('/tmp/original')
      .addOutputOptions('-movflags +frag_keyframe+separate_moof+omit_tfhd_offset+empty_moov')
      .format('mp4')
      .on('error', (err) => {
        console.log(err);
      })
      .pipe(newVideoFile.createWriteStream())
      .on('error', (err) => {
        console.log(err);
      })
      .on('close', async () => {
        fs.unlink('/tmp/original', (err) => {
          if (err) throw err;
        });
        const convertedUrl = await getDownloadURL(newVideoFile);
        resolve([convertedLocation, convertedUrl]);
      });
  });
});

我正在使用curl向函数模拟器发送测试请求:

curl -d '{"data": {"originalLocation": "customer_videos/original_video.mov", "convertedLocation": "customer_videos/converted/original_video.mp4"}}' -H "Content-Type: application/json" http://127.0.0.1:5001/foo/bar/convertVideo

这工作正常。我向已部署的函数发送相同的请求,并收到内存不足错误。

curl -d '{"data": {"originalLocation": "customer_videos/original_video.mov", "convertedLocation": "customer_videos/converted/original_video.mp4"}}' -H "Content-Type: application/json" https://convertvideo-foobarbaz-uc.a.run.ap

有人可以帮我理解为什么会发生这种情况吗?我不认为我做了任何占用内存太多的事情,特别是因为它使用模拟器可以正常工作。

node.js firebase ffmpeg google-cloud-functions
1个回答
0
投票

按理说,您还没有为这个工作负载配置足够的内存。如果您的工作负载需要的内存多于可为 Cloud Functions 配置的内存,请使用其他计算产品。如果您认为您的工作负载不应占用您配置的那么多内存,请考虑提出一个新问题,重点关注如何在内存受限的情况下有效地使用 ffmpeg,而不是 Cloud Functions 配置。

请注意,本地模拟器不会强制实施内存限制,因此在本地更改内存配置将与部署时在生产中发现的行为不匹配。 您的 Cloud Functions 配置实际上会选择特定的硬件进行部署。 有关详细信息,请参阅文档

© www.soinside.com 2019 - 2024. All rights reserved.