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

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

最終更新日:Sep 09, 2024

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

背景

専用のクラウドベースのコード変換サービスを使用できます。 ただし、次の要件を満たすために、シナリオで独自のトランスコーディングサービスを構築することができます。

  • 自動スケーリング

    • ビデオ処理の弾力性を向上させる必要があります。

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

  • エンジニアリング効率

    • 一度に複数のビデオファイルを処理する必要があります。

    • 多数の特大ビデオを高効率でバッチ処理する

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

  • カスタムファイル処理

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

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

    • オーディオファイルのフォーマットを変換したり、オーディオストリームのサンプルレートをカスタマイズしたり、オーディオストリームのノイズを低減したりしたい場合。

    • ソースファイルを直接読み取って処理する必要があります。

      たとえば、ビデオファイルはApsara File Storage NAS (NAS) またはElastic Compute Service (ECS) インスタンスに接続されたディスクに保存されます。 カスタムビデオ処理システムを構築する場合、システムはビデオファイルをObject Storage Service (OSS) に移行することなく、直接読み取って処理できます。

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

      たとえば、ビデオ処理システムを使用して、ビデオをトランスコードしたり、ビデオに透かしを追加したり、ビデオのサムネイルに基づいてGIF画像を生成したりできます。 トランスコードに使用するパラメーターの調整など、ビデオ処理システムにさらに機能を追加したい場合。 また、新しい機能がリリースされたときに、システムが提供する既存のオンラインサービスが影響を受けないことを願っています。

  • コスト管理

    • 単純なトランスコードまたは軽量のメディア処理シナリオで高いコスト効率を実現したい場合。

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

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

ソリューション

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

IT技術が発展するにつれて、クラウドベンダーのサービスは絶えず改善されています。 ECS、OSS、CDNなどのAlibaba Cloudサービスを使用して、オーディオおよびビデオファイルを保存し、ファイルの再生を高速化するオーディオおよびビデオ処理システムを構築できます。

image

サーバーレスアーキテクチャ

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

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

image

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

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

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

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

image

ユーザーがアップロードしたとき。OSSにmp4ビデオを送信すると、OSSは関数の実行をトリガーし、関数はCloudFlowを呼び出してビデオの形式をトランスコードします。 このソリューションを使用すると、次のビジネス要件を満たすことができます。

  • ビデオは、同時に様々なフォーマットにトランスコードされ、透かし入れまたは処理されたビデオに関する更新された情報のデータベースへの同期などのカスタム要件に基づいて処理され得る。

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

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

    説明

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

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

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

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

項目

Serverlessソリューション

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

インフラストラクチャ

なし

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

開発効率

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

ビジネスロジックの開発に加えて、ソフトウェアのインストール、サービス構成、セキュリティアップデートを含むオンラインランタイム環境を構築する必要があります。

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

CloudFlowリソースオーケストレーションを使用して、複数のビデオを並行して処理し、大きなビデオを分散処理することができます。 Alibaba Cloudは、安定性とモニタリングを担当しています。

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

トレーニング費用

あなたはあなたのビジネス要件に基づいてプログラミング言語でコードを書くだけでよく、FFmpegに精通している必要があります。

プログラミング言語とFFmpegに加えて、Kubernetes、ECSも使用する必要があります。 この場合、他のサービス、用語、およびパラメーターについて詳しく知る必要があります。

ビジネスサイクル

このソリューションは、開発とデバッグに2マン日、ストレステストとチェックに1マン日を含め、約3マン日を消費します。

ハードウェアの調達、ソフトウェアと環境の構成、システムの開発、テスト、監視と警告、およびシステムのカナリアリリースなどの項目を完了するのに必要な時間は、約30マン日 (ビジネスロジックの開発を除く) です。

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

項目

Serverlessソリューション

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

弾力性と高可用性

Function Computeは、ミリ秒単位の自動スケーリングを実装して、基盤となるリソースを迅速にスケールアウトし、トラフィックサージに対応できます。 Function Computeは、優れたトランスコードパフォーマンスを提供し、O&Mの必要性を排除することもできます。

自動スケーリングを実行するには、Server Load Balancer (SLB) インスタンスを作成する必要があります。 ただし、SLBインスタンスを使用する場合のスケーリング速度は、Function Computeを使用する場合と比較して遅くなります。

モニタリング、アラート、およびクエリ

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

オートスケーリングまたはコンテナーのメトリックのみを使用できます。

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

たとえば、クラウドサービスでは、長さが89秒のMOVビデオファイルに対して通常のトランスコードを実行して、変換するのに188秒かかります。mp4形式。 この時間量、188秒は、基準としてTとしてマークされる。 次の式を使用して、パフォーマンス加速率を計算します。パフォーマンス加速率=T/Function Computeトランスコーディング期間

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

Function Compute (s) のコード変換期間

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

45

160

117.5

25

100

188

15

70

268.6

10

45

417.8

5

35

537.1

より高い費用対効果

特定のシナリオでは、Function Computeでのビデオ処理に必要なコストが少なくなります。 サーバーレスソリューションは、他のクラウドベンダーのビデオトランスコードサービスの他のソリューションよりもコストの点で優れています。

このセクションでは、間の変換を使用します。mp4と。Function Computeと別のクラウドサービスの使用コストを比較するためのflvファイル。 この例では、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分間続くビデオが使用されます。 コスト削減の割合は、1.5分のビデオを使用する10% よりも変動しません。

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

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

  • 一般的なクラウドトランスコードサービスを使用すると、特定の解像度でコストが高くなります。 たとえば、解像度が856 × 480ピクセルまたは1368 × 768ピクセルのビデオをトランスコードする場合、ビデオはより高い解像度レベルに基づいて課金されます。 解像度が856 × 480画素の映像は、解像度が1280 × 720画素のHD映像として課金される。 解像度が1368 × 768ピクセルのビデオは、解像度が1920 × 1080ピクセルのウルトラHDビデオとして請求されます。 この場合、ビデオトランスコードの単価は大幅に上昇しますが、コンピューティング機能の増加はおそらく30% 未満です。 この問題を解決するには、Function Computeを使用します。これにより、消費されたコンピューティングリソースに対してのみ料金を支払うことができます。

操作とデプロイ

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

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

前提条件

手順

  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トリガーをトリガーするためのルール」をご参照ください。

      重要

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

      source

      オブジェクト接尾辞

      一致させたいオブジェクト名のサフィックスを入力します。 ネストされたループによって生成される追加コストを防ぐために、オブジェクトプレフィックスとオブジェクトサフィックスを設定することを推奨します。 バケット内の異なるトリガーに同じイベントタイプを指定する場合、オブジェクトのプレフィックスまたはサフィックスは一意である必要があります。 詳細については、「ネイティブOSSトリガーをトリガーするためのルール」をご参照ください。

      mp4

      トリガーイベント

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

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

      ロール名

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

      説明

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

      AliyunOSSEventNotificationRole

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

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

      関数は変換します。にmp4ファイル。flv形式で保存します。OSSバケットのdestディレクトリにあるflvファイル。 この例では、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バケットの作成

  • サービスロールの設定

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

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

    • fnf-execution-default-role: ワークフローの作成と管理に必要なロール。 AliyunFCInvocationAccessおよびAliyunFnFFullAccess権限をfnf-execution-default-roleロールにアタッチする必要があります。

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

手順

このソリューションは、サーバーレスワークフローを使用して機能を調整することにより、ビデオ処理システムを実装します。 複数の関数のコードとワークフローを設定する必要があります。 この例では、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. 実行のステータスがSucceededの場合、testBucketのdestディレクトリに移動して、トランスコードされたファイルを表示できます。

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

関連ドキュメント

よくある質問

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

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

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

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

  • それぞれが4 GBを超える数百の1080pビデオが毎週金曜日に定期的に生成され、数時間以内にビデオの処理を完了したいと思います。 このような大量の特大のビデオを一度に高効率で処理するにはどうすればよいですか?

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

  • ビデオがトランスコードされるたびに、トランスコードの詳細をデータベースに記録します。 また、オリジンサーバーへの負荷を軽減するために、人気のあるビデオをトランスコードした後に、CDNポイントオブプレゼンス (POP) に自動的にプリフェッチすることもできます。 このような高度なカスタム処理機能はどのように使用できますか?

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

  • 私のカスタムビデオ処理ワークフローには、ビデオのトランスコード、ビデオへの透かしの追加、ビデオサムネイルに基づくGIF画像の生成など、複数の操作が含まれています。 その後、トランスコードに使用されるパラメーターを調整するなど、ビデオ処理システムにさらに機能を追加したいと思います。 また、新しい機能がリリースされたときに、システムが提供する既存のオンラインサービスが影響を受けないことを願っています。 どうすればこの目標を達成できますか?

    展開スキームの詳細については、「ビデオ処理ワークフローシステム」をご参照ください。 CloudFlowは関数のみを調整して呼び出します。 したがって、対応する機能のみを更新する必要があります。 さらに、バージョンとエイリアスを使用して、関数のカナリアリリースを実行できます。 詳細については、「バージョンの管理」をご参照ください。

  • 単純なコード変換サービスまたは軽量メディア処理サービスのみが必要です。 たとえば、ビデオの最初の数フレームに基づいて生成されるGIF画像を取得したり、オーディオファイルまたはビデオファイルの持続時間を照会したりします。 この場合、カスタムメディア処理システムを構築することは費用効果が高い。 どうすればこの目標を達成できますか?

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

  • ソースビデオファイルは、NASまたはECSインスタンスに接続されているディスクに保存されます。 OSSに移行せずに、メザニンビデオファイルを直接読み取って処理できるカスタムビデオ処理システムを構築したいと考えています。 どうすればこの目標を達成できますか?

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