実際の戦闘|サーバーレステクノロジーに基づくビデオフレームカットアーキテクチャを実現するにはどうすればよいですか?

序文


ライブビデオストリーミングは、複数人のリアルタイムインタラクション特性を備えた革新的な形式のオンラインエンターテインメントであり、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、シークレットアクセスキー、デフォルトのリージョン名などの一般的な情報を提供する必要があります。ホームページの右上にある関数コンピューティングコンソール(https://fc.console.aliyun.com/)から。タイムアウトなどの他の情報については、デフォルト値を使用してください。

OSSを構成する

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

ログサービスSLSの構成

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

ログプロジェクトとログウェアハウスの作成(https://help.aliyun.com/document_detail/54604.html)を参照して、ログサービスSLSを設定できます。ログプロジェクトとログウェアハウスが正常に作成されていることを確認してください。関数をデプロイするときは、ログプロジェクトとログウェアハウス情報を使用する必要があります。


書き込み関数

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

  1. FFmpegコマンドで1枚の写真をキャプチャします。

  2. OSSに保存します。

import json, oss2, subprocessHELLO_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アクティベーションインターフェイス(https://common-buy.aliyun.com/?commodityCode=alikafka_pre®ionId=cn-hangzhou)を開き、実際のシナリオのニーズに応じて、対応する仕様のKafkaインスタンスを購入できます。Kafkaコンソールの基本情報(https://kafka.console.aliyun.com/?spm=5176.167616.1kquk9v2l.2.6a3d5a1cqKUEUh#/InstanceList?instanceId=alikafka_post-cn-nif1osdl400w®ionId=cn-hangzhou0)で確認できます。 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(https://help.aliyun.com/document_detail/72959.html)のリソースにアクセスし、関数と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, subprocessfrom multiprocessing import Processfrom kafka import KafkaProducerHELLO_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]


FFmpegコマンドの実行後に子プロセスを正常に終了できるようにするために、画像ディレクトリにフラグファイルを書き込み、コードビデオストリームは正常に終了し、新しい画像は生成されないため、子プロセスはループを停止できます。このようにして、ビデオストリームの開始時に実行する新しい関数をトリガーできます。ビデオストリームの再生が続くと、関数はインターセプトによって生成された画像をOSSに継続的にアップロードします。ビデオストリームが終了すると、機能サイクルは終了しました。

さらなる最適化


長いビデオクリップ

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

  1. 各関数は1フレームのみをカットします。フレームをカットする頻度が比較的低い場合、またはビデオストリームを特定の時点でのみカットする必要がある場合は、関数と再生のライフサイクルを維持する必要はありません。ビデオストリームのサイクル一貫性があり、各機能は、開始後に1フレームの画像のみをキャプチャできます。カスタムトリガーを使用すると、必要な時点で関数を開始できます。また、サーバーレスワークフローを使用して関数をより複雑に配置することもできます。サーバーレスワークフローの詳細については、https://www.aliyun.com / product / fnfを参照してください。

  2. 複数の関数リレーで完了:関数計算FCには、関数間の相互呼び出しに使用できるfc2モジュールが組み込まれています。このようにして、各フレームカット機能の実行時間を10分以内に制御できます。たとえば、8分は固定実行時間です。関数が終了する前に、別の関数リレーを開始して、ビデオストリームが終了するまでフレームをカットするタスクを完了します。このソリューションは、2つの関数が引き渡されると、約1秒の時間がかかり、フレームカット周波数の精度を厳密に制限できないため、フレームカット周波数の精度が特に高くないシナリオに非常に適しています。保証されています。

  3. パフォーマンスインスタンスの使用:デフォルトのエラスティックインスタンスに加えて、Function Compute FCはパフォーマンスインスタンスも提供します。パフォーマンスの強さは、より高いリソース制限、より多くの適応シナリオ、および10分の実行時間を超える能力を備えた大規模インスタンスに属します。制限。パフォーマンスインスタンスの拡張速度は遅く、エラスティックスケーラビリティはエラスティックインスタンスほど良くありませんが、単一インスタンスの複数の同時実行(https://help.aliyun.com/document_detail/144586.html)と予約モード(予約モード)を使用できます。 https://help。aliyun.com/document_detail/138103.html)を使用して、パフォーマンスインスタンスの柔軟性を向上させます。具体的な紹介については、シングルインスタンスの複数の同時実行および予約モードを参照してください。

コストの最適化

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

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

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



総括する


ビデオフレームカットシーンでは、サーバーレステクノロジーの価値は非常に明白です。機能コンピューティングの革新的なインスタンススケジューリングエンジンは、効率、パフォーマンス、コスト、およびオープン性の点でクラウドコンピューティングの利点を最大化します。

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

オーディオおよびビデオ処理の分野では、機能コンピューティングFCに基づくサーバーレステクノロジーアーキテクチャには、より豊富なアプリケーションシナリオがあります。DingdingGroup5712134に参加して、サーバーレスの実践的な経験を交換し、クラウドネイティブ時代のサーバーレスアプリケーションの実践をさらに探求できます。

IQiyi Sports:サーバーレスの究極の拡張と縮小を体験し、リソース使用率を40%向上させます

RocketMQに基づく快手のオンラインメッセージングシステム構築の実践

アリババCNCFTOCの新しいメンバーであるZhangLei:「クラウドネイティブ」がクラウドコンピューティングエコシステムにとってなぜそれほど魅力的であるのですか?

いずれかをクリックして表示し、より多くの人に見てもらいましょう

おすすめ

転載: blog.csdn.net/weixin_39860915/article/details/114109263
おすすめ