サーバーレステクノロジーに基づくビデオフレームカットアーキテクチャの実際の戦い

序文

ライブビデオストリーミングは、複数人のリアルタイムインタラクション特性を備えた革新的な形式のオンラインエンターテインメントであり、eコマース、ゲーム、オンライン教育、エンターテインメントなどの多くの業界で非常に幅広いアプリケーションがあります。ネットワークインフラストラクチャの継続的な改善とソーシャルエンターテインメントの需要の高まりに伴い、ライブビデオストリーミングは、すべての人の日常生活に浸透し続け、ユーザーの断片化された余暇を占めています。ライブビデオストリーミングのテクニカルサポート能力も絶えず向上しており、ライブビデオ市場の成長を2014年の212億元から2020年には548億5000万元に押し上げ、約12.8%の成長率で急速に発展し続けるでしょう。今後5年間で。

ビデオフレームカット要件の概要

ライブ放送業界は、ますます多くの法律、規制、ポリシーの対象となっています。一般的な業界標準と運用手順の制約の下で、すべてのライブ放送プラットフォームは、違法なライブ放送コンテンツとアンカーと視聴者の間の不適切な相互作用に対処する義務があります。対策を講じてください。生放送業界のより標準化された発展に貢献すること。ライブストリーム内の違法なコンテンツを初めて検出する方法は、ライブ放送プラットフォームが直面する必要のある一般的な課題です。ビデオフレームのカットは、コンテンツレビューのニーズを満たすための日常的な操作です。ビデオフレームは、ライブビデオのさまざまなリスクレベルに応じて、さまざまな頻度でカットできます。保存された写真は、ポルノ、政治、広告の目的で、自作またはサードパーティのコンテンツレビュープラットフォームにアップロードできます。認識を待ちます。シーンの。さらに、学生のリスニングステータスをインテリジェントに分析するためのオンライン教室アプリケーションなど、特定のビジネス要件もビデオスクリーンショットを通じて実現する必要があります。

ビデオフレーム切断技術アーキテクチャの分析

ビデオストリームのフレームカット操作は、FFmpegコマンドを使用して実現できます。FFmpegのフレームキャプチャコマンドは非常に使いやすく、画像がキャプチャされるたびに、画像をオブジェクトストレージOSSにアップロードし、対応するフレームキャプチャ情報をメッセージキューKafkaに送信します。このようにして、監査サービス(サードパーティサービスまたは自作サービスの場合があります)は、Kafkaからフレーム情報を取得し、対応するイメージをOSSから取得して処理できます。このアーキテクチャでは、非同期処理メカニズムを通じてピークビジネス期間中の監査サービスの負荷を軽減するためにKafkaが導入されています。

FFmpegは使いやすいですが、多くのCPU計算能力を必要とする操作です。ビデオストリームが1秒の固定周波数でクリップされる場合、16コアECSは、100のビデオストリームのフレームを同時にカットするタスクを実行できる可能性があります。ピーク時のサービスの安定性を確保するために、ビデオフレームカットサービスを展開するために多数のECSを準備する必要があります。ただし、ほとんどのインターネットアプリケーションには明らかな山と谷があります。たとえば、毎晩のゴールデンタイムはビジネスのピークであり、24:00以降のビジネス量は大幅な減少傾向を示します。このようなビジネスの変動は、全体的なリソース計画に大きな課題をもたらしました。フレームインターセプトサービスが固定ECSクラスタースケールに従って展開される場合、2つの非常に明白な欠点があります。

  1. ビジネスのピークをサポートするには、ピーク時のユーザー数に応じてクラスターサイズを評価する必要があります。これにより、ピーク時の低い時間帯に大量の無駄が発生します。
  2. スター効果など一部のシナリオでは、取引量が急増し、一時的にクラスターを拡張する必要がある場合があります。この場合、拡張速度がビジネスフローの成長率に遅れをとって劣化することがよくあります。いくつかの事業の処理。

リソースの使用率を向上させるために、エラスティックECSインスタンスを介してアプリケーションをコンテナー化された方法でデプロイし、クラスターの規模を実際のビジネスボリュームの変化に動的に適応させることもできます。ただし、実際の状況では、このようなスキームの弾性スケーリング戦略の実装はより複雑であり、弾性スケーリング機能は比較的遅れており、効果はあまり良くない可能性があります。基本的な理由は、従来のサービスアーキテクチャでは、アプリケーションは起動後も長時間実行され続け、運用中に複数のビジネス要件を同時に処理するためです。ビジネス量がどのように変化しても、このアプリケーションが占める計算能力は必須ではありません。変更。

対応する計算能力を引き出して、ライブビデオストリームが開かれた後にフレームをインターセプトするタスクを引き受け、ビデオストリームが閉じられた後に自動的に計算能力を解放する簡単な方法はありますか?この方法では、アプリケーションインスタンスが永続的に常駐する必要がなく、コンピューティングリソースの真のオンデマンド分散を実現でき、フレームカッティングサービスのクラスターサイズを動的に調整するための追加の手段も必要ありません。これは最も理想的なソリューションです。

クラウドネイティブのサーバーレステクノロジーの代表として、Alibaba Cloud Function ComputingFCはこのアイデアを実現しました。

関数コンピューティングFCに基づくサーバーレスアーキテクチャ

Function Computing FCは、イベント駆動型のフルマネージドコンピューティングサービスです。機能コンピューティングを使用すると、ユーザーはサーバーなどのインフラストラクチャを購入して管理する必要がなく、コードを記述してアップロードするだけです。関数コンピューティングは、コンピューティングリソースを自動的に準備し、タスクを柔軟かつ確実に実行し、ログクエリ、パフォーマンスモニタリング、アラームなどの関数を提供します。関数計算FCの助けを借りて、あらゆるタイプのアプリケーションとサービスをすばやく構築でき、タスクによって実際に消費されたリソースに対して支払うだけで済みます。

関数計算FCはイベント駆動型の計算モデルを提供し、関数の実行はイベントによって駆動されます。関数の実行は、関数のユーザーまたはその他のイベントソースによってトリガーできます。指定した関数でトリガーを作成できます。トリガーは一連のルールを記述します。イベントがこれらのルールを満たすと、イベントソースが対応する関数をトリガーします。たとえば、HTTPトリガーの場合、ユーザーのHTTPリクエストで関数をトリガーできます。OSSトリガーの場合、OSS上の新しいファイルまたは変更されたファイルで関数をトリガーできます。ビデオフレームカットシーンでは、この機能は、各ライブストリームがプッシュされ始める前に、ビジネスプログラムを介してフレームカット機能をアクティブにトリガーするだけで済みます。したがって、元のフレームカッティングアーキテクチャは、サーバーレスの価値を享受するためにわずかな調整を加えるだけで、機能的なコンピューティングプラットフォームに移行できます。

サーバーレスアーキテクチャのビデオフレーム切断技術の実現

ここで、いくつかの簡単な手順を使用して、ビデオフレームの要件を満たす関数コンピューティングFCに基づくサーバーレスアーキテクチャを構築します。関数型コンピューティングFCは、Node.js、Python、PHP、Javaなどの複数の言語、特に関数型コンピューティングプラットフォームのスケジューリングコードを直接変更できるPythonなどのスクリプト言語にネイティブなオペレーティング環境を提供します。使い方はとても簡単です。この記事のサンプルコードはPythonで実装されています。

もちろん、機能コンピューティングFCには開発言語の要件はなく、主流の開発言語を十分にサポートできます。関数計算FCによって提供されるカスタムランタイムは、タスク言語用にカスタマイズされた動作環境を確立できます。カスタムランタイムは基本的にHTTPサーバーです。このHTTPサーバーは、イベント呼び出しやHTTP関数呼び出しを含む、関数コンピューティングシステムからのすべての要求を引き継ぎます。

ビデオストリームを出力

サードパーティのビデオストリーミングサービスを介して開発できますが、ローカルでのデバッグを容易にするために、独自に構築したRTMPサービスを介してビデオストリームの出力を実現できます。より簡単な方法は、ECSを購入し、NginxをデプロイしてRTMPサービスを実装することです。これには、nginx-rtmp-moduleモジュールをロードする必要があります。インターネット上に関連するチュートリアルが多数ありますが、この記事では繰り返しません。

RTMPサービスを使用すると、http://ffmpeg.org/にアクセスしてコンパイル済みのffmpegパッケージダウンロードし、FFmpegコマンドを使用してローカルビデオファイルをRTMPサービスにプッシュできます。たとえば、次の方法を使用します。

ffmpeg -re -i test.flv -vcodec copy -acodec aac -ar 44100 -f flv rtmp://xxx.xxx.xxx.xxx:1935/stream/test 

次に、ブラウザを開き、対応するRTMPライブブロードキャストアドレスを入力すると、対応するプレーヤーをプルアップしてライブブロードキャストを視聴できます。rtmp://xxx.xxx.xxx.xxx:1935 / stream / test

Funcraftをインストールする

Funcraftは、サーバーレスアプリケーションのデプロイをサポートするツールであり、ユーザーが関数コンピューティング、APIゲートウェイ、ログサービスなどのリソースを便利に管理するのに役立ちます。Funcraftは、リソース構成ファイルtemplate.ymlを介して開発、構築、展開、およびその他の操作を実装できます。これにより、ファンクションコンピューティングFCを使用してサーバーレスアーキテクチャを実装する場合、構成と展開のワークロードを大幅に削減できます。

Funcraftをインストールするには、npmパッケージ管理のインストール、ダウンロードバイナリのインストール、Homebrewパッケージマネージャーのインストールの3つの方法があります。npmがインストールされていない環境の場合、最も簡単な方法は、バイナリをダウンロードしてインストールすることです。対応するプラットフォームのFuncraftインストールパッケージhttps://github.com/alibaba/funcraft/releasesからダウンロードし、解凍後に使用できます。次のコマンドを使用して、Funcraftパッケージが正常にインストールされているかどうかを確認できます。

fun --version

コマンドの実行後にFuncraftに対応するバージョン番号(3.6.20など)が返された場合は、インストールが成功したことを意味します。

funを初めて使用する前にfun config 、初期設定のコマンドを実行する必要があり ます。この操作では、Alibaba CloudアカウントID、アクセスキーID、シークレットアクセスキー、デフォルトのリージョン名などの一般情報を提供する必要があります。これらの情報は表示できます。ファンクションコンピューティングコンソールホームページの右上から。牙を入手。タイムアウトなどの他の情報は、デフォルト値を直接使用できます。

OSSを構成する

スクリーンショットの後に保存されたファイルはバックアップのためにオブジェクトストレージOSSにアップロードされるため、Alibaba Cloud OSSサービスをアクティブ化し、対応するバケットを作成する必要があります。特定の操作については、https://www.aliyun.com/を参照してください。完了する製品/ OSS

ログサービスSLSの構成

Log Service(Log Service)は、Alibaba Cloudが提供するログデータのワンストップサービスです。LogServiceを介して機能ログを保存するには、機能に対応するサービスでログアイテムとログウェアハウスを構成し、サービスを付与する必要があります。ログサービスへのアクセス。権限。機能ログは設定されたログウェアハウスに出力され、同じサービスの下にあるすべての機能ログは同じログウェアハウスに出力されます。機能実行のログをAlibabaCloud Log Serviceに保存し、ログサービスに保存されている機能ログに基づいて、コードのデバッグ、障害分析、データ分析などの操作を実行できます。

ログプロジェクトとログウェアハウス作成を参照して、ログサービスSLSを構成できます。ログプロジェクトログウェアハウスが正常に作成されたことを確認するには、関数をデプロイするときにログプロジェクトとログウェアハウスの情報を使用する必要があります。

書き込み関数

ここで、最も単純なPythonコードの一部を使用して、関数計算FCを使用してフレームインターセプト操作を実現する方法を体験します。読者が理解しやすいように、ビジネスロジックを一時的に簡略化し、次の2つのアクションのみを実行します。

  1. FFmpegコマンドで1枚の写真をキャプチャ
  2. OSSに保存
import json, oss2, subprocess

HELLO_WORLD = b'Snapshot OK!\n'
OSS_BUCKET_NAME = b'snapshot'

def handler(environ, start_response):
    logger = logging.getLogger() 
    context = environ['fc.context']
    request_uri = environ['fc.request_uri']
    for k, v in environ.items():
        if k.startswith('HTTP_'):
            pass
    try:        
        request_body_size = int(environ.get('CONTENT_LENGTH', 0))
    except (ValueError):        
        request_body_size = 0
    #获得直播流的地址
    rtmp_url = request_body.decode("UTF-8")
    #通过FFmpeg命令截取一张图片
    cmd = ['/code/ffmpeg', '-i', rtmp_url, '-frames:v', '1', '/tmp/snapshot.png' ]
    try:
        subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
    except subprocess.CalledProcessError as exc:
        err_ret = {'returncode': exc.returncode, 'cmd': exc.cmd, 'output': exc.output.decode(),'stderr': exc.stderr.decode()}
        print(json.dumps(err_ret))
    raise Exception(context.request_id + ' transcode failure')
    #上传到OSS
    creds = context.credentials
    auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token)
    bucket = oss2.Bucket(auth, 'http://oss-{}-internal.aliyuncs.com'.format(context.region), OSS_BUCKET_NAME)
    logger.info('upload pictures to OSS ...')
    for filename in os.listdir("/tmp"): 
        bucket.put_object_from_file("example/" + filename, "/tmp/" + filename)
    status = '200 OK'
    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers)
    return [HELLO_WORLD]

このコードを分析してみましょう。まず、Pythonの標準モジュールに加えて、Function Computing FCのPythonランタイム環境には、一般的に使用されるモジュールもいくつか含まれています。実際、関数でAlibaba Cloud Object StorageOSSを操作するために使用されるoss2が含まれています。したがって、oss2モジュールをコードに直接導入できます。

関数計算FCは、複数のタイプのトリガーを統合します。このサンプル関数は、HTTPトリガーを使用します。各HTTP要求は、関数の実行をトリガーします。HTTPトリガーを使用するPythonコードの場合、エントリ関数はhandler、environパラメーターが関数を呼び出すクライアントに関する情報とコンテキスト情報を伝達することです。HTTPリクエストの本文からSTMPライブストリームのアドレスを解析し、FFmpegコマンドを使用して画像をインターセプトできます。

このコードでは、ffmpeg実行可能プログラムは/codeディレクトリにあり、/code/ffmpegパスを介して実行できます。これは、関数をデプロイするときに、ffmpeg実行可能プログラムとこのコードをこのディレクトリにパッケージ化したためです。関数デプロイメントを紹介するときに、関数コードと実行可能プログラムを統合する方法をさらに紹介します。一緒にパックします。

/ tmpディレクトリに保存されている画像ファイルをOSSにアップロードする過程で、関数コンテキストからOSSにアクセスするための資格情報を直接取得できるため、構成ファイルを介してaccessKey、accessSecretなどの情報を取得する必要はありません。これにより、作業負荷が軽減されます。

展開機能

まず、ローカルで作業ディレクトリを作成し、このディレクトリの下にcodeという名前のサブディレクトリを作成し、Linux環境のffmpeg実行可能ファイルをディレクトリにコピーしcodeて、パスを介してコードで/code/ffmpegffmpegコマンド呼び出すことができるようにします

次に、最も重要な作業を開始し、現在の作業ディレクトリにtemplate.ymlファイルを作成し、すべての展開情報を記述します。

ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
  #服务
  snapshotService:
    Type: 'Aliyun::Serverless::Service'
    Properties:
      Description: 'Snapshot Semo'
      Policies:
        - AliyunOSSFullAccess
      #之前创建的日志项目和日志仓库
      LogConfig:
        Project: fc-bj-pro
        Logstore: fc-log
    #函数
    snapshot:
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: index.handler
        Runtime: python3
        MemorySize: 128
        Timeout: 600
        CodeUri: './code'
      # HTTP触发器
      Events:
        http-test:
          Type: HTTP
          Properties:
            AuthType: ANONYMOUS
            Methods: ['POST']

構成情報は比較的単純なので、最初にサービスを定義する必要があります。サービスは、機能的なコンピューティングリソース管理の単位です。ビジネスシナリオから始めて、アプリケーションを複数のサービスに分割できます。リソース使用量の次元から始めて、サービスは複数の機能で構成できます。たとえば、データ処理サービスは、データ準備とデータ処理の2つの部分に分かれています。データ準備機能は小さなリソースを必要とし、小さなサイズのインスタンスを選択できます。データ処理機能には大きなリソースが必要であり、大規模なインスタンスを選択できます。関数を作成する前にサービスを作成する必要があります。同じサービスの下にあるすべての関数は、サービス認証やログ構成など、同じ設定の一部を共有します。このコードでは、作成したサービスの名前snapshotServiceにOSSのすべての操作権限があり、以前に作成したログプロジェクトとログウェアハウスを参照しています。

関数インスタンス仕様の構成では、各コンピューティングインスタンスが1つのビデオストリームを処理するだけでよいため、最も低い仕様である128Mメモリのインスタンスを選択します。

次に、関数を定義し、対応する動作環境、エントリメソッド、コードディレクトリ、タイムアウト時間などの情報を構成し、この関数のHTTPトリガーを定義する必要があります。このコードでは、関数の名前snapshotは、対応するオペレーティング環境はPython3であり、名前付きのhttp-testHTTPトリガーが定義されています。

この作業ディレクトリで実行しfun deployます。プロンプトが表示された場合はserver SnapshotService deploy success、コードとffmpegプログラムがパッケージ化されてクラウドにデプロイされていることを意味します

コンソールのサービスと機能メニューでは、アップロードされたサービスと機能の情報を確認でき、オンラインで機能コードを表示および変更することもできます。

実行機能

これはHTTPタイプの関数であるため、curlコマンドまたはPostmanなどの他のHTTPツールを使用して、関数計算FCへのHTTP要求を開始し、フレームインターセプト操作の実行結果を確認できます。もちろん、関数コンピューティングFCコンソールには、関数を検証するための視覚的な操作インターフェイスも用意されており、HTTP要求をすばやく開始できます。

関数が正常に実行されると、OSSコンソールに移動して、キャプチャされた画像が正常にアップロードされたかどうかを確認できます。これまでのところ、HTTPリクエストトリガー関数の計算を通じてビデオストリームの画像をインターセプトし、それをOSSにアップロードできる、最も基本的なサーバーレスビデオフレームインターセプトアーキテクチャを構築しました。

連続フレームカット

1枚の画像のフレームカット操作は非常に簡単です。FFmpegコマンドを実行した後、一時フォルダ内の画像をOSSに直接アップロードして、機能のライフサイクルを完了することができます。単一の画像フレームキャプチャはすでに多くのビジネスシナリオに対応できますが、一定の頻度でフレームを継続的にキャプチャし、保存した画像をリアルタイムでOSSにアップロードする必要がある場合は、コードにいくつかの変更を加える必要があります。

メッセージキューKafkaを構成する

ピーク時のコンテンツレビューサービスの負荷を軽減するために、フレームインターセプトサービスとコンテンツレビューサービスの間にメッセージキューKafkaを導入し、コンテンツレビューサービスが保存された画像を消費することで非同期に同期できるようにします。 Kafkaから受信したメッセージは処理します。ビデオフレームカットアーキテクチャでは、Kafkaは情報転送において非常に重要な役割を果たします。ライブブロードキャストの同時実行性が高く、フレームカット頻度が高いほど、Kafkaへのプレッシャーは大きくなります。特にビジネスのピーク時には、高負荷の作業でKafkaを安定させる必要があります。AlibabaCloudが提供するメッセージキューKafkaを直接使用すると、Kafkaクラスターのメンテナンスワークロードを大幅に削減し、最も簡単な方法で取得できます。動的拡張。可用性の高いKafkaサービス。

実際のシナリオのニーズに応じてKafkaアクティベーションインターフェイス開き、対応する仕様のKafkaインスタンスを購入できます。Kafkaコンソールの基本情報では、Kafkaインスタンスに対応するデフォルトのアクセスポイントを確認できます。

次に、トピック管理インターフェイスに入り、フレームインターセプトサービスのトピックを作成します。

Kafkaインスタンスのデフォルトのアクセスポイントとトピック名は、次の手順で使用する必要のある情報です。

KafkaクライアントSDKをインストールします

その前に、Kafkaに書き込む関数の機能を取得するために、いくつかの追加の操作を渡す必要もあります。

Kafka SDKを使用する必要があるため、FuncraftツールとPythonパッケージ管理ツールpipを組み合わせてKafkaSDKモジュールをインストールできます。

fun install --runtime python3 --package-type pip kafka-python

コマンドを実行すると、次のプロンプトメッセージが表示されます。

この時点で、ディレクトリに.funフォルダが生成され、インストールした依存関係パッケージが次のディレクトリにあることがわかります。

VPCのリソースにアクセスする機能を開きます

デフォルトでは、関数コンピューティングはVPC内のリソースにアクセスできません。関数がVPCにデプロイされたKafkaサービスにアクセスできるようにする必要があるため、VPC関数とサービスの関連するパーミッションを手動で設定する必要があります。設定関数を参照してVPC内のリソースにアクセスし、関数とKafkaサービス間の接続を開くことができます。原則は許可することです

Elastic Network Card ENIにはVPCにアクセスする権限があり、Elastic Network Card ENIは関数を実行するインスタンスに挿入されるため、関数はVPC内のリソースにアクセスできます。

コード

次のFFmpegコマンドを使用して、指定された頻度で継続的なフレームインターセプトを実現できます。

ffmpeg -i rtmp://xxx.xxx.xxx.xxx:1935/stream/test -r 1 -strftime 1 /tmp/snapshot/%Y%m%d%H%M%S.jpg

コマンドの実行中、Pythonプログラムの現在のプロセスは、ビデオストリームのプッシュが終了するのを待つため、関数コードを変更して新しいスキャンプロセスを開始する必要があります。スキャンプロセスは常に画像カタログをチェックします。新しい画像が生成されたことが検出されると、画像をOSSにアップロードし、傍受したフレーム情報をKafkaに送信し、最後に画像を画像カタログから削除します。

import logging, json, oss2, subprocess
from multiprocessing import Process
from kafka import KafkaProducer

HELLO_WORLD = b'Snapshot OK!\n'
OSS_BUCKET_NAME = b'snapshot'
logger = logging.getLogger()
output_dir = '/tmp/shapshot'
# 扫描图片目录
def scan(bucket, producer):
    flag = 1
    while flag:
        for filename in os.listdir(output_dir):
            if filename == 'over':
                # ffmpeg命令完成,准备停止扫描
                flag = 0
                continue
            logger.info("found image: %s", snapshotFile)
            try: 
                full_path = os.path.join(output_dir, filename)
                # 上传到OSS
                bucket.put_object_from_file("snapshot/" + filename, full_path)
                # 发送到Kafka
                producer.send('snapshot', filename.encode('utf-8'))
                # 删除图片
                os.remove(full_path)
            except Exception as e:
                logger.error("got exception: %s for %s", e.message, filename)
        time.sleep(1)

def handler(environ, start_response):
    logger = logging.getLogger() 
    context = environ['fc.context']
    #创建图片输出文件夹
    if not os.path.exists(output_dir):
        os.mkdir(output_dir)
    #解析HTTP请求,获得直播流的地址
    request_uri = environ['fc.request_uri']
    for k, v in environ.items():
        if k.startswith('HTTP_'):
            pass
    try:        
        request_body_size = int(environ.get('CONTENT_LENGTH', 0))
    except (ValueError):        
        request_body_size = 0
    rtmp_url = request_body.decode("UTF-8")
    #启动Kafka Producer
    producer = KafkaProducer(bootstrap_servers='XX.XX.XX.XX:9092,XX.XX.XX.XX:9092')
    #启动OSS Bucket
    creds = context.credentials
    auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token)
    bucket = oss2.Bucket(auth, 'http://oss-{}-internal.aliyuncs.com'.format(context.region), OSS_BUCKET_NAME)
    #启动扫描进程
    scan_process = Process(target=scan, args=(bucket, producer))
    #通过FFmpeg命令按每秒1帧的频繁连续截帧
    cmd = ["/code/ffmpeg", "-y", "-i", rtmp_url, "-f", "image2", "-r", "1",
        "-strftime", "1", os.path.join(output_dir, "%Y%m%d%H%M%S.jpg")]
    try:
        subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
    except subprocess.CalledProcessError as exc:
        err_ret = {'returncode': exc.returncode, 'cmd': exc.cmd, 'output': exc.output.decode(),'stderr': exc.stderr.decode()}
        logger.error(json.dumps(err_ret))
    raise Exception(context.request_id + ' transcode failure')
    #写入标志文件,子进程结束工作
    os.system("touch %s" % os.path.join(output_dir, 'over'))
    scan_process.join()
    producer.close()
    status = '200 OK'
    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers)
    return [HELLO_WORLD]

さらなる最適化

長いビデオクリップ

関数計算FCのデフォルトの柔軟なインスタンスは600秒で、これは関数実行時間の上限である10分です。つまり、関数がトリガーされた後、計算タスクが10分間完了しなかった場合、自動的に終了します。この制限は、再生時間が10分を超えるビデオストリームのフレームカット操作に影響します。長いビデオは非常に一般的です。この制限を回避して、長いビデオのフレームをカットするにはどうすればよいですか。次の3つの解決策で解決できます。

  1. 各関数は1フレームのみをカットします。フレームをカットする頻度が比較的低い場合、またはビデオストリームを特定の時点でのみカットする必要がある場合は、関数と再生のライフサイクルを維持する必要はありません。ビデオストリームのサイクル一貫性があり、各機能は、開始後に1フレームの画像のみをキャプチャできます。カスタムトリガープログラムを使用すると、必要な時点で機能を開始したり、サーバーレスワークフローを使用してより複雑な機能を配置したりできます。サーバーレスワークフローの詳細については、https://www.aliyunを参照してください。 com / product / fnf
  2. 複数の関数リレーを介して完了:関数計算FCにはfc2、関数間の相互呼び出しに使用できるモジュールが組み込まれています。このようにして、各フレームカット機能の実行時間を10分以内に制御できます。たとえば、8分は固定実行時間です。関数が終了する前に、別の関数リレーを開始して、ビデオストリームが終了するまでフレームをカットするタスクを完了します。このソリューションは、2つの関数が引き渡されると、約1秒の時間がかかり、フレームカット周波数の精度を厳密に制限できないため、フレームカット周波数の精度が特に高くないシナリオに非常に適しています。保証されています。
  3. パフォーマンスインスタンスの使用:デフォルトのエラスティックインスタンスに加えて、Function Computing FCはパフォーマンスインスタンスも提供します。パフォーマンスの強さは、より高いリソース制限、より多くの適応シナリオ、および10分の実行時間を超える能力を備えた大規模インスタンスに属します。制限。パフォーマンスインスタンスの拡張速度は遅く、エラスティックスケーラビリティはエラスティックインスタンスほど良くありませんが、単一インスタンスの複数の同時実行モードと予約モードを調整することで、パフォーマンスインスタンスの柔軟性を向上させることができます。具体的な紹介については、シングルインスタンスの複数の同時実行および予約モードを参照してください

コストの最適化

関数コンピューティングは、豊富な測定モデル、競争力のある価格設定、および詳細なリソース使用量インジケーターを提供します。サーバーレスのアプリケーション中心のアーキテクチャと組み合わせることで、リソース管理は前例のないほど便利で、さまざまなシナリオで非常に競争力があります。

リソースの仕様と柔軟性の要件の違いに応じて、関数の計算には、前払い(年次および月次サブスクリプション)と後払い(従量制)の2つの測定モードがあります。通常の状況では、従量課金モデルを使用するだけでよく、実際に使用された機能コンピューティングリソースに対して支払うだけでよく、事前にリソースを購入する必要はありません。ただし、ユーザーはプリペイドモードを柔軟に選択して、実際の1日のリソース使用量に応じて使用コストを節約できます。プリペイドモデルとは、ユーザーが事前に一定量の計算能力を購入することを意味します。事前購入した計算能力のライフサイクル中、機能の実行中に消費されたリソースを毎秒差し引くことができます。プリペイドモデルの単価後払いモデルよりも低くなることはありません。

Function Computing Consoleの[リソースセンター]ページでは、リソース使用量の安定した柔軟な部分を含め、現在のアカウントでのリソースの実際の使用量を一目で確認できます。この情報を通じて、プリペイドリソースとポストペイドリソースを合理的に割り当てることができます。リソース使用量詳細グラフの緑色の曲線は実際の1日のリソース使用量を表し、黄色の直線はプリペイドリソースから差し引くことができる使用量を表します。実際の状況に応じてプリペイドリソースの割合を適切に増やして、より多くのリソースを作成できます。リソースの使用量はプリペイドリソースでカバーされるため、並べ替えのリソースコストが削減されます。

総括する

ビデオフレームカットのシーンでは、サーバーレステクノロジーの価値は非常に明白です。関数コンピューティングの革新的なインスタンススケジューリングエンジンは、効率、パフォーマンス、コスト、およびオープン性の点でクラウドコンピューティングの利点を最大化します。2021年2月の時点で、5社を超える大手インターネット企業がファンクションコンピューティングFCに基づくビデオキャプチャの実装を開始しています。さまざまなフレームキャプチャ要件の下で、従来のECSベースの展開サービスと比較して使用コストを少なくとも20%節約できます。システムメンテナンスの作業負荷を大幅に削減できます。移行と変換に関しては、事前調査、開発、デバッグ、テスト、リリースのすべてのプロセスを1週間以内に完了し、クラウドコンピューティング時代のサーバーレステクノロジーによってもたらされる莫大な利益を享受し始めることができます。

 

元のリンク

この記事はAlibabaCloudのオリジナルのコンテンツであり、許可なく複製することはできません。

おすすめ

転載: blog.csdn.net/weixin_43970890/article/details/113883146