ライブ動画をストリーミングする方法

Video Intelligence Streaming API は、RTSP、RTMP、HLS など標準のライブ ストリーミング プロトコルをサポートしています。AIStreamer の取り込みパイプラインは、ストリーミング プロキシとして動作して、ライブ ストリーミング プロトコルを gRPC 接続の双方向ストリーミングに変換します。

Video Intelligence では、ライブ ストリーミング プロトコルをサポートするために、GStreamer オープン メディア フレームワークを使用します。

ステップ 1: 名前付きパイプを作成する

GStreamer と AIStreamer 取り込みプロキシの間の通信用に、名前付きパイプを作成します。2 つのプロセスは同じ Docker コンテナ内で実行されます。

  • path_to_pipe: ローカル環境におけるファイルパス。例: /user/local/Desktop/
  • name_of_pipe: 指定するパイプの名前。例: my-football-game
$ export PIPE_NAME=/path_to_pipe/name_of_pipe
$ mkfifo $PIPE_NAME

例: /user/local/Desktop/my-football-game

ステップ 2: AIStreamer 取り込みプロキシを実行する

これらの使用可能な C++ の例には、すべての機能をサポートする単一のバイナリが含まれます。この例をビルドするには、ビルド手順に沿って行ってください。

次の例は、コマンドラインから上記のバイナリを使用する方法を示しています。

$ export GOOGLE_APPLICATION_CREDENTIALS=/path_to_credential/credential_json
$ export CONFIG=/path_to_config/config_json
$ export PIPE_NAME=/path_to_pipe/name_of_pipe
$ export TIMEOUT=3600
$ ./streaming_client_main --alsologtostderr --endpoint "dns:///alpha-videointelligence.googleapis.com" \
      --video_path=$PIPE_NAME --use_pipe=true --config=$CONFIG --timeout=$TIMEOUT

$GOOGLE_APPLICATION_CREDENTIALS は、サービス アカウント キーを含む JSON ファイルのファイルパスを指定します。

github$CONFIG ファイルに 構成の例があります。

コマンドラインで正しいタイムアウト フラグを確実に設定してください。1 時間の動画をストリーミングする必要がある場合は、タイムアウト値を 3600 秒以上にする必要があります。

ステップ 3: GStreamer パイプラインを実行する

GStreamer は複数のライブ ストリーミング プロトコルをサポートしています(ただし、これらに限定されません)。

  • HTTP Live Streaming(HLS)

  • リアルタイム ストリーミング プロトコル(RTSP)

  • リアルタイム プロトコル(RTP)

  • リアルタイム メッセージング プロトコル(RTMP)

  • WebRTC

  • ウェブカメラからのストリーミング

Video Intelligence API は、GStreamer パイプラインを使用してこれらのライブ ストリーミング プロトコルから復号可能な動画ストリームに変換し、そのストリームをステップ 1 で作成した名前付きパイプに書き込みます。

次の例は、HLS、RTSP、RTMP の各プロトコルを使用するライブ ストリーミング ライブラリの使用方法を示しています。

HTTP Live Streaming(HLS)

$ export PIPE_NAME=/path_to_pipe/name_of_pipe
$ export HLS_SOURCE=http://abc.def/playlist.m3u8
$ gst-launch-1.0 -v souphttpsrc location=$HLS_SOURCE ! hlsdemux ! filesink location=$PIPE_NAME

リアルタイム ストリーミング プロトコル(RTSP)

$ export PIPE_NAME=/path_to_pipe/name_of_pipe
$ export RTSP_SOURCE=rtsp://ip_addr:port/stream
$ gst-launch-1.0 -v rtspsrc location=$RTSP_SOURCE ! rtpjitterbuffer ! rtph264depay \
      ! h264parse ! flvmux ! filesink location=$PIPE_NAME

リアルタイム メッセージング プロトコル(RTMP)

$ export PIPE_NAME=/path_to_pipe/name_of_pipe
$ export RTMP_SOURCE=rtmp://host/app/stream
$ gst-launch-1.0 -v rtmpsrc location=$RTMP_SOURCE ! flvdemux ! flvmux ! filesink location=$PIPE_NAME

ビルド手順

バイナリの例Bazel を使ってビルドします。すべてのビルド依存関係が構成されている Docker の例も用意されています。コンパイル済みの streaming_client_main バイナリは、Docker イメージの $BIN_DIR ディレクトリにあります。

Docker の使用に関する詳細については、Docker と Kubernetes の使用をご覧ください。

フロー制御

Video Intelligence Streaming API サーバーには固有のフロー制御が備わっています。次の 2 つの場合、StreamingAnnotateVideoRequest リクエストは拒否され、gRPC ストリーミング接続は直ちに停止されます。

  • AIStreamer インジェスト クライアントから Google サーバーにリクエストが送信される頻度が多すぎる。

  • AIStreamer インジェスト クライアントから Google サーバーに送信されるデータが大きすぎる(毎秒 20 メガバイトを超える)

ビジュアライザ

AIStreamer で提供されるビジュアライザ コードは、コード例としてのみ使用してください。ビジュアライザは、ユーザーのローカル環境と互換性がない場合があります。AIStreamer ユーザーは、クライアント コードを使用してアノテーション結果を可視化しないでください。