すべてのプロダクト
Search
ドキュメントセンター

Function Compute:柔軟で可用性の高いオーディオおよびビデオ処理システムをサーバーレスアーキテクチャで構築する

最終更新日:Feb 07, 2025

オーディオおよびビデオシステムでは、トランスコーディングは多くの計算能力を消費する。 Function ComputeCloudFlowを使用して、柔軟で可用性の高いオーディオおよびビデオ処理システムをサーバーレスアーキテクチャで構築できます。 このトピックでは、オーディオおよびビデオ処理の従来のソリューションとサーバーレスソリューションのエンジニアリング効率、O&M、パフォーマンス、およびコストの違いについて説明します。 また、サーバーレスのオーディオおよびビデオ処理システムを構築して使用する方法についても説明します。

背景

専用のクラウドベースのコード変換サービスを使用できます。 ただし、特定のシナリオでは、独自のトランスコードサービスを構築することができます。 自己管理型トランスコードサービスは、次の要件を満たすのに役立ちます。

  • 自動スケーリング

    • ビデオ処理サービスの弾力性を向上させたいと考えています。

      たとえば、FFmpegを使用して仮想マシンまたはコンテナプラットフォームにビデオ処理サービスをデプロイし、その柔軟性と可用性を強化したいとします。

  • 効率的なエンジニアリング

    • 複数のビデオを同時に処理したい。

    • 短期間で複数の特大ビデオを処理したいと考えています。

      たとえば、毎週金曜日に、それぞれ4 GBを超える数百の1080pビデオが作成され、数時間以内に処理する必要があります。

  • カスタム処理

    • 高度なカスタム処理要件があります。

      たとえば、ビデオがトランスコードされるたびに、トランスコードの詳細をデータベースに記録します。 または、配信元サーバーへの負荷を軽減するために、トレンドビデオをトランスコードした後にAlibaba Cloud CDN (CDN) ノードに自動的にプリフェッチすることもできます。

    • オーディオ形式を変換したり、サンプリングレートをカスタマイズしたり、バックグラウンドノイズを除去したりします。

    • ソースファイルを直接読み取って処理したい場合。

      たとえば、ビデオファイルはFile Storage NAS (NAS) またはElastic Compute Service (ECS) インスタンスに接続されているディスクに保存されており、ビデオ処理システムがそれらのファイルを現在の保存場所から直接読み取って処理することで、最初にファイルをObject storage Service (OSS) バケットに移行する必要がなくなります。

    • あなたはビデオのフォーマットを変換し、より多くの機能を追加したいです。

      たとえば、ビデオ処理システムにコード変換パラメータの調整やその他の機能を追加すると、すでにビデオをコード変換したり、透かしを追加したり、GIFサムネイルを生成したりできます。 また、新しい機能がリリースされたときに、システムによって提供される既存のオンラインサービスが影響を受けないようにする必要があります。

  • コスト管理

    • 単純なトランスコードまたは軽量メディア処理サービスを実装する場合。

      たとえば、ビデオの最初の数フレームに基づいてGIF画像を生成したり、オーディオファイルまたはビデオファイルのデュレーションを照会したりするとします。 この場合、独自のメディア処理システムを構築する方が費用対効果が高くなります。

従来の自己管理アーキテクチャまたはサーバーレスソリューションを使用して、独自のトランスコードサービスを構築できます。 このトピックでは、2つのオプションを比較し、サーバーレスソリューションをデプロイする手順について説明します。

ソリューション

従来の自己管理アーキテクチャ

コンピュータ技術とインターネットの発展に伴い、クラウドコンピューティングベンダーの製品は常に成熟し、改善しています。 ECS、OSS、CDNなどのAlibaba Cloudサービスを使用して、オーディオおよびビデオファイルを保存し、ファイルの再生を高速化するオーディオおよびビデオ処理システムを構築できます。

image

サーバーレスソリューション

シンプルなビデオ処理システム

次の図は、ビデオに対して簡単な処理を実行するために使用できるソリューションのアーキテクチャを示しています。

image

ビデオをOSSにアップロードすると、OSSは自動的に関数の実行をトリガーし、FFmpegを呼び出してビデオをトランスコードし、トランスコードされたビデオをOSSに保存します。

シンプルなビデオ処理システムのデモと手順の詳細については、「シンプルなビデオ処理システム」をご参照ください。

ビデオ処理ワークフローシステム

大きなビデオのトランスコードを高速化したり、ビデオに対して複雑な操作を実行したりする場合は、CloudFlowを使用して機能を調整し、強力なビデオ処理システムを構築します。 次の図は、ソリューションのアーキテクチャを示しています。

image

MP4ビデオをOSSにアップロードすると、OSSは関数の実行をトリガーし、CloudFlowを呼び出してビデオ形式をトランスコードします。 このソリューションは、次のシナリオで使用できます。

  • ビデオは、同時に様々なフォーマットにトランスコードされ、透かしをビデオに追加したり、処理後にデータベース内のビデオの詳細を更新したりするなどのカスタム要件に基づいて処理することができる。

  • 複数のファイルが同時にOSSにアップロードされると、Function Computeは自動スケーリングを実行してファイルを並列処理し、同時に複数の形式にトランスコードします。

  • NASとビデオセグメンテーションを使用して、特大のビデオをトランスコードできます。 各特大ビデオは最初にセグメント化され、次にセグメントは並列にトランスコードされ、最後に単一のビデオにマージされます。 適切なセグメンテーション間隔により、大きなビデオのトランスコード速度が大幅に向上します。

    説明

    ビデオセグメンテーションは、ビデオストリームを指定された時間間隔で複数のセグメントに分割し、それらのセグメントに関する情報を生成されたインデックスファイルに記録することを指す。

ビデオ処理ワークフローシステムのデモと手順の詳細については、「ビデオ処理ワークフローシステム」をご参照ください。

サーバーレスソリューションの利点

エンジニアリング効率の向上

項目

Serverlessソリューション

従来の自己管理アーキテクチャ

インフラストラクチャ

なし。

インフラリソースを購入して管理する必要があります。

開発効率

ビジネスロジックの開発に集中し、Serverless Devsを使用してリソースを調整およびデプロイできます。

ビジネスロジックの開発に加えて、オンラインランタイム環境も構築する必要があります。 これには、ソフトウェアのインストール、サービス構成、およびセキュリティ更新が含まれます。

並列および分散ビデオ処理

CloudFlowによって調整されると、複数のビデオの並列処理が可能になり、分散処理のために大きなビデオのセグメンテーションが容易になります。 安定性とモニタリングについて心配する必要はありません。Alibaba Cloudがこれらの側面を処理するからです。

ビデオ処理システムの安定性を確保するには、強力な開発能力とサウンドモニタリングシステムが必要です。

トレーニング費用

対応するプログラミング言語でコードを記述し、FFmpegに精通している必要があります。

プログラミング言語とFFmpegに加えて、KubernetesとECSも使用する必要があります。 これには、サービス、用語、およびパラメーターをよりよく理解する必要があります。

ビジネスサイクル

このソリューションには約3人の日数が必要です。2人は開発とデバッグ用、もう1人はストレステストと観察用です。

このシステムは、ハードウェアの調達、ソフトウェアと環境の構成、システムの開発、テスト、監視とアラートの構成、カナリアのリリースなどのタスクを完了するのに、少なくとも30人の日数を要すると推定されています。 ビジネスロジック開発のワークロードはこの見積もりに含まれていないことに注意してください。

自動スケーリングとO&Mフリー

項目

Serverlessソリューション

従来の自己管理アーキテクチャ

弾力性と高可用性

Function Computeは、ミリ秒レベルのオートスケーリングを可能にし、基盤となるリソースを迅速にスケールアウトしてバーストトラフィックに対処できます。 このO&Mフリーシステムは、優れたトランスコード性能を発揮します。

自動スケーリングを実装するには、Server Load Balancer (SLB) インスタンスを管理する必要があり、SLBのスケーリング速度はFunction Computeと比較して遅くなります。

モニタリングとアラート指標

CloudFlowおよびFunction Computeの実行をモニタリングするための、より詳細なメトリクスが提供されています。 各関数実行のレイテンシとログを照会できます。 さらに、このソリューションは、より包括的な監視および警告メカニズムを使用します。

自動スケーリングまたはコンテナーのメトリックのみが提供されます。

優れたトランスコード性能

たとえば、クラウドサービスは、89秒のMOVビデオファイルをMP4形式に変換するのに188秒かかります。これは、一般的なトランスコード処理です。 この持続時間、188秒は、参照のためにTとしてマークされる。 次の式を使用して、パフォーマンス加速率を計算します。パフォーマンス加速率=T/Function Computeトランスコーディング期間

ビデオセグメンテーション間隔 (s)

Function Computeトランスコード期間

パフォーマンス加速率 (%)

45

160

117.5

25

100

188

15

70

268.6

10

45

417.8

5

35

537.1

説明

上の表のパフォーマンス高速化率は、エラスティックインスタンスにのみ適用されます。 GPU高速化インスタンスを使用する場合は、「オーディオおよびビデオ処理のベストプラクティス」をご参照ください。

高い費用対効果

特定のシナリオでは、Function Computeを使用すると、ビデオ処理コストを削減できます。 サーバーレスソリューションは、他のクラウドベンダーの専用ビデオトランスコードサービスに対しても大きなコスト競争力を備えています。

このセクションでは、MP4ファイルとFLVファイルの間の変換を使用して、Function Computeと別のクラウドサービスを使用するコストを比較します。 この例では、Function Computeのメモリ容量は3 GBに設定されています。 次の表は、コストを比較しています。

次の式を使用して、コスト削減率を計算します。コスト削減率=(別のクラウドサービスのコスト-Function Computeトランスコードコスト) /別のクラウドサービスのコスト

表 1. MP4にFLV

解像度

スピード

フレームレート

Function Computeトランスコード期間

Function Computeトランスコードコスト

別のクラウドサービスのコスト

コスト削減率

標準解像度 (SD): 640 × 480ピクセル

889 KB/s

24

11.2s

0.003732288

0.032

88.3%

高解像度 (HD): 1280 × 720ピクセル

1963 KB/s

24

20.5s

0.00683142

0.065

89.5%

ウルトラHD: 1920 × 1080ピクセル

3689 KB/s

24

40代

0.0133296

0.126

89.4%

4K 3840*2160

11185 KB/s

24

142s

0.04732008

0.556

91.5%

表 2. FLVにMP4

解像度

スピード

フレームレート

Function Computeトランスコード期間

Function Computeトランスコードコスト

別のクラウドサービスのコスト

コスト削減率

標準解像度 (SD): 640 × 480ピクセル

712 KB/s

24

34.5s

0.01149678

0.032

64.1%

高解像度 (HD): 1280 × 720ピクセル

1806 KB/s

24

100.3s

0.033424

0.065

48.6%

ウルトラHD: 1920 × 1080ピクセル

3911 KB/s

24

226.4s

0.0754455

0.126

40.1%

4K 3840*2160

15109 KB/s

24

912s

0.30391488

0.556

45.3%

説明

もう1つのクラウドサービスは、標準のトランスコード課金ルールに従います。つまり、ビデオの期間は、課金のために最も近いフル分に切り上げられます。 この例では、課金期間は2分です。 2分ではなく1.5分で請求されても、支払いの差は最小限になり、コスト削減率は10% 未満で変化します。

上記の表は、FLV形式とMP4形式の間でビデオをトランスコードする料金を示しています。 FLVビデオは、トランスコーディングではMP4ビデオよりも複雑です。 表に表示されているメトリックに示されているように、両方のトランスコードの方向で、Function ComputeCloudFlowに基づくソリューションは、他のクラウドサービスプロバイダーが提供するソリューションと比較して、コンピューティングリソースの点で費用対効果が高くなります。 実際の経験に基づいて、実際のコスト削減は、前の表に記載されているものよりも明らかです。 以下の項目は、コスト削減の理由を説明しています。

  • テストビデオは高いビットレートを有するが、実際に使用されるビデオのほとんどはSDまたは低解像度 (LD) 品質であり、それらはより低いビットレートを有する。 実際に使用されるビデオは、必要なコンピューティングリソースが少なくなります。 Function Computeによるトランスコーディングは時間がかからないため、コストが低くなります。 ただし、一般的なクラウドトランスコードサービスの設定された課金ポリシーは、ビデオの品質やビットレートによって変わりません。

  • 特定の解像度のビデオの場合、一般的なクラウドトランスコーディングサービスで採用されている課金ルールは、費用対効果に重大な悪影響を及ぼします。 例えば、解像度が856 × 480ピクセルの映像は、解像度が1280 × 720ピクセルのHD映像として課金される。 同様に、解像度1368 × 768画素の映像は、解像度1920 × 1080画素のウルトラHD映像として課金される。 これらの場合、ビデオトランスコーディングの単価は大幅に上昇しますが、実際に消費されるコンピューティングリソースの増加はおそらく30% 未満です。 一方、Function Computeでは、実際に使用しているコンピューティングリソースに対してのみ料金を支払うことができます。

Deployment

このセクションでは、シンプルなビデオ処理システムとビデオ処理ワークフローシステムを展開する方法について説明します。

シンプルなビデオ処理システム

前提条件

手順

  1. サービスを作成します。

    1. Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[サービスと機能] をクリックします。

    2. 上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで、[サービスの作成] をクリックします。

    3. [サービスの作成] パネルで、サービス名と説明を入力し、ビジネス要件に基づいてパラメーターを設定し、OKをクリックします。

      この例では、サービスロールはAliyunFCDefaultRoleに設定され、AliyunOSSFullAccessがポリシーに追加されています。

      サービスの作成方法の詳細については、「サービスの作成」をご参照ください。

  2. 関数を作成します。

    1. [関数] ページで、[関数の作成] をクリックします。

    2. On the関数の作成ページで、関数を作成する方法を選択し、次のパラメーターを設定し、作成.

      • 関数を作成するメソッド: 組み込みランタイムを使用

      • 基本設定: [関数名][ハンドラータイプ] など、関数の基本情報を設定します。 [ハンドラータイプ][イベントハンドラー] に設定します。

      • Code: ランタイムをPython 3.9に設定し、コードのアップロード方法をサンプルコードに設定します。

      • 詳細設定: ビデオファイルの処理には時間がかかります。 この例では、vCPU容量は4 vCPUに設定され、メモリ容量は8 GBに設定され、一時ディスクのサイズは10 GBに設定され、実行タイムアウト期間は7200秒に設定されます。 上記のパラメーターを設定するときは、ビデオのサイズを考慮してください。

      他のパラメーターのデフォルト値を保持します。 関数の作成方法の詳細については、「関数の作成」をご参照ください。

  3. OSSトリガーを作成します。

    1. [関数の詳細] ページで、トリガータブからバージョンまたはエイリアスを選択します。バージョンまたはエイリアスドロップダウンリストをクリックし、トリガーの作成.

    2. [トリガーの作成] パネルで、関連パラメーターを指定し、[OK] をクリックします。

      パラメーター

      説明

      トリガータイプ

      トリガーのタイプを選択します。 この例では、OSSが選択されています。

      OSS

      名前

      トリガー名を入力します。

      oss-trigger

      バージョンまたはエイリアス

      バージョンまたはエイリアスを指定します。 デフォルト値はLATESTです。 別のバージョンまたはエイリアスのトリガーを作成する場合は、[関数の詳細] ページの [バージョン] または [エイリアス] ドロップダウンリストからそのバージョンまたはエイリアスを選択します。 バージョンとエイリアスの詳細については、「バージョンの管理」および「エイリアスの管理」をご参照ください。

      LATEST

      バケット名

      作成したバケットを選択します。

      testbucket

      オブジェクトプレフィックス

      一致させるオブジェクト名のプレフィックスを入力します。 ネストされたループによって予期しないコストが発生しないように、オブジェクトプレフィックスとオブジェクトサフィックスを設定することを推奨します。 バケットの異なるトリガーに同じイベントタイプを指定した場合、プレフィックスとサフィックスを同じにすることはできません。 詳細については、「トリガールール」をご参照ください。

      重要

      オブジェクトプレフィックスの先頭にスラッシュ (/) を付けることはできません。 それ以外の場合、OSSトリガーは機能しません。

      source

      オブジェクト接尾辞

      一致させたいオブジェクト名のサフィックスを入力します。 ネストされたループによって予期しないコストが発生しないように、オブジェクトプレフィックスとオブジェクトサフィックスを設定することを推奨します。 バケットの異なるトリガーに同じイベントタイプを指定した場合、プレフィックスとサフィックスを同じにすることはできません。 詳細については、「トリガールール」をご参照ください。

      mp4

      トリガーイベント

      1つ以上のトリガーイベントを選択します。 OSSのイベントタイプの詳細については、「OSSイベント」をご参照ください。

      oss:ObjectCreated:PutObject、oss:ObjectCreated:PostObject、oss:ObjectCreated:CompleteMultipartUpload

      ロール名

      リソースアクセス管理 (RAM) ロール名を指定します。 この例では、AliyunOSSEventNotificationRoleが選択されています。

      説明

      上記のパラメーターを設定したら、[OK] をクリックします。 このタイプのトリガーを初めて作成する場合は、表示されるメッセージの [今すぐ許可] をクリックします。

      AliyunOSSEventNotificationRole

  4. 関数コードを記述します。

    1. [関数の詳細] ページで、[コード] タブをクリックし、コードエディターでコードを記述します。

      この関数は、MP4ファイルをFLV形式に変換し、FLVファイルをOSSバケットのdestディレクトリに保存します。 この例では、Pythonが使用されます。 次のサンプルコードに例を示します。

      # -*- coding: utf-8 -*-
      import logging
      import oss2
      import os
      import json
      import subprocess
      import shutil
      
      logging.getLogger("oss2.api").setLevel(logging.ERROR)
      logging.getLogger("oss2.auth").setLevel(logging.ERROR)
      LOGGER = logging.getLogger()
      
      
      def get_fileNameExt(filename):
          (_, tempfilename) = os.path.split(filename)
          (shortname, extension) = os.path.splitext(tempfilename)
          return shortname, extension
      
      
      def handler(event, context):
          LOGGER.info(event)
          evt = json.loads(event)
          evt = evt["events"]
          oss_bucket_name = evt[0]["oss"]["bucket"]["name"]
          object_key = evt[0]["oss"]["object"]["key"]
          
          output_dir = "dest"
          dst_format = "flv"
          shortname, _ = get_fileNameExt(object_key)
          creds = context.credentials
          auth = oss2.StsAuth(creds.accessKeyId,
                              creds.accessKeySecret, creds.securityToken)
          oss_client = oss2.Bucket(auth, 'oss-%s-internal.aliyuncs.com' %
                                   context.region, oss_bucket_name)
      
          exist = oss_client.object_exists(object_key)
          if not exist:
              raise Exception("object {} is not exist".format(object_key))
      
          input_path = oss_client.sign_url('GET', object_key, 6 * 3600)
          # M3U8 special handling.
          rid = context.request_id
          if dst_format == "m3u8":
              return handle_m3u8(rid, oss_client, input_path, shortname, output_dir)
          else:
              return handle_common(rid, oss_client, input_path, shortname, output_dir, dst_format)
      
      
      def handle_m3u8(request_id, oss_client, input_path, shortname, output_dir):
          ts_dir = '/tmp/ts'
          if os.path.exists(ts_dir):
              shutil.rmtree(ts_dir)
          os.mkdir(ts_dir)
          transcoded_filepath = os.path.join('/tmp', shortname + '.ts')
          split_transcoded_filepath = os.path.join(
              ts_dir, shortname + '_%03d.ts')
          cmd1 = ['ffmpeg', '-y', '-i', input_path, '-c:v',
                  'libx264', transcoded_filepath]
      
          cmd2 = ['ffmpeg', '-y', '-i', transcoded_filepath, '-c', 'copy', '-map',  '0',  '-f', 'segment',
                  '-segment_list', os.path.join(ts_dir, 'playlist.m3u8'), '-segment_time', '10', split_transcoded_filepath]
      
          try:
              subprocess.run(
                  cmd1, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
      
              subprocess.run(
                  cmd2, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
      
              for filename in os.listdir(ts_dir):
                  filepath = os.path.join(ts_dir, filename)
                  filekey = os.path.join(output_dir, shortname, filename)
                  oss_client.put_object_from_file(filekey, filepath)
                  os.remove(filepath)
                  print("Uploaded {} to {}".format(filepath, filekey))
      
          except subprocess.CalledProcessError as exc:
              # if transcode fail, trigger invoke dest-fail function
              raise Exception(request_id + " transcode failure, detail: " + str(exc))
      
          finally:
              if os.path.exists(ts_dir):
                  shutil.rmtree(ts_dir)
      
              # Remove the ts file.
              if os.path.exists(transcoded_filepath):
                  os.remove(transcoded_filepath)
      
          return {}
      
      
      def handle_common(request_id, oss_client, input_path, shortname, output_dir, dst_format):
          transcoded_filepath = os.path.join('/tmp', shortname + '.' + dst_format)
          if os.path.exists(transcoded_filepath):
              os.remove(transcoded_filepath)
          cmd = ["ffmpeg", "-y", "-i", input_path, transcoded_filepath]
          try:
              subprocess.run(
                  cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
      
              oss_client.put_object_from_file(
                  os.path.join(output_dir, shortname + '.' + dst_format), transcoded_filepath)
          except subprocess.CalledProcessError as exc:
              # if transcode fail, trigger invoke dest-fail function
              raise Exception(request_id + " transcode failure, detail: " + str(exc))
          finally:
              if os.path.exists(transcoded_filepath):
                  os.remove(transcoded_filepath)
          return {}
    2. [デプロイ] をクリックします。

  5. 関数コードをテストします。

    関数入力パラメーターを設定して、OSSイベントをシミュレートし、コードを検証できます。 実際の操作では、指定されたOSSイベントが発生すると、関数は自動的にトリガーされます。

    1. [関数の詳細] ページで、[コード] タブをクリックし、[テスト関数] の横にあるxialatubiaoアイコンをクリックし、ドロップダウンリストから [テストパラメーターの設定] を選択します。

    2. [テストパラメーターの設定] パネルで、[新しいテストイベントの作成] または [既存のテストイベントの変更] タブをクリックし、[イベント名] とイベントの内容を指定します。 次に、[OK] をクリックします。

      次のサンプルコードは、イベント設定の例を示しています。 イベントパラメーターの詳細については、「手順2: 関数の入力パラメーターの設定」をご参照ください。

      {
          "events": [
              {
                  "eventName": "oss:ObjectCreated:CompleteMultipartUpload",
                  "eventSource": "acs:oss",
                  "eventTime": "2022-08-13T06:45:43.000Z",
                  "eventVersion": "1.0",
                  "oss": {
                      "bucket": {
                          "arn": "acs:oss:cn-hangzhou:123456789:testbucket",
                          "name": "testbucket",
                          "ownerIdentity": "164901546557****"
                      },
                      "object": {
                          "deltaSize": 122539,
                          "eTag": "688A7BF4F233DC9C88A80BF985AB****",
                          "key": "source/a.mp4",
                          "size": 122539
                      },
                      "ossSchemaVersion": "1.0",
                      "ruleId": "9adac8e253828f4f7c0466d941fa3db81161****"
                  },
                  "region": "cn-hangzhou",
                  "requestParameters": {
                      "sourceIPAddress": "140.205.XX.XX"
                  },
                  "responseElements": {
                      "requestId": "58F9FF2D3DF792092E12044C"
                  },
                  "userIdentity": {
                      "principalId": "164901546557****"
                  }
              }
          ]
      }
    3. [テスト関数] をクリックします。 [コード] タブで、実行結果を表示します。

ビデオ処理ワークフローシステム

前提条件

  • Function Computeの有効化とOSSバケットの作成

    • Function Computeが有効化されています。 詳細については、「手順1: Function Computeの有効化」をご参照ください。

    • Object Storage Serviceが有効化されています。 詳細については、「バケットの作成」をご参照ください。

    • CloudFlowが有効化されています。 詳細については、をご覧ください。 CloudFlowの有効化

    • File Storage NASが有効化されています。 詳細については、をご覧ください。 NASの有効化

    • Virtual Private Cloudが有効化されています。 詳細については、をご覧ください。 VPCの有効化

  • サービスロールの設定

    • AliyunFcDefaultRole: Function Computeのデフォルトのロール。 サービスを作成するときに、このロールを設定する必要があります。 AliyunOSSFullAccessAliyunFnFFullAccess、およびAliyunFCInvocationAccess権限をこのロールに付与して、関数の呼び出し、ワークフローの管理、およびOSSの管理を行います。

    • AliyunOSSEventNotificationRole: OSSがイベント通知を送信するために使用するデフォルトのロール。

    • fnf-execution-default-role: ワークフローの作成と管理に必要なロール。 このロールには、AliyunFCInvocationAccessおよびAliyunFnFFullAccess権限を割り当てる必要があります。

  • Serverless Devsのインストールと構成

手順

このソリューションは、CloudFlowを使用して機能を調整することにより、ビデオ処理システムを実装します。 複数の機能のコードとワークフローを開発および構成する必要があります。 この例では、Serverless Devsを使用してシステムをデプロイします。

  1. 次のコマンドを実行して、アプリケーションを初期化します。

    s init video-process-flow -d video-process-flow

    設定する項目を次の表に示します。 ビジネス要件に基づいて項目を指定します。

    パラメーター

    リージョン ID

    cn-hangzhou

    サービス

    video-process-flow-demo

    RAMロールのAlibaba Cloudリソース名 (ARN)

    acs:ram::10343546 ****:role/aliyunfcdefaultrole

    OSS bucket name

    testBucket

    接頭辞

    source

    トランスコードされたビデオを保存するパス

    dest

    OSSトリガーに関連付けられたRAMロールのARN

    acs:ram::10343546 ****:role/aliyunosseventnotificationrole

    セグメンテーション間隔

    30

    トランスコード後のビデオフォーマット

    mp4、flv、avi

    ワークフローの名前

    video-process-flow

    ワークフローに関連付けられているRAMロールのARN

    acs:ram::10343546 ****:role/fnf-execution-default-role

    資格情報のエイリアスを選択してください

    default

  2. 次のコマンドを実行して、プロジェクトに移動してデプロイします。

    cd video-process-flow && s deploy - y

    デプロイが成功した場合、次のコンテンツが返されます。

    [2023-08-31 13:22:21] [INFO] [S-CORE] - Project video-demo-flow successfully to execute
    
    fc-video-demo-split:
      region:   cn-hangzhou
      service:
        name: video-process-flow-wg76
      function:
        name:       split
        runtime:    python3
        handler:    index.handler
        memorySize: 3072
        timeout:    600
    fc-video-demo-transcode:
      region:   cn-hangzhou
      service:
        name: video-process-flow-wg76
      function:
        name:       transcode
        runtime:    python3
        handler:    index.handler
        memorySize: 3072
        timeout:    600
    fc-video-demo-merge:
      region:   cn-hangzhou
      service:
        name: video-process-flow-wg76
      function:
        name:       merge
        runtime:    python3
        handler:    index.handler
        memorySize: 3072
        timeout:    600
    fc-video-demo-after-process:
      region:   cn-hangzhou
      service:
        name: video-process-flow-wg76
      function:
        name:       after-process
        runtime:    python3
        handler:    index.handler
        memorySize: 512
        timeout:    120
    fc-oss-trigger-trigger-fnf:
      region:   cn-hangzhou
      service:
        name: video-process-flow-wg76
      function:
        name:       trigger-fnf
        runtime:    python3
        handler:    index.handler
        memorySize: 128
        timeout:    120
      triggers:
        -
          type: oss
          name: oss-t
    video-demo-flow:
      RegionId: cn-hangzhou
      Name:     video-process-flow
  3. プロジェクトをテストします。

    1. にログインします。OSSコンソール. testBucketのソースディレクトリに移動し、MP4ファイルをアップロードします。

    2. CloudFlowコンソールにログインします。 [ワークフロー] ページで、対象のワークフローをクリックします。 [実行レコード] タブで、ターゲット実行の名前をクリックして、プロセスとステータスを表示します。

      image.png

    3. 実行のステータスが [実行成功] の場合、testBucketのdestディレクトリに移動して、トランスコードされたファイルを表示できます。

      トランスコードされたファイルが見つかった場合、ビデオ処理システムのサービスは期待どおりに実行されています。

関連ドキュメント

よくある質問

  • FFmpegを使用して、仮想マシンまたはコンテナプラットフォームにビデオ処理システムを展開しました。 システムの弾力性と可用性をどのように改善できますか?

    システムを仮想マシンまたはコンテナプラットフォームからFunction Computeに簡単に移行できます。 Function Computeは、FFmpeg関連のコマンドと統合できます。 システムの再構築は費用対効果が高く、Function Computeの柔軟性と高可用性をシームレスに継承します。

  • 大量のビデオを並行して処理する必要がある場合はどうすればよいですか?

    展開ソリューションの詳細については、「ビデオ処理ワークフローシステム」をご参照ください。 複数のビデオが同時にOSSにアップロードされると、Function Computeは自動的にリソースをスケールアウトしてビデオを並行して処理します。 詳細については、「fc-fnf-video-processing」をご参照ください。

  • 毎週金曜日に、それぞれ4 GBを超える数百の1080pビデオが制作され、数時間以内に処理する必要があります。 この状況で私は何をすべきですか?

    ビデオセグメンテーションは、トランスコーディング効率を大幅に改善できます。 ビデオセグメントのサイズを指定して、元の特大ビデオにトランスコードに適したコンピューティングリソースを確保できます。 デプロイソリューションの詳細については、「fc-fnf-video-processing」をご参照ください。

  • ビデオがトランスコードされるたびに、トランスコードの詳細をデータベースに記録します。 また、配信元サーバーへの負荷を軽減するために、トレンドビデオをトランスコードした後にCDNノードに自動的にプリフェッチしたいと考えています。 これらの目標を達成するにはどうすればよいですか?

    展開ソリューションの詳細については、「ビデオ処理ワークフローシステム」をご参照ください。 メディア処理中に特定のカスタム操作を実行したり、プロセスに基づいて追加の操作を実行したりできます。 たとえば、プロセスの開始前に前処理ステップを追加したり、後続のステップを追加したりできます。

  • 私のビデオ処理システムは、ビデオをトランスコードし、透かしを追加し、GIFサムネイルを生成できます。 次に、トランスコードパラメータの調整とその他の機能をシステムに追加します。 また、新しい機能がリリースされたときに、システムによって提供される既存のオンラインサービスが影響を受けないようにしたいと思います。

    展開ソリューションの詳細については、「ビデオ処理ワークフローシステム」をご参照ください。 CloudFlowは関数オーケストレーションにのみ使用されます。 したがって、メディア処理に使用される関数の更新に集中できます。 カナリアリリースをより適切に制御するために、関数のバージョンとエイリアスもサポートされています。 詳細については、「バージョンの管理」をご参照ください。

  • ビデオの最初の数フレームに基づいてGIF画像を生成し、オーディオファイルまたはビデオファイルの持続時間を照会したいと思います。 これらの単純なトランスコードと軽量のメディア処理要件を処理する独自のメディア処理システムを構築したいと思います。 この目標を達成するにはどうすればよいですか?

    Function Computeはカスタム機能をサポートしています。 特定のFFmpegコマンドを実行して、簡単に目標を達成できます。 一般的なサンプルプロジェクトの詳細については、「fc-oss-ffmpeg」をご参照ください。

  • 私のビデオファイルはNASまたはECSインスタンスに接続されたディスクに保存されています。ビデオ処理システムでは、現在の保存場所からこれらのファイルを直接読み取って処理して、最初にファイルをOSSバケットに移行する必要がなくなります。

    Function ComputeをNASと統合して、NASに保存されているファイルをFunction Computeで処理できます。 詳細については、「NASファイルシステムの設定」をご参照ください。