すべてのプロダクト
Search
ドキュメントセンター

ApsaraVideo Live:機能の使用

最終更新日:Aug 14, 2026

このトピックでは、iOS 向けプッシュ SDK のインターフェイスと基本的なワークフローについて説明し、主要な機能の使用例を紹介します。

機能

  • リアルタイムメッセージングプロトコル (RTMP) によるアップストリーミングをサポートします。

  • Real-Time Communication (RTC) に基づく RTS アップストリーミングとストリームフェッチングをサポートします。

  • 共同ストリーミングとバトルをサポートします。

  • ビデオエンコーディングには H.264 を、音声エンコーディングには AAC を採用しています。

  • ビットレート制御、解像度、表示モードなどの機能のカスタム設定をサポートします。

  • さまざまなカメラ操作をサポートします。

  • リアルタイムのレタッチとカスタムレタッチ効果をサポートします。

  • アニメーションステッカーをウォーターマークとして追加および削除できます。

  • 画面録画のストリーミングが可能です。

  • YUV やパルス符号変調 (PCM) など、さまざまなフォーマットの外部音声およびビデオ入力をサポートします。

  • 複数ストリームのミキシングをサポートします。

  • 音声のみ、ビデオのみのストリームのアップストリーミング、およびバックグラウンドでのアップストリーミングをサポートします。

  • BGM をサポートします。

  • ビデオスナップショットキャプチャをサポートします。

  • 自動再接続とエラーハンドリングをサポートします。

  • 自動ゲイン制御 (AGC)、自動ノイズリダクション (ANR)、アコースティックエコーキャンセレーション (AEC) アルゴリズムをサポートします。

  • ビデオファイルのソフトウェアエンコーディングモードとハードウェアエンコーディングモードを切り替えることができます。これにより、エンコーディングモジュールの安定性が向上します。

制限事項

iOS 向けプッシュ SDK を使用する前に、以下の制限事項にご注意ください。

  • アップストリーミングの前に画面の向きを設定する必要があります。ライブストリーミング中に画面を回転させることはできません。

  • 横向きモードでのアップストリーミングでは、画面の自動回転を無効にする必要があります。

  • ハードウェアエンコーディングモードでは、エンコーダーとの互換性を保つため、出力解像度の値は 16 の倍数である必要があります。たとえば、解像度を 540p に設定した場合、出力解像度は 544 × 960 になります。黒帯を防ぐために、出力解像度に基づいてプレーヤーの画面サイズをスケーリングする必要があります。

API リファレンス

Basic Edition の API リファレンス

ワークフロー

基本的なワークフローは以下の通りです。

  1. SDK の登録

  2. アップストリーミングパラメーターの設定

  3. アップストリーミングの開始

機能の使用

SDK の登録

ライセンスの申請と設定については、「プッシュ SDK ライセンスの統合」をご参照ください。

説明

アップストリーミング機能を使用する前に SDK を登録する必要があります。登録しない場合、プッシュ SDK は使用できません。

ライセンス登録インターフェイスは、プッシュ SDK を使用する前の早い段階で呼び出してください。

[AlivcLiveBase registerSDK];
  • AlivcLiveBase クラスを使用すると、ログレベルの設定、ローカルログパスの指定、SDK バージョンの取得ができます。

  • AlivcLiveBase#setObserver インターフェイスの onLicenceCheck メソッドを使用すると、ライセンスが正常に設定されたかどうかを非同期で確認できます。

ストリームパラメーターの設定

プッシャーを使用する ViewController で、ヘッダーファイルをインポートします: #import <AlivcLivePusher/AlivcLivePusher.h>

基本的なアップストリーミングパラメーターには推奨のデフォルト値があるため、追加の設定なしで簡単に初期化できます。

AlivcLivePushConfig *config = [[AlivcLivePushConfig alloc] init]; // アップストリーミング設定クラスを初期化します。initWithResolution も使用できます。
config.resolution = AlivcLivePushResolution540P; // デフォルトの解像度は 540p です。最大は 720p です。
config.fps = AlivcLivePushFPS20; // フレームレートは 20 fps を推奨します。
config.enableAutoBitrate = true; // ビットレート制御を有効にします。デフォルト値は true です。
config.videoEncodeGop = AlivcLivePushVideoEncodeGOP_2; // デフォルト値は 2 です。キーフレーム間隔が長いほど、遅延が大きくなります。1 または 2 の値を推奨します。
config.connectRetryInterval = 2000; // 再接続間隔 (ミリ秒)。デフォルトは 2000 ms (2s) です。間隔は 1s 以上である必要があります。デフォルト値の使用を推奨します。
config.previewMirror = false; // デフォルト値は false です。通常は false に設定します。
config.orientation = AlivcLivePushOrientationPortrait; // デフォルトの向きは縦向きです。ホームボタンを左または右にして横向きに設定することもできます。
重要
  • モバイルデバイスのパフォーマンスとネットワーク帯域幅を考慮して、解像度を 540p に設定することを推奨します。主流のライブストリーミングアプリの多くは 540p を使用しています。

  • ビットレート制御を無効にすると、ビットレートは初期ビットレートに固定され、設定された目標ビットレートと最小ビットレートの間で適応しなくなります。これにより、ネットワークが不安定な状況で再生がコマ落ちする可能性があります。この設定は慎重に使用してください。

カメラストリームの取り込み

  1. SDK の初期化

    アップストリーミングパラメーターを設定した後、initWithConfig メソッドを呼び出して SDK を初期化します。サンプルコード:

    self.livePusher = [[AlivcLivePusher alloc] initWithConfig:config];
    説明

    AlivcLivePusher は複数のインスタンスをサポートしていません。したがって、各 init 呼び出しは、対応する destroy 呼び出しとペアにする必要があります。

  2. アップストリーミングコールバックの登録

    以下のアップストリーミングコールバックがサポートされています:

    • Info:通知とステータス検出に使用されるコールバック。

    • Error:エラー発生時に返されるコールバック。

    • Network:ネットワーク関連のコールバック。

    対応するコールバックを受け取るためにデリゲートを登録します。サンプルコード:

    [self.livePusher setInfoDelegate:self];
    [self.livePusher setErrorDelegate:self];
    [self.livePusher setNetworkDelegate:self];
  3. プレビューの開始

    livePusher オブジェクトが初期化された後、プレビューを開始できます。カメラプレビュー用に、UIView のサブクラスである表示ビューを渡す必要があります。サンプルコード:

    [self.livePusher startPreview:self.view];
  4. アップストリーミングの開始

    プレビューが成功した後にのみ、アップストリーミングを開始できます。これを行うには、AlivcLivePusherInfoDelegate からの onPreviewStarted コールバックをリッスンし、コールバック内に次のコードを追加します。

    [self.livePusher startPushWithURL:@"テスト用アップストリーミング URL (rtmp://......)"];
    説明
    • アップストリーミング URL は RTMP および RTS (artc://) プロトコルをサポートしています。URL を取得するには、「アップストリーミング URL とストリーミング URL の生成」をご参照ください。

    • ApsaraVideo Live は、同じ URL への複数の同時ストリームのアップストリーミングをサポートしていません。2 番目のアップストリーミングリクエストは拒否されます。

カメラ制御

カメラ関連のメソッドは、アップストリーミング中、一時停止状態、または再接続中など、プレビューが開始された後にのみ呼び出すことができます。これらのメソッドを使用すると、カメラの切り替え、フラッシュの制御、フォーカスの調整、ズーム、ミラーリングの設定ができます。プレビューが開始される前にこれらのメソッドを呼び出しても効果はありません。

/* フロントカメラとリアカメラを切り替えます。*/
[self.livePusher switchCamera];
/* フラッシュをオンまたはオフにします。フロントカメラではフラッシュは使用できません。*/
[self.livePusher setFlash:false]; 
/* 焦点距離を調整してキャプチャした画像をズームします。正の値はズームイン、負の値はズームアウトします。*/
CGFloat max = [_livePusher getMaxZoom];
[self.livePusher setZoom:MIN(1.0, max)]; 
/* 手動でフォーカスを設定します。2 つのパラメーターを渡す必要があります:1. point: フォーカスポイントの座標、2. autoFocus: この特定のアクションでオートフォーカスを有効にするかどうか。その後のオートフォーカス動作は、以前に設定された値に従います。*/
[self.livePusher focusCameraAtAdjustedPoint:CGPointMake(50, 50) autoFocus:true];
/* オートフォーカスを有効または無効にします。*/
[self.livePusher setAutoFocus:false];
/* ミラーリングを設定します。ミラーリングインターフェイスには、アップストリーミングストリーム用の PushMirror とプレビュー用の PreviewMirror の 2 つがあります。PushMirror は再生表示にのみ影響し、PreviewMirror はプレビュー表示にのみ影響します。両者は独立しています。*/
[self.livePusher setPushMirror:false];
[self.livePusher setPreviewMirror:false];

インジェストコントロール

アップストリーミング制御には、開始、停止、一時停止、再開、再起動、破棄が含まれます。アプリケーションのニーズに応じて、UI にボタンを追加してこれらの操作をトリガーできます。サンプルコード:

/* pauseImage を設定してから pause を呼び出して、カメラストリーミングから静止画ストリーミングに切り替えます。音声のアップストリーミングは継続します。*/
[self.livePusher pause];
/* 静止画ストリーミングからカメラストリーミングに戻します。音声のアップストリーミングは継続します。*/
[self.livePusher resume];
/* 現在のアップストリーミングを停止します。これはストリームがアクティブな場合にのみ呼び出すことができます。*/
[self.livePusher stopPush];
/* プレビューを停止します。これはプレビュー状態の場合にのみ呼び出すことができ、アクティブなアップストリーミング中には呼び出せません。停止後、プレビュー表示は最後のフレームでフリーズします。*/
[self.livePusher stopPreview];
/* ストリームを再起動します。これはアクティブなアップストリーミング中またはエラー状態で呼び出すことができます。エラー状態では、このメソッド、reconnectPushAsync、または destroy のみを呼び出すことができます。これにより、プレビューとアップストリーミングを含むすべての内部 AlivcLivePusher リソースが再起動されます。*/
[self.livePusher restartPush];
/* ストリームを非同期で再接続します。これはアクティブなストリーム中または AlivcLivePusherNetworkDelegate からのネットワーク関連のエラー状態で呼び出すことができます。エラー状態では、restartPush または destroy を呼び出すこともできます。このアクションは RTMP 接続の再確立を試みます。*/
[self.livePusher reconnectPushAsync];
/* アップストリーミングインスタンスを破棄します。これにより、アップストリーミングとプレビューが停止し、プレビュー表示が削除されます。AlivcLivePusher に関連するすべてのリソースが解放されます。*/
[self.livePusher destory];
self.livePusher = nil;
/* 現在のアップストリーミングステータスを取得します。*/
AlivcLivePushStatus status = [self.livePusher getLiveStatus];

画面共有インジェスト

iOS 9 で導入された ReplayKit は、画面録画をサポートしています。iOS 10 では、ReplayKit がサードパーティのアプリ拡張機能を通じて画面コンテンツをライブブロードキャストできるようになりました。iOS 10 以降では、プッシュ SDK をアプリ拡張機能と組み合わせて使用して、ライブ画面ブロードキャストを実装できます。

システムのパフォーマンスを確保するため、iOS は画面録画拡張機能に割り当てるリソースを制限しています。拡張機能がメモリを使いすぎると、システムはそれを終了させます。このメモリ制限を回避するため、プッシュ SDK は画面共有プロセスを拡張機能アプリとホストアプリに分割します。拡張機能アプリは画面コンテンツをキャプチャし、プロセス間通信を介してホストアプリに送信します。ホストアプリは AlivcLivePusher エンジンを作成し、画面データをサーバーにアップストリーミングします。アップストリーミングプロセス全体がホストアプリで処理されるため、マイクのキャプチャと送信もホストアプリで管理でき、拡張機能アプリは画面キャプチャのみを担当します。

重要

プッシュ SDK のデモでは、拡張機能アプリとホストアプリ間のプロセス間通信に App Group を使用しています。このロジックは AlivcLibReplayKitExt.framework にカプセル化されています。

iOS で画面共有を実装するには、画面録画拡張機能を作成する必要があります。システムは、キャプチャされた画面イメージを受信するために、必要に応じてこの拡張機能をインスタンス化します。

  1. App Group の作成

    Apple Developer にログインし、次の手順を実行します。

    1. Certificates, IDs & Profiles ページで、App Group を登録します。詳細については、「App Group の登録」をご参照ください。

    2. Identifier ページに戻り、App IDs を選択し、App ID をクリックして App Group 機能を有効にします。ホストアプリと拡張機能アプリの両方の ID で同じ設定を行う必要があります。詳細については、「App Group の有効化」をご参照ください。

    3. 設定が完了したら、更新されたプロビジョニングプロファイルをダウンロードし、Xcode にインストールします。

    これらの手順が正しく完了すると、拡張機能アプリとホストアプリが相互に通信できるようになります。

    説明

    App Group を作成した後、App Group 識別子を保存してください。後のステップで必要になります。

  2. 画面録画拡張機能の作成

    iOS 向けプッシュ SDK のデモには、画面共有用の AlivcLiveBroadcast および AlivcLiveBroadcastSetupUI 拡張機能が含まれています。アプリで画面録画拡張機能を作成するには、次の手順に従います。

    1. 既存のプロジェクトで、New > Target… を選択し、Broadcast Upload Extension を選択します。

    2. Product Name を変更し、Include UI Extension チェックボックスをオンにして、Finish をクリックしてブロードキャストおよび UI 拡張機能を作成します。たとえば、Product NameAlivcLiveBroadcast に設定します。

    3. ブロードキャスト拡張機能の Info.plist ファイルを設定します。新しいターゲットでは、Xcode は SampleHandler という名前のヘッダーファイルとソースファイルを自動的に作成します。このターゲットディレクトリは AlivcLiveBroadcast という名前になります。

      AlivcLibReplayKitExt.framework をプロジェクトにドラッグし、拡張機能ターゲットの依存関係としてリンクします。SampleHandler.m のコードを次のコードに置き換えます。コード内の kAPPGROUP を、ステップ 1 で作成した App Group 識別子に置き換える必要があります。サンプルコード:

      
      #import "SampleHandler.h"
      #import <AlivcLibReplayKitExt/AlivcLibReplayKitExt.h>
      
      @implementation SampleHandler
      
      - (void)broadcastStartedWithSetupInfo:(NSDictionary<NSString *,NSObject *>
      *)setupInfo {
      
       // ユーザーがブロードキャストの開始を要求しました。UI 拡張機能からのセットアップ情報は提供できますが、オプションです。
       [[AlivcReplayKitExt sharedInstance] setAppGroup:kAPPGROUP];
      }
      
      - (void)processSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType {
       if (sampleBufferType != RPSampleBufferTypeAudioMic) {
       // 音声はホストアプリによってキャプチャおよび送信されます。
       [[AlivcReplayKitExt sharedInstance] sendSampleBuffer:sampleBuffer withType:sampleBufferType];
       }
      }
      
      - (void)broadcastFinished {
      
       [[AlivcReplayKitExt sharedInstance] finishBroadcast];
      }
      @end
      
      

    プロジェクトで、Broadcast Upload Extension のターゲットを作成し、画面録画拡張機能モジュール用にカスタマイズされた AlivcLibReplayKitExt.framework をそのターゲットに統合します。

  3. ライブ SDK をホストアプリに統合

    ホストアプリで、AlivcLivePushConfig および AlivcLivePusher オブジェクトを作成します。ExternMainStreamtrue に、AudioFromExternalfalse に設定します。この設定は、音声が引き続き SDK によってキャプチャされることを意味します。startScreenCapture を呼び出して拡張機能アプリから画面データの受信を開始し、その後アップストリーミングを開始および停止します。次の具体的な手順に従います。

    1. ホストアプリプロセスに AlivcLivePusher.framework、AlivcLibRtmp.framework、RtsSDK.framework、および AlivcLibReplayKitExt.framework への依存関係を追加します。

    2. プッシュ SDK を初期化し、外部ビデオソースを使用するように設定します。

      ExternMainStreamtrue に、ExternVideoFormatAlivcLivePushVideoFormatYUV420P に設定します。音声キャプチャに内部 SDK を使用するには、AudioFromExternalfalse に設定します。次のサンプルコードに示すように、他のアップストリーミングパラメーターを設定します。

       self.pushConfig.externMainStream = true;
       self.pushConfig.externVideoFormat = AlivcLivePushVideoFormatYUV420P;
       self.pushConfig.audioSampleRate = 44100;
       self.pushConfig.audioChannel = 2;
       self.pushConfig.audioFromExternal = false;
       self.pushConfig.videoEncoderMode = AlivcLivePushVideoEncoderModeSoft;
       self.pushConfig.qualityMode = AlivcLivePushQualityModeCustom;
       self.pushConfig.targetVideoBitrate = 2500;
       self.pushConfig.minVideoBitrate = 2000;
       self.pushConfig.initialVideoBitrate = 2000;
       self.livePusher = [[AlivcLivePusher alloc] initWithConfig:self.pushConfig];
      
                                      
    3. AlivcLivePusher を使用して、次のメソッドを呼び出すことでライブストリーミング機能を管理します。

      • 画面録画データの受信を開始します。

        コード内の kAPPGroup を、以前に作成した App Group 識別子 に置き換える必要があります。サンプルコード:

        [self.livePusher startScreenCapture:kAPPGROUP];
      • アップストリーミングを開始します。

        サンプルコード:

        [self.livePusher startPushWithURL:self.pushUrl]
      • アップストリーミングを停止します。

        サンプルコード:

        [self.livePusher stopPush];
        [self.livePusher destory];
        self.livePusher = nil;

プレビュー表示モード

プッシュ SDK は 3 つのプレビューモードをサポートしています。プレビュー表示モードは、アップストリーミングされるストリームには影響しません。

  • ALIVC_LIVE_PUSHER_PREVIEW_SCALE_FILL:プレビューはウィンドウを埋めます。ビデオとウィンドウのアスペクト比が異なる場合、プレビューは歪みます。

  • ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FIT:(デフォルト) プレビューはビデオのアスペクト比を維持します。ビデオとウィンドウのアスペクト比が異なる場合、プレビューには黒帯が表示されます。

  • ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FILL:プレビューはビデオをウィンドウのアスペクト比に合わせてトリミングします。ビデオとウィンドウのアスペクト比が異なる場合、ビデオはトリミングされます。

    サンプルコード:

mAlivcLivePushConfig.setPreviewDisplayMode(AlivcPreviewDisplayMode.ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FIT);
説明
  • モードは AlivcLivePushConfig で設定するか、プレビュー中またはアップストリーミング中に setpreviewDisplayMode API を使用して動的に設定できます。

  • この設定はプレビューにのみ影響します。アップストリーミングされるビデオストリームの解像度は AlivcLivePushConfig によって決定され、プレビューモードの影響は受けません。プレビュー表示モードは、さまざまな電話の画面サイズに適応するように設計されており、最適なプレビュー効果を選択できます。

画像の取り込み

SDK は、アプリがバックグラウンドにあるときやビットレートが低すぎるときに静止画像をアップストリーミングできます。アプリがバックグラウンドにある場合、ビデオのアップストリーミングはデフォルトで一時停止され、音声のみがアップストリーミングされます。このとき、ストリーミングする画像を設定できます。たとえば、「キャスターはまもなく戻ります」のようなメッセージを含む画像を表示できます。サンプルコード:

config.pauseImg = [UIImage imageNamed:@"image.png"];// バックグラウンドでのアップストリーミング用の画像を設定します。

さらに、ネットワーク接続が悪い場合にアップストリーミングする静止画像を設定できます。画像が設定されると、SDK は現在のビットレートが低いことを検出し、ビデオのコマ落ちを避けるためにこの画像をアップストリーミングします。サンプルコード:

config.networkPoorImg = [UIImage imageNamed:@"image.png"];// ネットワーク状態が悪いときにアップストリーミングする画像を設定します。

外部オーディオとビデオのインジェスト

プッシュ SDK は、音声ファイルやビデオファイルなど、外部ソースからの音声およびビデオのアップストリーミングをサポートしています。

  1. アップストリーミング設定で外部音声およびビデオ入力を設定します。

  2. サンプルコード:

    config.externMainStream = true; // 外部ストリーム入力を有効にします。
    config.externVideoFormat = AlivcLivePushVideoFormatYUVNV21; // ビデオデータの色フォーマットを設定します。ここでは YUVNV21 に設定されています。必要に応じて他のフォーマットに設定できます。
    config.externAudioFormat = AlivcLivePushAudioFormatS16; // 音声データのビット深度フォーマットを設定します。ここでは S16 に設定されています。必要に応じて他のフォーマットに設定できます。
  3. 外部ビデオデータを挿入します。

  4. サンプルコード:

    /* sendVideoData インターフェイスは、YUV や RGB などの外部ビデオフォーマットの連続バッファデータのみをサポートします。これを使用して、ビデオデータバッファ、長さ、幅、高さ、タイムスタンプ、回転角度を送信できます。*/
    [self.livePusher sendVideoData:yuvData width:720 height:1280 size:dataSize pts:nowTime rotation:0];
    /* 外部ビデオデータが CMSampleBufferRef フォーマットの場合、sendVideoSampleBuffer インターフェイスを使用できます。*/
    [self.livePusher sendVideoSampleBuffer:sampleBuffer]
    /* CMSampleBufferRef フォーマットを連続バッファに変換し、それを sendVideoData インターフェイスに渡すこともできます。以下は変換の参照コードです。*/
    // サンプルバッファサイズを取得します。
    - (int) getVideoSampleBufferSize:(CMSampleBufferRef)sampleBuffer {
    if(!sampleBuffer) {
     return 0;
    }
    int size = 0;
    CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    CVPixelBufferLockBaseAddress(pixelBuffer, 0);
    if(CVPixelBufferIsPlanar(pixelBuffer)) {
     int count = (int)CVPixelBufferGetPlaneCount(pixelBuffer);
     for(int i=0; i<count; i++) {
     int height = (int)CVPixelBufferGetHeightOfPlane(pixelBuffer,i);
     int stride = (int)CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer,i);
     size += stride*height;
     }
    }else {
     int height = (int)CVPixelBufferGetHeight(pixelBuffer);
     int stride = (int)CVPixelBufferGetBytesPerRow(pixelBuffer);
     size += stride*height;
    }
    CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
    return size;
    }
    // サンプルバッファを連続バッファに変換します。
    - (int) convertVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer toNativeBuffer:(void*)nativeBuffer
    {
    if(!sampleBuffer || !nativeBuffer) {
     return -1;
    }
    CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    CVPixelBufferLockBaseAddress(pixelBuffer, 0);
    int size = 0;
    if(CVPixelBufferIsPlanar(pixelBuffer)) {
     int count = (int)CVPixelBufferGetPlaneCount(pixelBuffer);
     for(int i=0; i<count; i++) {
     int height = (int)CVPixelBufferGetHeightOfPlane(pixelBuffer,i);
     int stride = (int)CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer,i);
     void *buffer = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, i);
     int8_t *dstPos = (int8_t*)nativeBuffer + size;
     memcpy(dstPos, buffer, stride*height);
     size += stride*height;
     }
    }else {
     int height = (int)CVPixelBufferGetHeight(pixelBuffer);
     int stride = (int)CVPixelBufferGetBytesPerRow(pixelBuffer);
     void *buffer = CVPixelBufferGetBaseAddress(pixelBuffer);
     size += stride*height;
     memcpy(nativeBuffer, buffer, size);
    }
    CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
    return 0;
    }
  5. 音声データを挿入します。

  6. サンプルコード:

    /* PCM フォーマットの連続バッファデータのみがサポートされています。sendPCMData を使用して、音声データバッファ、サイズ、タイムスタンプを送信します。*/
    [self.livePusher sendPCMData:pcmData size:size pts:nowTime];

ウォーターマークの設定

プッシュ SDK では、複数のウォーターマークを追加できます。ウォーターマーク画像は PNG フォーマットである必要があります。サンプルコード:

NSString *watermarkBundlePath = [[NSBundle mainBundle] pathForResource:
[NSString stringWithFormat:@"watermark"] ofType:@"png"];// ウォーターマーク画像のパスを設定します。
[config addWatermarkWithPath: watermarkBundlePath
 watermarkCoordX:0.1
 watermarkCoordY:0.1
 watermarkWidth:0.3];// ウォーターマークを追加します。
説明
  • coordXcoordYwidth パラメーターは相対値です。たとえば、watermarkCoordX:0.1 は、ウォーターマークの x 位置をストリームの全幅の 10% の位置に配置します。ストリームの解像度が 540×960 の場合、ウォーターマークの x 位置は 54 になります。

  • ウォーターマーク画像の高さは、元の縦横比と指定された width 値に基づいて比例的にスケーリングされます。

  • テキストウォーターマークを実装するには、まずテキストを画像に変換し、次にこのインターフェイスを使用して画像をウォーターマークとして追加します。

  • ウォーターマークの鮮明さと滑らかなエッジを確保するために、ウォーターマークの最終的な出力サイズと同じディメンションのソース画像を使用してください。たとえば、出力ビデオの解像度が 544×940 で、ウォーターマークの相対幅が 0.1f の場合、理想的なソース画像の幅は約 54.4 ピクセル (544 * 0.1) になります。

ビデオ品質の設定

3 つのビデオ品質モードがサポートされています:解像度優先モード、スムーズさ優先モード、カスタムモード。

重要

ビデオ品質を設定するには、ビットレート制御を有効にする必要があります:config.enableAutoBitrate = true;

解像度優先モード (デフォルト)

解像度優先モードでは、SDK は内部でビットレートパラメーターを設定し、アップストリーミングされるビデオストリームの鮮明さを優先します。

config.qualityMode = AlivcLivePushQualityModeResolutionFirst; // 解像度優先モード

スムーズさ優先モード

スムーズさ優先モードでは、SDK は内部でビットレートパラメーターを設定し、アップストリーミングされるビデオストリームのスムーズさを優先します。

config.qualityMode = AlivcLivePushQualityModeFluencyFirst; // スムーズさ優先モード

カスタムモード

カスタムモードでは、SDK は設定したビットレートに基づいてストリームを設定します。カスタムモードを使用する場合、初期ビットレート、最小ビットレート、目標ビットレートを定義する必要があります。

  • 初期ビットレート:ライブストリーム開始時のビットレート。

  • 最小ビットレート:ネットワーク接続が悪い場合、ビットレートは徐々に最小ビットレートまで低下し、ビデオのコマ落ちを減らします。

  • 目標ビットレート:ネットワーク接続が良い場合、ビットレートは徐々に目標ビットレートまで上昇し、ビデオの鮮明さを向上させます。

config.qualityMode = AlivcLivePushQualityModeCustom // カスタムモードに設定します。
config.targetVideoBitrate = 1400; // 目標ビットレート:1400 Kbps
config.minVideoBitrate = 600; // 最小ビットレート:600 Kbps
config.initialVideoBitrate = 1000; // 初期ビットレート:1000 Kbps

カスタムビットレートを設定する際は、Alibaba Cloud の推奨設定をご参照ください。推奨設定は次の表に記載されています。

表 1. 解像度優先モードの推奨設定

解像度

initialVideoBitrate

minVideoBitrate

targetVideoBitrate

360p

600

300

1000

480p

800

300

1200

540p

1000

600

1400

720p

1500

600

2000

1080p

1800

1200

2500

表 1. 解像度優先モードの推奨設定

解像度

initialVideoBitrate

minVideoBitrate

targetVideoBitrate

360p

400

200

600

480p

600

300

800

540p

800

300

1000

720p

1000

300

1200

1080p

1500

1200

2200

解像度適応

解像度適応が有効な場合、SDK はネットワーク状態が悪いときに自動的に解像度を下げ、ビデオのスムーズさを向上させます。

config.enableAutoResolution = YES; // 解像度適応を有効にします。デフォルトでは無効 (NO) です。
重要
  • 解像度適応は、ビデオ品質モードが解像度優先またはスムーズさ優先に設定されている場合にのみ有効で、カスタムモードでは無効です。

  • 一部のプレーヤーは動的な解像度変更をサポートしていない場合があります。解像度適応機能を使用する必要がある場合は、ApsaraVideo Player の使用を推奨します。

BGM

プッシュ SDK は、BGM の再生、オーディオミキシング、ノイズ除去、インイヤーモニタリング、ミュートをサポートしています。BGM 関連のインターフェイスは、プレビューが開始された後にのみ呼び出すことができます。サンプルコード:

/* BGM の再生を開始します。*/
[self.livePusher startBGMWithMusicPathAsync:musicPath];
/* BGM の再生を停止します。BGM がすでに再生中で曲を切り替える必要がある場合は、現在の BGM を停止する必要はなく、再生開始インターフェイスを再度呼び出すだけで済みます。*/
[self.livePusher stopBGMAsync];
/* BGM を一時停止します。これは BGM の再生が開始された後にのみ呼び出すことができます。*/
[self.livePusher pauseBGM];
/* BGM の再生を再開します。これは BGM が一時停止している場合にのみ呼び出すことができます。*/
[self.livePusher resumeBGM];
/* 音楽のループを有効にします。*/
[self.livePusher setBGMLoop:true];
/* ノイズ除去スイッチを設定します。有効にすると、キャプチャされた音声内の人間以外の音がフィルタリングされます。これにより、人間の声がわずかに抑制される場合があります。ユーザーがこの機能を有効にするかどうかを選択できるようにすることを推奨します。デフォルトでは無効です。*/
[self.livePusher setAudioDenoise:true];
/* インイヤーモニタリングスイッチを設定します。この機能は主にカラオケシナリオで使用されます。有効にすると、ホストの声がヘッドフォンで聞こえます。無効にすると、声は聞こえません。ヘッドフォンが接続されていない場合、インイヤーモニタリングは機能しません。*/
[self.livePusher setBGMEarsBack:true];
/* オーディオミキシングを設定して、BGM とキャプチャされた声の音量を調整します。*/
[self.livePusher setBGMVolume:50]; // BGM の音量を設定します。
[self.livePusher setCaptureVolume:50]; // キャプチャされた声の音量を設定します。
/* ミュートを設定します。ミュートすると、音楽と音声入力の両方が無音になります。音楽または音声のみをミュートするには、オーディオミキシングの音量設定を使用します。*/
[self.livePusher setMute:isMute?true:false];

ストリームスナップショット

プッシュ SDK は、ローカルビデオストリームからスナップショットをキャプチャする機能を提供します。サンプルコード:

/* スナップショットコールバックを設定します。*/
[self.livePushersetSnapshotDelegate:self];
/* スナップショット API を呼び出します。*/
[self.livePushersnapshot:1interval:1];

レタッチの設定

ApsaraVideo Live プッシュ SDK は、基本と高度の 2 つのレタッチモードを提供します。基本レタッチには、美白、スムージング、血色追加が含まれます。高度なレタッチは、顔認識ベースの美白、スムージング、血色、デカ目、顔痩せをサポートします。この機能は Queen SDK によって提供されます。サンプルコード:

#pragma mark - "レタッチタイプとパラメーターの API"/**
* @brief 特定のレタッチタイプを有効または無効にします。
* @param type QueenBeautyType からの値。
* @param isOpen YES: 有効、NO: 無効。
*
*/
- (void)setQueenBeautyType:(kQueenBeautyType)type enable:(BOOL)isOpen;
/**
* @brief レタッチパラメーターを設定します。
* @param param レタッチパラメータータイプ、QueenBeautyParams のいずれか。
* @param value 設定する値、範囲は [0,1]。0 未満の値は 0 に、1 より大きい値は 1 に設定されます。
*/
- (void)setQueenBeautyParams:(kQueenBeautyParams)param
value:(float)value;
#pragma mark - "フィルターの API"
/**
* @brief フィルター画像を設定します。フィルター画像を設定する前に kQueenBeautyTypeLUT を有効にする必要があります。
* @param imagePath 設定するフィルター画像のパス。
*/
- (void)setLutImagePath:(NSString *)imagePath;
#pragma mark - "顔シェイピングの API"
/**
*@brief 顔シェイピングタイプを設定します。設定する前に kQueenBeautyTypeFaceShape を有効にする必要があります。
*@param faceShapeType 設定する顔シェイピングのタイプ、QueenBeautyFaceShapeType を参照。
*@param value 設定する値。
*/
- (void)setFaceShape:(kQueenBeautyFaceShapeType)faceShapeType
value:(float)value;
#pragma mark - "メイクアップの API"
/**
* @brief メイクアップタイプとマテリアルアセットのパスを設定します。メイクアップを設定する前に kQueenBeautyTypeMakeup を有効にする必要があります。
* @param makeupType メイクアップタイプ。
* @param imagePaths メイクアップマテリアルアセットへのパスのコレクション。
* @param blend ブレンドタイプ。
*/
- (void)setMakeupWithType:(kQueenBeautyMakeupType)makeupType
paths:(NSArray<NSString *> *)imagePaths
blendType:(kQueenBeautyBlend)blend;
/**
* @brief メイクアップタイプとマテリアルアセットのパスを設定します。
* @param makeupType メイクアップタイプ。
* @param imagePaths メイクアップマテリアルアセットへのパスのコレクション。
* @param blend ブレンドタイプ。
* @param fps 対応するフレームレート。
*/
- (void)setMakeupWithType:(kQueenBeautyMakeupType)makeupType
paths:(NSArray<NSString *> *)imagePaths
blendType:(kQueenBeautyBlend)blend fps:(int)fps;
/**
* @brief メイクアップの透明度を設定し、性別を指定するオプションがあります。
* @param makeupType メイクアップタイプ。
* @param isFeMale ユーザーが女性かどうか。YES は女性、NO は男性。
* @param alpha メイクアップの透明度。
*/
- (void)setMakeupAlphaWithType:(kQueenBeautyMakeupType)makeupType
female:(BOOL)isFeMale alpha:(float)alpha;
/**
* @brief メイクアップタイプのブレンドタイプを設定します。
* @param makeupType メイクアップタイプ。
* @param blend ブレンドタイプ。
*/
- (void)setMakeupBlendWithType:(kQueenBeautyMakeupType)makeupType
blendType:(kQueenBeautyBlend)blend;
/**
* @brief すべてのメイクアップ効果をクリアします。
*/
- (void)resetAllMakeupType;

リアルタイムのパラメーター調整

プッシュ SDK は、アップストリーミング中のレタッチパラメーターのリアルタイム調整をサポートしています。レタッチスイッチを有効にし、対応するパラメーター値を調整します。サンプルコード:

[_queenEngine setQueenBeautyType:kQueenBeautyTypeSkinBuffing enable:YES];
[_queenEngine setQueenBeautyType:kQueenBeautyTypeSkinWhiting enable:YES];
[_queenEngine setQueenBeautyParams:kQueenBeautyParamsWhitening value:0.8f];
[_queenEngine setQueenBeautyParams:kQueenBeautyParamsSharpen value:0.6f];
[_queenEngine setQueenBeautyParams:kQueenBeautyParamsSkinBuffing value:0.6];

ライブクイズの設定

ライブクイズ機能は、SEI メッセージをライブストリームに挿入し、プレーヤーがそれを解析することで機能します。プッシュ SDK は SEI を挿入するインターフェイスを提供します。このインターフェイスは、アップストリーミングがアクティブな場合にのみ呼び出すことができます。サンプルコード:

/*
msg: ストリームに挿入する SEI メッセージの本文。JSON 形式の使用を推奨します。ApsaraVideo Player SDK はこの SEI メッセージを受信し、解析してコンテンツを表示できます。
repeatCount: 送信するフレーム数。SEI メッセージがドロップされないようにするには、繰り返し回数を設定する必要があります。たとえば、値 100 は、この SEI メッセージを次の 100 フレームに挿入します。プレーヤーは同一の SEI メッセージを重複排除します。
delayTime: 送信前の遅延時間 (ミリ秒)。
KeyFrameOnly: キーフレームでのみ送信するかどうか。
*/
[self.livePusher sendMessage:@"質問情報" repeatCount:100 delayTime:0 KeyFrameOnly:false];

iPhone X 対応

ほとんどのシナリオでは、プレビュービューのフレームを全画面に設定すると正しく機能します。ただし、iPhone X では、デバイス固有のアスペクト比のため、全画面プレビューが引き伸ばされて表示されることがあります。iPhone X でのプレビューには全画面表示を避けることを推奨します。

取り込み中のビューのサイズ変更

startPreview または startPreviewAsync インターフェイスを呼び出すときに割り当てた UIView を反復処理します。プレビュービューのすべてのサブビューのフレームを変更します。例:

[self.livePusher startPreviewAsync:self.previewView];
for (UIView *subView in [self.previewView subviews]) {
 // ...
}

外部効果音

アップストリーミングページで効果音や音楽を再生する必要がある場合、SDK は現在 AudioServicesPlaySystemSound と競合するため、AVAudioPlayer の使用を推奨します。再生後、AVAudioSession の設定を更新する必要があります。以下は AVAudioPlayer で効果音を再生するサンプルコードです。

- (void)setupAudioPlayer {
 NSString *filePath = [[NSBundle
mainBundle] pathForResource:@"sound" ofType:@"wav"];
 NSURL *fileUrl = [NSURL URLWithString:filePath];
 self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileUrl error:nil];
 self.player.volume = 1.0;
 [self.player prepareToPlay];
}
 - (void)playAudio {
 self.player.volume = 1.0;
 [self.player play];
 // AVAudioSession を設定
 AVAudioSession *session = [AVAudioSession sharedInstance];
 [session setMode:AVAudioSessionModeVideoChat error:nil];
 [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
 [session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker|AVAudioSessionCategoryOptionAllowBluetooth
| AVAudioSessionCategoryOptionMixWithOthers error:nil];
 [session setActive:YES error:nil];
}

バックグラウンドモードと電話通話

SDK はバックグラウンドモードを内部で処理するため、ユーザー側での操作は不要です。デフォルトでは、アプリがバックグラウンドに入ると、SDK は音声のアップストリーミングを継続し、ビデオストリームは最後のフレームで一時停止します。アプリでバックグラウンドモード機能を有効にし、Audio, AirPlay and Picture in Picture を選択する必要があります。これにより、アプリがバックグラウンドで音声をキャプチャできるようになります。

アプリがバックグラウンドにある間に音声のアップストリーミングを停止したい場合は、アプリがバックグラウンドに入るときにアップストリーミングエンジンを破棄し、アプリが再度アクティブになるときに再作成する必要があります。

説明

この方法を使用する場合、UIApplicationWillResignActiveNotification と UIApplicationDidBecomeActiveNotification をリッスンする必要があります。他の方法を使用するとリスクが生じる可能性があります。

コールバック

プッシュ SDK には、以下の主要なコールバックが含まれています。

コールバックタイプ

クラス名

ストリーム取り込みコールバック

AlivcLivePusherInfoDelegate

ネットワーク関連コールバック

AlivcLivePusherNetworkDelegate

エラーコールバック

AlivcLivePusherErrorDelegate

BGM コールバック

AlivcLivePusherBGMDelegate

外部レタッチおよびフィルター処理のコールバック

AlivcLivePusherCustomFilterDelegate

取り込みコールバック

アップストリーミングコールバックは、プレビューの開始、最初のビデオフレームのレンダリング、最初の音声またはビデオフレームの送信、アップストリーミングの開始と停止など、SDK のステータスを報告します。

  • onPushStarted:サーバーへの接続が成功したことを示します。

  • onFirstFramePushed:最初の音声またはビデオフレームが正常に送信されたことを示します。

  • onPushStartedonFirstFramePushed:SDK がアップストリーミングを正常に開始したことを示します。

ネットワークコールバック

ネットワーク関連のコールバックは、アプリにネットワークと接続のステータスを通知します。AlivcLivePushConfig で設定された再接続タイムアウトとリトライ回数の範囲内である短時間のネットワーク変動や切り替えについては、SDK が自動的に再接続を試みます。再接続が成功すると、アップストリーミングは継続されます。

  • onConnectFail:アップストリーミングが失敗したことを示します。アップストリーミング URL が無効、不正な文字が含まれている、認証に問題がある、最大同時ストリーム制限を超えている、または拒否リストに含まれているかを確認してください。再試行する前に、アップストリーミング URL が有効で利用可能であることを確認してください。特定のエラーコードは 0x30020901 から 0x30020905 および 0x30010900 から 0x30010901 の範囲です。

  • onConnectionLost:接続が失われたときにトリガーされます。SDK は自動的に再接続を試み、onReconnectStart をトリガーします。最大リトライ回数 (config.connectRetryCount) 後に接続が復元できない場合、onReconnectError がトリガーされます。

  • onNetworkPoor:ネットワークが遅いときにトリガーされます。これは、ネットワークが安定したストリーミングには不十分であるが、アップストリーミングはまだアクティブであることを示します。ここで、ユーザーに UI 通知を表示するなど、ビジネスロジックを処理できます。

  • onNetworkRecovery:ネットワーク接続が回復したときにトリガーされます。

  • onReconnectError:再接続失敗のコールバック。再接続の試みが失敗したことを示します。現在のネットワークを確認し、ネットワークが回復したときにストリームを再起動することを推奨します。

  • onSendDataTimeout:データ送信タイムアウトのコールバック。現在のネットワークを確認し、ストリームを停止してから、ネットワークが回復したときに再起動することを推奨します。

  • onPushURLAuthenticationOverdue:現在のアップストリーミング URL の認証が期限切れになったことを示すコールバック。SDK に新しい URL を提供する必要があります。

エラーコールバック

  • onSystemError:システムデバイスの例外に関するコールバック。エンジンを破棄して再試行する必要があります。

  • onSDKError:SDK エラーのコールバック。コードに基づいてさまざまなエラーを処理する必要があります。

    • エラーコードが 805438211 の場合、デバイスのパフォーマンスが低く、エンコーディングとレンダリングのフレームレートが低いことを示します。ホストに通知し、高度なレタッチやアニメーションなど、アプリレイヤーでリソースを大量に消費するビジネスロジックを停止する必要があります。

    • マイクとカメラの権限がない場合のコールバックを処理する必要があります。マイクの権限がない場合のエラーコードは 268455940、カメラの権限がない場合のエラーコードは 268455939 です。

    • 現時点では、他のすべてのエラーはログに記録するだけで、追加のアクションは不要です。

BGM コールバック

  • onOpenFailed:BGM の開始に失敗しました。startBGMWithMusicPathAsync インターフェイスに渡された音楽ファイルとそのパスが正しいか確認してください。startBGMWithMusicPathAsync を呼び出して再試行できます。

  • onDownloadTimeout:BGM の再生がタイムアウトしました。これは、ネットワーク URL から音楽を再生するときによく発生します。ホストに現在のネットワーク状態を確認するように促してください。startBGMWithMusicPathAsync を呼び出して再試行できます。

カスタムフィルターコールバック

AlivcLivePusherCustomFilterDelegate コールバックを使用して、サードパーティのレタッチ SDK と統合し、基本および高度なレタッチ機能を実装します。AlivcLivePusherCustomFilterDelegate の主な目的は、SDK の内部テクスチャまたは CVPixelBuffer をレタッチ SDK に提供して処理させ、処理されたテクスチャまたは CVPixelBuffer を SDK に返してレタッチ効果を適用することです。

AlivcLivePushConfiglivePushMode スイッチが AlivcLivePushBasicMode に設定されている場合、SDK は CVPixelBuffer ではなく、AlivcLivePusherCustomFilterDelegate コールバックを介してテクスチャ ID を提供します。コアとなるコールバックは次のとおりです。

  • onCreate:OpenGL コンテキストが作成されたときのコールバック。これは通常、レタッチエンジンの初期化に使用されます。

  • onProcess:OpenGL テクスチャが更新されたときのコールバック。このメソッドは、SDK の元の内部テクスチャ ID を提供します。このコールバック内で、レタッチ処理メソッドを呼び出し、処理されたテクスチャ ID を返します。

  • onDestory:OpenGL コンテキストが破棄されたときのコールバック。これは通常、レタッチエンジンの破棄に使用されます。

一般的な API

/* カスタムモードでは、最小ビットレートと目標ビットレートをリアルタイムで調整できます。*/
[self.livePusher setTargetVideoBitrate:800];
[self.livePusher setMinVideoBitrate:200]
/* 現在のアップストリーミングステータスを取得します。*/
BOOL isPushing = [self.livePusher isPushing]; 
/* アップストリーミング URL を取得します。*/
NSString *pushURLString = [self.livePusher getPushURL];
/* アップストリーミングのパフォーマンスデバッグ情報を取得します。特定のパラメーターと説明については、API ドキュメントまたはインターフェイスのコメントをご参照ください。*/
AlivcLivePushStatsInfo *info = [self.livePusher getLivePushStatusInfo];
/* SDK のバージョン番号を取得します。*/
NSString *sdkVersion = [self.livePusher getSDKVersion];
/* 必要に応じてデバッグ情報をフィルタリングするためにログレベルを設定します。*/
[self.livePusher setLogLevel:(AlivcLivePushLogLevelDebug)];

デバッグツール

SDK は、DebugView という UI デバッグツールを提供します。DebugView は、移動可能なグローバルなフローティングウィンドウで、常にビュー階層の最上部に表示されます。アップストリーミングログの表示、パフォーマンスパラメーターのリアルタイムモニタリング、主要なパフォーマンスメトリクスの折れ線グラフなどのデバッグ機能が含まれています。

説明

リリースビルドで DebugView を追加するインターフェイスを呼び出さないでください。

サンプルコード:

[AlivcLivePusher showDebugView]; // デバッグツールを開きます。

API リファレンス

Basic Edition の API リファレンス

よくある質問

ストリームのインジェストが失敗する

トラブルシューティングツールを使用して、アップストリーミング URL が有効かどうかを確認できます。

取り込まれたオーディオおよびビデオストリームに関する情報を取得するにはどうすればよいですか?

ストリーム管理ページに移動します。アクティブなストリームセクションで、アップストリーミングされた音声およびビデオストリームを表示および管理できます。

ストリームを再生する方法

アップストリーミングを開始した後、ApsaraVideo Player、FFplay、VLC などのプレーヤーを使用してストリームフェッチングをテストできます。再生 URL を取得するには、「アップストリーミング URL とストリーミング URL の生成」をご参照ください。

App Store への提出が拒否される

RtsSDK は、物理デバイスとシミュレータの両方のアーキテクチャを含むファットバイナリです。アプリを App Store に提出するには、シミュレータアーキテクチャを削除する必要があります。lipo -remove を使用して、バイナリから x86_64 スライスを削除できます。