You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:44:50