转码器 API 无法通过 Firebase Cloud Functions 运行

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

我在 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存储=云存储,我认为这是需要工作的,但我不知道为什么总是出现这个错误。

请帮忙。 谢谢, 阿德里安

firebase google-cloud-platform firebase-storage google-cloud-transcoder
1个回答
0
投票

我不熟悉 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);
// ...

(希望它对您有所帮助,因为这个答案严格基于文档)

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