Firebase Cloud Functions调用Transcoder API失败求助
问题描述
在Unity应用中使用Firebase,用户可正常上传视频至Firebase Storage,但通过Firebase Cloud Functions触发Google Cloud Platform Transcoder API进行视频转码时功能失效,Google Cloud控制台的Cloud Functions报错:
"Error: 3 INVALID_ARGUMENT: Invalid resource field value in the request."
相关代码如下:
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}`); // 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); } });
其他功能运行正常,Cloud Storage已配置服务账号权限,项目基于Firebase,使用firebase deploy命令部署。疑惑是否需要安装gcloud工具,以及为何始终触发参数无效错误。
问题排查与解决方案
- 缺少必填的
parent参数:Transcoder API的createJob方法必须指定parent字段,格式为projects/[PROJECT_ID]/locations/[LOCATION],这是API要求的必填参数,当前代码未传递导致参数无效错误。
修正后的调用代码示例:// 添加项目ID和区域配置 const projectId = '你的Firebase项目ID'; // 替换为实际项目ID const location = 'us-central1'; // 选择合适的区域,比如us-central1、europe-west1等 const parent = transcoderClient.locationPath(projectId, location); // 修正createJob调用,传入parent参数 const [response] = await transcoderClient.createJob({ parent: parent, job: jobTemplate }); - 修正Output URI格式:Transcoder API要求
outputUri指向一个目录而非具体文件名,API会自动生成符合规范的输出文件名。将outputUri改为gs://MY_APP.appspot.com/output/(末尾加斜杠表示目录),而不是指定具体的optimised.mp4。 - 确认Transcoder API已启用:登录Google Cloud控制台,在API库中搜索"Cloud Transcoder API",确保该API已为你的Firebase项目启用。
- 验证服务账号权限:Firebase Cloud Functions默认使用的服务账号(
[PROJECT_ID]@appspot.gserviceaccount.com)需要拥有Transcoder Job Editor(roles/transcoder.jobEditor)权限,同时需要对Firebase Storage桶有读写权限。可在Google Cloud控制台的IAM页面为该账号添加对应角色。 - 关于gcloud工具:使用
firebase deploy部署Cloud Functions完全可行,无需额外安装gcloud工具,只要你的Firebase CLI已正确关联项目即可。
内容的提问来源于stack exchange,提问作者Adrián Varga
相关产品推荐
相关产品推荐

