https://d226lax1qjow5r.cloudfront.net/blog/blogposts/opentok-linux/FB_OpenTokLinux.png

OpenTok Linux SDKを使ってLinuxにストリーミングビデオを追加する方法

最終更新日 May 7, 2021

所要時間:1 分

OpenTok Linux SDKを使ってLinuxにストリーミングビデオを追加する方法

OpenTok Labsイニシアチブの一環として、Linux SDKの新しいサンプルを公開いたします。Linux SDKを使用することで、組み込みLinuxシステム上のビデオ監視ソリューションや、オーディオおよびビデオ・ストリーミングが必要なその他のアプリケーションをサポートするデスクトップ・アプリケーションを作成することができます。OpenTok Labsのラベルは、このSDKが公式サポートSDKではなく、現在ベスト・エフォート・ベースであることを示しています。OpenTok Linux SDKは、システム・リソースの消費を抑え、少ないメモリ・フットプリントで動作するように設計されています。LinuxのSDKはCのAPIを介して使用することができ、開発者はほとんどどこにでも統合することができます。Linuxが様々なユースケースで広く採用されていることを考えると、OpenTokプラットフォームを使って、Linuxベースのデバイスにリアルタイム通信を追加することができます。

仕組み

すでにOpenTok SDKのAPIやコンセプトに慣れているのであれば、Linux SDKを使い始めるのは簡単です。セッション、パブリッシャー、サブスクライバーなど、同じOpenTokのコンセプトが使われているからです。OpenTok Linux SDKでは、セッションへの接続、パブリッシングの開始、ストリームの購読など、アプリケーションがアクションを開始するプログラミング・モデルも採用しています。アクションが開始され、特定のイベントが発生すると、コールバックを介してアプリケーションに通知されます。これらのイベントには、例えば以下のようなものがある:

  • セッションが正常に接続されたとき、またはエラーが発生したとき、

  • 出版社が出版を始めるとき、

  • セッションに新しい参加者がいるとき、新しい参加者がパブリッシュを開始し、それが新しい購読者の作成などをトリガーするとき。

それでは、OpenTokクライアントSDKを使って、アプリケーションにライブビデオを追加する一般的な手順を実装する方法を始めましょう。

セッションに接続する

セッションに接続するとき、開発者は、アプリケーションが関心を持つイベントに対する 応答を実装するコールバック関数を提供しなければなりません。これらの関数へのポインタは、構造体を介して提供され、セッションを作成する関数の引数として機能します。この新しいセッションへのポインタは、後でセッションに接続するときに使用されます。他のサンプルアプリケーションと同様に、開発者はOpenTokの認証情報(API KEY、セッションID、トークン)を提供する必要があります。

// ...

void onOpenTokSessionConnectedCallback(otc_session *session, void *user_data) {
}

void onOpenTokSessionStreamReceivedCallback(otc_session *session, 
                                            void *user_data,
                                            const otc_stream *stream) {
}

void onOpenTokSessionStreamDroppedCallback(otc_session *session,
                                           void *user_data,
                                           const otc_stream *stream) {
}

void onOpenTokSessionErrorCallback(otc_session *session,
                                   void *user_data,
                                   const char* error_string,
                                   enum otc_session_error error) {
}

// ...

struct otc_session_cb session_callbacks = {0};
session_callbacks.user_data = this;
session_callbacks.on_connected = onOpenTokSessionConnectedCallback;
session_callbacks.on_stream_received = onOpenTokSessionStreamReceivedCallback;
session_callbacks.on_stream_dropped = onOpenTokSessionStreamDroppedCallback;
session_callbacks.on_error = onOpenTokSessionErrorCallback;
session_ = otc_session_new(apiKey.c_str(), sessionId.c_str(), &session_callbacks);

if (session_ == nullptr) {
  return;
}

otc_session_connect(session_, token.c_str());

オーディオとビデオをセッションに公開する

パブリッシャーに対しては、同じアプローチに従い、アプリケーションが関心を持つイベントに対するレスポンスを実装するコールバック関数を提供します。パブリッシャーについては、開発者がコールバック関数を作成する責任を負います。例えば、パブリッシャーがパブリッシングを開始した時 (ストリームが作成され、イベントが発生した時)、パブリッシャーのビデオストリームから新しいフレームがレンダリングされた時、エラーが発生した時などです。これらのコールバック関数へのポインタは、新しいパブリッシャーを作成する関数の引数として渡される別の構造体を通して提供されます。

void onOpenTokPublisherStreamCreatedCallback(otc_publisher *publisher, 
                                             void *user_data, 
                                             const otc_stream *stream) {
}

void onOpenTokPublisherRenderFrameCallback(otc_publisher *publisher,
                                           void *user_data,
                                           const otc_video_frame *frame) {
}

void onOpenTokPublisherErrorCallback(otc_publisher *publisher,
                                     void *user_data,
                                     const char* error_string,
                                     enum otc_publisher_error error_code) {
}

struct otc_publisher_cb publisher_cb = {0};
publisher_cb.user_data = this;
publisher_cb.on_stream_created = onOpenTokPublisherStreamCreatedCallback;
publisher_cb.on_render_frame = onOpenTokPublisherRenderFrameCallback;
publisher_cb.on_error = onOpenTokPublisherErrorCallback;
publisher_ = otc_publisher_new(name_.c_str(), nullptr, &publisher_cb);

if (publisher_ == nullptr) {
  return;
}

セッションに接続されたコールバック関数が呼び出されると、アプリケーションはパブリッシングを開始できる。コールバック関数の中で実装することができます。注:これはセッションのコールバック関数です。この関数へのポインタは、上記のセッションを作成するときに提供されます。

void onOpenTokSessionConnectedCallback(otc_session *session, void *user_data) {
  // ...
  if ((session_ != nullptr) && (publisher_ != nullptr)) {
    otc_session_publish(session_, publisher_);
  }
  // ...
}

セッションが接続されるまで、アプリケーションはパブリッシャーにパブリッシュ を許可すべきではありません。

オーディオ・ビデオストリームを購読する

セッションに新しい参加者が接続され、参加者が公開されるたびに、セッションはセッションストリームreceivedコールバックを介して通知されます。サブスクライバーがどのように作成されるかは、セッションコールバック関数の中で実装できます。このコールバック関数は上記で作成されたセッションに属しており、セッションの作成時にそのポインタが提供されていることに注意してください。セッションとパブリッシャーオブジェクトと同様に、開発者はコールバック関数を実装しなければなりません。エラー通知のトリガーとなるエラー関数を常に提供する必要があります。これはエラーコールバックを指します。エラーが発生すると、コールバック関数が呼び出されます。サブスクライバーが作成されると、セッションは新しいサブスクライバーに接続し、新しい参加者からオーディオとビデオのストリームを受信し始めることができる。

// ...

void onOpenTokSubscriberRenderFrameCallback(otc_subscriber *subscriber,
					    void *user_data,
					    const otc_video_frame *frame) {
}

void onOpenTokSubscriberErrorCallback(otc_subscriber *subscriber,
                                      void *user_data,
                                      const char* error_string,
                                      enum otc_subscriber_error error_code) {
}

// ...

void onOpenTokSessionStreamReceivedCallback(otc_session *session,
					    void *user_data,
					    const otc_stream *stream) {
  // ...
  struct otc_subscriber_cb subscriber_cb = {0};
  subscriber_cb.user_data = conference;
  subscriber_cb.on_render_frame = onOpenTokSubscriberRenderFrameCallback;
  subscriber_cb.on_error = onOpenTokSubscriberErrorCallback;
  otc_subscriber* subscriber = otc_subscriber_new((otc_stream*)stream, &subscriber_cb);
  if (subscriber == nullptr) {
    return;
  }
  otc_session_subscribe(session, subscriber);
  // ...
}

// ...

ビデオストリームのレンダリング

OpenTok Linux SDKを使用して、パブリッシャーや購読者向けにビデオストリームをレンダリングしたい場合、以下のような良いリソースがあります。 シンプル・ダイレクトメディア・レイヤー・ライブラリ(Simple DirectMedia Layer Library)のような、よく知られたサードパーティのライブラリがあります。などがあります。以下の2つのコールバック関数は、パブリッシャーと購読者向けにレンダリングされる新しいフレームがあるときに呼び出されます。

void onOpenTokSubscriberRenderFrameCallback(otc_subscriber *subscriber,
					    void *user_data,
					    const otc_video_frame *frame) {
}

void onOpenTokPublisherRenderFrameCallback(otc_publisher *publisher,
                                           void *user_data,
                                           const otc_video_frame *frame) {
}

フレームをレンダリングしてくれるレンダリングマネージャーなどを用意すればいい。下の例では、Simple DirectMedia Layerライブラリを使用している。

void Renderer::onFrame(otc_video_frame* frame) {
  if (!window_) {
    return;
  }
  SDL_Surface* surface_ =  SDL_GetWindowSurface(window_);

  auto pixels = otc_video_frame_get_plane(frame, 0);
  SDL_Surface* sdl_frame = SDL_CreateRGBSurfaceFrom(
      const_cast<unsigned char*>(pixels),
      otc_video_frame_get_width(frame),
      otc_video_frame_get_height(frame),
      32,
      otc_video_frame_get_width(frame) * 4,
      0,0,0,0);

  SDL_BlitScaled(sdl_frame, NULL, surface_, nullptr);
  SDL_FreeSurface(sdl_frame);

  SDL_UpdateWindowSurface(window_);
}

OpenTok Linux SDK サンプル

数週間前に のGithubリポジトリを公開しました。のGithubリポジトリを公開しました。現時点では、3種類のサンプルを用意していますが、さらに多くのサンプルを追加する予定です。サンプルの1つでは、通常のLinuxデスクトップ環境(例:Ubuntu 18.04.2 LTS, Bionic Beaver)で実行可能な基本的なビデオチャットアプリケーションを実装することができます。冒頭で述べたように、OpenTok Linux SDKは、Raspberry Piのような小さなシングルボードコンピュータを使用して、パブリッシャのみのエンドポイントとしてビデオをストリーミングする、ビデオ監視ソリューションの実装に使用できます。この公開専用エンドポイント機能は、私たちが提供するサンプルの一部です。

OpenTok Linux SDK リリースライフサイクル

本日より、OpenTok Linux SDKはクローズド・ベータ(プライベート・ベータ)となりました。私たちの新しいSDKは価値を提供できるものです。しかし、まだゴールデンタイムには間に合いません。開発者向けのドキュメントや開発者センターのリソースなど、必要なものをすべて作成している段階です。その間に、ぜひフィードバックをお寄せください!ぜひ新しいSDKをお試しいただき、ご意見をお聞かせください。 OpenTok Linux SDKビルドは GitHubのリポジトリ.GitHubに含まれるx86_64、armv7、arm64を含む3つのビルドのいずれかを使用して開始してください。OpenTok Linux SDKに関する続報にご期待ください。

シェア:

https://a.storyblok.com/f/270183/400x400/5163f63112/jose-antonio.png
Jose Antonio Olivera Ortega

Based in Madrid, Spain, Jose Antonio is a Sr. Software Engineer at Vonage, contributing to the OpenTok Client SDKs and native codebase. He loves cross-platform and test-driven development, but hates pair programming. As an avid learner and programmer, Jose Antonio enjoys discovering more ways to create and innovate with technology, including mobile operating systems, WebRTC apps, Web APIs, IoT, and more.