我在 Unity 应用程序中使用 Firebase。用户可以将视频上传到 Firebase Storage(运行良好),然后我在 Firebase Cloud Functions 中触发以对视频进行转码(通过 Google Cloud Platform Transcoder API)。这不是工作,我也不知道为什么。
Google Cloud 控制台云功能错误: “错误:3 INVALID_ARGUMENT:请求中的资源字段值无效。”
这是我的代码:
const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();
const db = admin.firestore();
const { TranscoderServiceClient } = require('@google-cloud/video-transcoder');
const { Storage } = require('@google-cloud/storage');
const storage = new Storage();
//other functions..
//
exports.transcodeVideo = functions.storage.object().onFinalize(async (object) => {
try {
const fileBucket = object.bucket;
const filePath = object.name;
const videoPath = `gs://${fileBucket}/${filePath}`;
// Only if in videos/..
if (!filePath.startsWith('videos/')) {
console.log('Nem történt videó feltöltés az videos/ könyvtárba. A Cloud Function nem fut le.');
return null;
}
console.log(`1. Transcode folyamat elindítva a videóhoz: ${videoPath}`);
//videoPath is good!
// A Google Cloud Transcoder API kliens inicializálása
const transcoderClient = new TranscoderServiceClient();
// Az új transcode elrendezés konfigurálása
const jobTemplate = {
jobConfig: {
inputUri: videoPath,
outputUri: 'gs://MY_APP.appspot.com/output/optimised.mp4', // THIS IS ONLY TEST NAME. MY_APP is my app.
elementaryStreams: [
{
key: 'video_stream',
videoStream: {
codec: 'h264',
heightPixels: 360, // Válaszd meg a kívánt alacsony SD felbontást
widthPixels: 640, // Válaszd meg a kívánt alacsony SD felbontást
bitrateBps: 1000000 // Válaszd meg a kívánt alacsony SD bitrátát
}
}
],
muxStreams: [
{
key: 'sd_mux_stream',
container: 'mp4'
}
]
}
};
console.log(`start transcode`); //After this get error in my console
// Az új transcode elrendezés létrehozása és futtatása
const [response] = await transcoderClient.createJob({
job: jobTemplate
});
console.log(`Transcode folyamat elindítva a videóhoz: ${videoPath}`);
//I don't see this in console, error before this.
// A nem optimalizált videó törlése
await storage.bucket(fileBucket).file(filePath).delete();
console.log(`Nem optimalizált videó törölve: ${videoPath}`);
} catch (error) {
console.error('Hiba történt a transcode folyamat során:', error);
}
});
我不知道是什么问题。其他功能运行良好。云存储有服务帐号权限。我使用“firebase部署”命令,因为我的项目基于firebase。我在堆栈溢出中看到可能需要“gcloud部署...”的其他权限,但我使用firebase。也许还需要安装 gcloud ? Firebase存储=云存储,我认为这是需要工作的,但我不知道为什么总是出现这个错误。
请帮忙。 谢谢, 阿德里安
我不熟悉 Google Cloud Transponder,但查看 Transcoder API Documentation 和官方 sample,您需要将具有这两个属性的对象传递给
createJob()
方法:
{
parent,
job,
}
parent
是一个字符串,表示创建和处理作业的父位置(格式:projects/{project}/locations/{location}
)。我不清楚是否需要,示例和文档在这方面不一致。
job
是 IJobTemplate
类型的复合对象,具有以下属性:name
、config
和 labels
。反过来, config
是 IJobConfig
类型的复合对象。
所以你需要按照以下方式做一些事情(未经测试):
const request = {
parent: "....",
job: {
name: "...",
config: {
inputUri: videoPath,
outputUri: 'gs://MY_APP.appspot.com/output/optimised.mp4',
...
}
}
};
// ...
const [response] = await transcoderClient.createJob(request);
// ...
(希望它对您有所帮助,因为这个答案严格基于文档)