我需要一些帮助。我在 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
有人可以帮我理解为什么会发生这种情况吗?我不认为我做了任何占用内存太多的事情,特别是因为它使用模拟器可以正常工作。
按理说,您还没有为这个工作负载配置足够的内存。如果您的工作负载需要的内存多于可为 Cloud Functions 配置的内存,请使用其他计算产品。如果您认为您的工作负载不应占用您配置的那么多内存,请考虑提出一个新问题,重点关注如何在内存受限的情况下有效地使用 ffmpeg,而不是 Cloud Functions 配置。
请注意,本地模拟器不会强制实施内存限制,因此在本地更改内存配置将与部署时在生产中发现的行为不匹配。 您的 Cloud Functions 配置实际上会选择特定的硬件进行部署。 有关详细信息,请参阅文档。