トランスコードは、音声・動画システムにおけるコンピューティング集約型のサブシステムです。Function Compute と Serverless Workflow を使用して、弾力的で高可用なサーバーレス音声・動画処理システムを構築できます。このトピックでは、サーバーレス音声・動画処理システムと従来のソリューションを、エンジニアリング効率、運用保守 (O&M)、パフォーマンス、およびコストの観点から比較します。また、サーバーレス音声・動画処理システムのデプロイとテスト方法についても説明します。
背景情報
音声・動画トランスコーディングには、Alibaba Cloud の専用トランスコーディングサービスを使用できます。ただし、次のようなシナリオでは、独自のトランスコーディングサービスを構築することを選択できます。
弾力的スケーリング要件
より弾力的な動画処理が必要です。
たとえば、FFmpeg を使用して仮想マシンまたはコンテナに動画処理サービスをすでにデプロイしているとします。この既存サービスに弾力性と高可用性を追加したいと考えています。
エンジニアリング効率要件
複数の動画ファイルを並列処理する必要があります。
大容量動画を迅速にバッチ処理する必要があります。
たとえば、毎週金曜日に 4 GB を超える数百の 1080p 動画が生成されます。これらすべてを数時間以内に処理する必要があります。
カスタム処理要件
高度なカスタム処理が必要です。
たとえば、トランスコード後、データベースに詳細を記録したり、オリジンサーバーの負荷を軽減するために人気動画を CDN に自動的にプリフェッチしたりする必要があります。
音声フォーマットを変換したり、サンプルレートをカスタマイズしたり、音声ノイズ除去を適用したりする必要があります。
ソースファイルを直接読み取って処理する必要があります。
たとえば、動画ソースファイルが Apsara File Storage NAS または ECS クラウドディスクにある場合、最初に OSS に移行することなく、それらを直接読み取るカスタムサービスが必要です。
動画を他のフォーマットに変換し、その上に新機能を追加する必要があります。
たとえば、動画をトランスコードし、ウォーターマークを追加し、動画ホームページ用の GIF を生成します。その後、稼働中のサービスに影響を与えることなく、トランスコーディングパラメーターの調整や新機能のリリースなどの新機能を追加します。
コスト要件
シンプルまたは軽量なトランスコーディングが必要です。
たとえば、OSS 動画の最初の数フレームから GIF を抽出したり、音声・動画ファイルの期間を取得したりするだけの場合です。これらの場合、独自のソリューションを構築する方がコストが低くなります。
独自のトランスコーディングサービスを構築するには、従来の自己管理型デプロイメントとサーバーレスデプロイメントの2つの方法があります。このトピックでは、両方のアプローチを比較し、サーバーレスデプロイメントの手順を説明します。
ソリューション
従来の自己管理型デプロイメント
コンピューターおよびネットワーク技術の成熟に伴い、クラウドプロバイダーの製品はますます堅牢になっています。音声・動画処理システムを構築するには、クラウド上で直接 ECS インスタンスを購入し、サービスをデプロイできます。その後、OSS と CDN を使用してメディアファイルを保存し、再生を高速化します。
サーバーレスデプロイメント
シンプルな動画処理システム
基本的な動画処理のみが必要な場合は、以下のアーキテクチャを使用します。
ユーザーが動画を OSS にアップロードすると、OSS トリガーが関数を自動的に呼び出します。関数は FFmpeg を呼び出して動画をトランスコードし、結果を OSS に保存します。
シンプルな動画処理システムのデモとステップバイステップの手順については、「シンプルな動画処理システム」をご参照ください。
動画処理ワークフローシステム
大容量動画の高速トランスコーディングや複雑な操作の組み合わせが必要な場合は、Serverless Workflow を使用して関数をオーケストレーションし、強力な動画処理システムを構築します。アーキテクチャは以下のとおりです。
ユーザーが MP4 動画を OSS にアップロードすると、OSS トリガーが関数を自動的に呼び出します。その後、関数は Serverless Workflow を呼び出して、動画を1つ以上のフォーマットにトランスコードします。このアプローチは、次のユースケースをサポートします。
単一の動画ファイルを複数のフォーマットにトランスコードし、さらに処理できます。たとえば、ウォーターマークを追加したり、処理後にデータベースのメタデータを更新したりできます。
複数のファイルが同時に OSS にアップロードされると、Function Compute は自動的にスケーリングし、それらを並列処理します。各ファイルは一度に複数のフォーマットにトランスコードされます。
NAS と動画セグメンテーションを組み合わせて、非常に大容量の動画を処理します。各動画について、まずセグメントに分割し、次にセグメントを並列トランスコードし、最後にそれらをマージします。大容量動画のトランスコーディングを高速化するために、適切なセグメント期間を設定します。
説明動画セグメンテーションは、動画ストリームを固定時間間隔で一連のセグメントファイルに分割し、それらのセグメントをリストするマニフェストファイルを生成します。
動画処理ワークフローシステムのデモとステップバイステップの手順については、「動画処理ワークフローシステム」をご参照ください。
サーバーレスアプローチの利点
エンジニアリング効率の向上
比較項目 | サーバーレスアプローチ | 従来の自己管理型アプローチ |
インフラストラクチャ | なし | お客様が調達し、管理します。 |
開発効率 | ビジネスロジックのみに集中します。Serverless Devs を使用してリソースをオーケストレーションおよびデプロイします。 | ビジネスロジックに加えて、ソフトウェアのインストール、サービスの構成、セキュリティ更新プログラムの適用など、本番環境を自分でセットアップします。 |
並列および分散動画処理 | Serverless Workflow を使用して、複数の動画の並列処理と大容量動画の分散処理のためにリソースをオーケストレーションします。安定性とモニタリングはクラウドプラットフォームによって処理されます。 | 安定性を確保するには、高度な開発スキルと堅牢なモニタリングシステムが必要です。 |
学習曲線 | 任意の言語で関数を記述し、FFmpeg の使用方法を知っている必要があります。 | プログラミングと FFmpeg の知識に加えて、Kubernetes と Elastic Compute Service (ECS) が必要になる場合があります。より多くの製品、用語、パラメーターの意味を学習する必要があります。 |
本番稼働までの時間 | 約 3 人日 (開発とテストに 2 日、ストレステストと観測に 1 日)。 | コアロジック以外に相当な時間と労力が必要です。控えめな見積もりでは、ハードウェア調達、ソフトウェアと環境のセットアップ、システム開発、テスト、モニタリングとアラート、カナリアリリースを含めて約 30 人日です。 |
弾力的スケーリングと運用保守不要
項目 | サーバーレスアプローチ | 従来の自己管理型アプローチ |
弾力的で高可用性 | Function Compute はミリ秒単位でスケーリングします。トラフィックスパイクを処理するために容量を迅速に追加します。運用保守は不要で、トランスコーディングパフォーマンスは優れています。 | Server Load Balancer (SLB) をデプロイし、弾力的スケーリングを管理する必要があります。Function Compute よりもスケーリングは遅くなります。 |
モニタリングとアラート | Serverless Workflow の実行と関数実行について、よりきめ細かい実行詳細を提供し、関数実行ごとのレイテンシーとログをクエリでき、より包括的なアラートおよびモニタリングメカニズムを提供します。 | 弾力的スケーリングまたはコンテナレベルのメトリクス。 |
トランスコーディングパフォーマンスの利点
MOV 動画ファイルが 89 秒間続くと仮定します。標準クラウドトランスコーディングサービスでは、MOV を MP4 に変換するのに 188 秒かかります。この値を参照時間 T とします。パフォーマンス加速率は次のように計算されます。パフォーマンス加速率 = T ÷ Function Compute トランスコーディング時間。
動画セグメント期間 (秒) | Function Computeトランスコーディング時間 (秒) | パフォーマンス加速率 (%) |
45 | 160 | 117.5 |
25 | 100 | 188 |
15 | 70 | 268.6 |
10 | 45 | 417.8 |
5 | 35 | 537.1 |
上記の表のパフォーマンス加速率は、CPU インスタンスにのみ適用されます。シナリオで GPU インスタンスを使用する場合は、「音声・動画処理のベストプラクティス」をご参照ください。
低コスト
一部の実世界のシナリオでは、Function Compute は、クラウドプロバイダーの動画トランスコーディングサービスと比較しても、動画処理のコストが低くなります。
以下の表は、最も一般的なオンデマンド動画フォーマットである MP4 と FLV 間の変換コストを比較しています。関数メモリは 3 GB に設定されています。実験結果は以下のコストを示しています。
コスト削減率は次のように計算されます。コスト削減率 = (クラウドベンダーの動画処理コスト − Function Compute トランスコーディングコスト) ÷ クラウドベンダーの動画処理コスト。
表 1. MP4 から FLV
解像度 | レート | フレームレート | Function Computeトランスコーディング時間 | Function Computeトランスコーディングコスト | クラウドベンダーの動画処理コスト | コスト削減率 |
標準解像度 640×480 | 889 KB/s | 24 | 11.2 秒 | 0.003732288 | 0.032 | 88.3% |
高解像度 1280×720 | 1963 KB/s | 24 | 20.5 秒 | 0.00683142 | 0.065 | 89.5% |
超高解像度 1920×1080 | 3689 KB/s | 24 | 40 秒 | 0.0133296 | 0.126 | 89.4% |
4K 3840×2160 | 11185 KB/s | 24 | 142 秒 | 0.04732008 | 0.556 | 91.5% |
表 2. FLV から MP4
解像度 | ビットレート | フレームレート | Function Computeトランスコーディング時間 | Function Computeトランスコーディングコスト | クラウドベンダーの動画処理コスト | コスト削減率 |
標準解像度 640×480 | 712 KB/s | 24 | 34.5 秒 | 0.01149678 | 0.032 | 64.1% |
高解像度 1280×720 | 1806 KB/s | 24 | 100.3 秒 | 0.033424 | 0.065 | 48.6% |
超高解像度 1920×1080 | 3911 KB/s | 24 | 226.4 秒 | 0.0754455 | 0.126 | 40.1% |
4K 3840×2160 | 15109 KB/s | 24 | 912 秒 | 0.30391488 | 0.556 | 45.3% |
クラウドベンダーの動画処理では標準トランスコーディングを使用します。1分未満のトランスコーディング時間は1分として課金されます。ここでは、課金は2分を使用します。課金が1.5分を使用した場合でも、コスト削減は10%未満で変動します。
上記の表は、Function Compute と Serverless Workflow に基づくソリューションが、高複雑度 FLV から MP4 および低複雑度 MP4 から FLV のトランスコーディングの両方で強力なコスト優位性を提供することを示しています。実世界の経験では、次の2つの理由により、さらに大きなコスト削減が示されています。
テスト動画は高ビットレートを使用しています。ほとんどの実世界のシナリオでは、低ビットレートの標準解像度または低解像度動画が関係します。ビットレートが低いと、Function Compute の計算時間とコストが削減されますが、一般的なクラウドトランスコーディング料金は変わりません。
一般的なクラウドトランスコーディングサービスは、非標準解像度に対して過剰に課金することがよくあります。たとえば、856×480 または 1368×768 の動画は、次のティアである 1280×720 HD または 1920×1080 UHD で課金され、急激な価格上昇を引き起こします。実際の計算増加は 30% 未満である可能性があります。Function Compute は使用量に応じて正確に課金します。
デプロイメント
このトピックでは、シンプルな動画処理システムと動画処理ワークフローシステムの2つのシナリオのデプロイメントをカバーします。
シンプルな動画処理システム
前提条件
Function Compute: Function Compute をアクティブ化します。
Object Storage ServiceOSS: OSS コンソールでバケットを作成する。
操作手順
サービスを作成します。
関数を作成します。
[関数管理] ページで、[関数の作成] をクリックします。
[関数の作成] ページで、作成方法を選択します。以下のオプションを設定します。[作成] をクリックします。
作成方法:組み込みランタイムで作成。
基本設定: [関数名] や [ハンドラタイプ] を含む関数の基本情報を設定します。[ハンドラタイプ] を [イベント駆動ハンドラ] に設定します。
関数コード: ランタイムとして Python 3.9 を選択します。[サンプルコードを使用] をコードアップロード方法として選択します。
高度な構成: ビデオ処理には時間がかかり、ファイルサイズも異なるため、このトピックでは [vCPU 数] = 4、[メモリ] = 8 GB、[一時ディスクサイズ] = 10 GB、および [タイムアウト] = 7200 秒を選択します。
その他のオプションにはデフォルト値を使用します。詳細な関数構成については、「関数を作成」をご参照ください。
OSS トリガーを作成します。
関数の詳細ページで、[トリガー] タブをクリックします。[バージョンまたはエイリアス] ドロップダウンリストから、トリガーのバージョンまたはエイリアスを選択します。[トリガーの作成] をクリックします。
「トリガーの作成」パネルで、必要な情報を入力します。[OK] をクリックします。
構成項目
アクション
このトピックの例
トリガーの種類
[オブジェクトストレージ OSS] を選択します。
Object Storage OSS
名前
カスタムトリガー名を入力します。
oss-trigger
バージョンまたはエイリアス
デフォルトは LATEST です。別のバージョンまたはエイリアスのトリガーを作成するには、まず関数の詳細ページにある [バージョンまたはエイリアス] ドロップダウンリストから選択します。詳細については、「バージョンを管理する」および「エイリアスを管理する」をご参照ください。
LATEST
バケット名
既存の OSS バケットを選択します。
testbucket
オブジェクトプレフィックス
オブジェクト名と一致するプレフィックスを入力します。ネストされたイベントループと追加料金を回避するために、プレフィックスとサフィックスの両方を設定することを推奨します。また、同じバケット内のトリガーでイベントタイプが同じ場合、プレフィックスとサフィックスは重複してはなりません。詳細については、「OSS トリガールール」をご参照ください。
重要ファイルプレフィックスが
/で始まる場合、OSS トリガーはトリガーされません。source
ファイル拡張子
オブジェクト名と一致するサフィックスを入力します。ネストされたイベントループと追加料金を回避するために、プレフィックスとサフィックスの両方を設定することを強く推奨します。また、同じバケット内のトリガーでイベントタイプが同じ場合、プレフィックスとサフィックスは重複してはなりません。詳細については、「OSS トリガールール」をご参照ください。
mp4
トリガーイベント
1つ以上のトリガーイベントを選択します。Object Storage Service (OSS) のイベントタイプについては、「OSS イベント定義」をご参照ください。
oss:ObjectCreated:PutObject, oss:ObjectCreated:PostObject, oss:ObjectCreated:CompleteMultipartUpload
ロール名
[AliyunOSSEventNotificationRole] を選択します。
説明このタイプのトリトリガーを初めて使用する場合、[OK] をクリックします。ダイアログボックスで、[Authorize now] を選択します。
AliyunOSSEventNotificationRole
関数コードを記述します。
関数の詳細ページで、[関数コード] タブをクリックします。エディターにコードを記述します。
この関数は 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 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 {}[コードをデプロイ] をクリックします。
関数コードをテストします。
関数入力パラメーターを使用して OSS イベントパラメーターをシミュレートし、正確性を検証できます。実際には、OSS イベントが発生すると関数は自動的にトリガーされます。
「関数詳細」ページで、[関数コード] タブをクリックし、[関数をテスト] の右側にある
アイコンをクリックします。ドロップダウンリストから [テストパラメーターを設定] を選択します。[テストパラメーターの設定] パネルで、[新しいテストイベントの作成] または [既存のテストイベントの編集] を選択します。[イベント名] とイベントコンテンツを入力します。[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****" } } ] }[関数のテスト] をクリックします。[関数コード] タブで結果を確認します。
動画処理ワークフローシステム
前提条件
サービスをアクティブ化し、バケットを作成
Function Compute: Function Compute をアクティブ化します。
Object Storage ServiceOSS: OSS コンソールでバケットを作成する.
サーバーレス ワークフロー: サーバーレス ワークフローの有効化。
File Storage NAS: Apsara File Storage NAS を有効化する。
Virtual Private Cloud: Virtual Private Cloud の有効化。
サービスロールを構成
AliyunFcDefaultRole: サービス作成時にこのロールを割り当てます。関数を呼び出し、ワークフローを管理し、OSS を管理するために、
AliyunOSSFullAccess、AliyunFnFFullAccess、およびAliyunFCInvocationAccess権限をアタッチします。AliyunOSSEventNotificationRole: OSS はデフォルトでこのロールを使用してイベント通知を送信します。
fnf-execution-default-role: ワークフローの作成と管理に必要です。
AliyunFCInvocationAccessおよびAliyunFnFFullAccess権限をアタッチします。
Serverless Devs をインストールして構成
操作手順
このソリューションは、Serverless Workflow を使用して動画処理のために関数をオーケストレーションします。これには、複数の関数を記述し、ワークフローを構成することが含まれます。このトピックでは、Serverless Devs を使用してシステムをデプロイします。
次のコマンドを実行してアプリケーションを初期化します。
s init video-process-flow -d video-process-flow初期化中に、以下の項目を構成します。必要に応じて値を調整します。
構成項目
例
Region
cn-hangzhou
Service name
video-process-flow-demo
Function Compute service RAM role ARN
acs:ram::10343546****:role/aliyunfcdefaultrole
OSS bucket name
testBucket
Prefix
source
Directory to save transcoded videos
dest
OSS trigger RAM role ARN
acs:ram::10343546****:role/aliyunosseventnotificationrole
Segment duration for video splitting
30
Output video format
mp4, flv, avi
Workflow name
video-process-flow
Workflow RAM role ARN
acs:ram::10343546****:role/fnf-execution-default-role
please select credential alias
default
次のコマンドを実行してプロジェクトに入り、デプロイします。
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プロジェクトをテストします。
OSS コンソールにログインします。testBucket のソースディレクトリに移動します。MP4 動画ファイルをアップロードします。
[Serverless Workflow コンソール] にログインします。 ワークフローページで目的のワークフローをクリックし、[実行] タブで実行名をクリックしてワークフローの実行フローとステータスを表示します。

実行ステータスが [成功] の場合、testBucket の dest ディレクトリに移動して、トランスコード済みファイルを表示します。
トランスコードされたファイルが表示される場合、動画処理システムは正しく実行されています。
参考文献
OSS トリガー
Serverless Devs
よくある質問
仮想マシンまたはコンテナ上で FFmpeg ベースの動画処理サービスをすでに運用している場合、その弾力性と可用性を向上させることは可能ですか?
本トピックで説明されているように、仮想マシンまたはコンテナプラットフォーム上で動作する FFmpeg ベースのサービスは、Function Compute に容易に移行できます。Function Compute では FFmpeg コマンドを低コストでリファクタリングして直接移植でき、Function Compute の弾力性および高可用性をそのまま継承します。
多数の動画を並行処理するにはどうすればよいですか?
動画処理ワークフロー システムをご参照ください。複数のファイルが OSS に同時にアップロードされると、Function Compute は自動的にスケーリングし、並列で処理を行います。詳細については、「動画処理ワークフロー システムの負荷試験」をご参照ください。
毎週金曜日に生成される 4 GB を超える 1080p 動画を数百本など、多数の大きな動画を短時間(数時間以内)でバッチ処理する必要があります。どのように実現すればよいですか?
各大きな動画に対して十分な計算リソースを確保できるよう、セグメントサイズを調整してください。詳細については、「動画処理ワークフロー システムの負荷試験」をご参照ください。
データベースへのトランスコード詳細の記録や、オリジンサーバーへの負荷を軽減するために人気動画を CDN にプリフェッチするなど、高度なカスタム処理が必要です。どのように実現すればよいですか?
動画処理ワークフロー システムをご参照ください。処理中にカスタムステップを追加したり、ワークフローを拡張したりできます(例:後処理または前処理ステップの追加)。
カスタム動画処理には、トランスコード、ウォーターマークの挿入、動画ホームページ用 GIF 生成など複数のステップが含まれます。ライブサービスに影響を与えることなく、後からトランスコードパラメーターの調整などの新機能を追加するにはどうすればよいですか?
動画処理ワークフロー システムをご参照ください。Serverless Workflow は関数呼び出しのみをオーケストレーションするため、関連する関数のみを更新すれば済みます。関数はバージョンとエイリアスをサポートしており、より安全なカナリアリリースが可能です。詳細については、「バージョン」をご参照ください。
OSS 動画の最初の数フレームから GIF を抽出する、または音声/動画の持続時間を取得するなど、単純なトランスコードや軽量なタスクのみが必要です。独自にソリューションを構築した方がコスト効率が良いと考えています。どのように実現すればよいですか?
Function Compute はカスタム要件に対応できます。コード内でいくつかの FFmpeg コマンドを実行するだけで済みます。具体的な例については、「fc-oss-ffmpeg」をご参照ください。
動画ソースファイルが NAS または ECS クラウドディスク上に保存されており、OSS に移動せずに直接処理したいです。どのように実現すればよいですか?
Function Compute は NAS をマウントしてファイルを直接処理できます。詳細については、「NAS ファイルシステムの設定」をご参照ください。