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

ApsaraVideo Live:機能の使用

最終更新日:Jan 25, 2026

このトピックでは、Push SDK for iOS の API、SDK の基本的なワークフローについて説明し、その機能の使用例を示します。

機能

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

  • リアルタイムコミュニケーション (RTC) に基づく RTS アップストリーミングとプルをサポートします。

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

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

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

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

  • リアルタイムの美顔効果とカスタムの美顔効果エフェクトをサポートします。

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

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

  • YUV やパルス符号変調 (PCM) などのさまざまな形式の外部音声および動画入力をサポートします。

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

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

  • バックグラウンドミュージックをサポートします。

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

  • 自動再接続とエラー処理をサポートします。

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

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

制限事項

Push SDK for iOS を使用する前に、次の制限事項にご注意ください。

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

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

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

API リファレンス

Basic Edition の API リファレンス

操作手順

基本的な手順は次のとおりです。

  1. SDK の登録

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

  3. ストリームの取り込み

機能の使用

SDK の登録

ライセンスをリクエストして設定する方法については、「ライセンス統合ガイド」をご参照ください。

説明

アップストリーミング機能を使用する前に SDK を登録してください。そうしないと、Push SDK を使用できません。

Push 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 です。GOP サイズが大きいほど、レイテンシが高くなります。このパラメーターを 1 または 2 に設定することを推奨します。
config.connectRetryInterval = 2000; // 単位:ミリ秒。再接続時間は 2 秒です。再接続間隔は少なくとも 1 秒以上である必要があります。デフォルト値を使用することを推奨します。
config.previewMirror = false; // デフォルト値は false です。通常は false を選択します。
config.orientation = AlivcLivePushOrientationPortrait; // デフォルトの向きは縦向きです。デバイスをホームボタンが左または右にある横向きに設定できます。
重要
  • モバイルデバイスのパフォーマンスとネットワーク帯域幅の要件を考慮すると、解像度を 540P に設定することを推奨します。主流のライブストリーミングアプリのほとんどは 540P を使用しています。

  • ビットレート制御を無効にすると、ビットレートは初期ビットレートに固定され、ターゲットビットレートと最小ビットレートの間で自動的に調整されません。ネットワークが不安定な場合、これにより再生中のカクつきが発生する可能性があります。このオプションは注意して使用してください。

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

  1. 初期化

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

    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://......)"];
    説明
    • 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:オートフォーカスを有効にするかどうかを指定します。このパラメーターは、この API 呼び出しのフォーカス操作にのみ有効です。後続のオートフォーカス操作では、オートフォーカス API で設定された値が使用されます。*/
[self.livePusher focusCameraAtAdjustedPoint:CGPointMake(50, 50) autoFocus:true];
/* オートフォーカスを有効にするかどうかを設定します。*/
[self.livePusher setAutoFocus:false];
/* ミラーリングを設定します。ミラーリングインターフェイスには、アップストリーミングストリームミラーリング用の PushMirror とプレビューミラーリング用の PreviewMirror の 2 つがあります。PushMirror の設定は再生画面にのみ有効です。PreviewMirror の設定はプレビュー画面にのみ有効です。2 つの設定は互いに影響しません。*/
[self.livePusher setPushMirror:false];
[self.livePusher setPreviewMirror:false];

ストリーム取り込みコントロール

アップストリーミング制御には、アップストリーミングの開始、停止、一時停止、再開、プレビューの停止、アップストリーミングの再起動、アップストリーミングインスタンスの破棄などの操作が含まれます。ビジネスニーズに応じて、これらの操作を実行するためのボタンを追加できます。サンプルコード:

/* pauseImage を設定してから pause メソッドを呼び出すと、カメラストリームのアップストリーミングから静止画のアップストリーミングに切り替えることができます。音声のアップストリーミングは継続します。*/
[self.livePusher pause];
/* 静止画のアップストリーミングからカメラストリームのアップストリーミングに切り替えます。音声のアップストリーミングは継続します。*/
[self.livePusher resume];
/* ストリーミング状態で、このメソッドを呼び出してアップストリーミングを停止できます。操作が完了すると、アップストリーミングは停止します。*/
[self.livePusher stopPush];
/* プレビューはプレビュー状態でのみ停止できます。ストリームをアップストリーミングしている場合、プレビューの停止は無効です。プレビューが停止すると、プレビュー画面は最後のフレームでフリーズします。*/
[self.livePusher stopPreview];
/* ストリーミング状態、または Error 関連のコールバックを受信したときに、このメソッドを呼び出してアップストリーミングを再起動できます。エラー状態では、このメソッド (または再接続用の reconnectPushAsync) を呼び出すか、destroy を呼び出してアップストリーミングインスタンスを破棄することしかできません。操作が完了すると、アップストリーミングが再起動します。プレビューやアップストリーミングを含む ALivcLivePusher のすべての内部リソースが再起動されます。*/
[self.livePusher restartPush];
/* ストリーミング状態、または AlivcLivePusherNetworkDelegate 関連の Error コールバックを受信したときに、このインターフェイスを呼び出すことができます。エラー状態では、このインターフェイス (またはアップストリーミングを再起動するための restartPush) を呼び出すか、destroy を呼び出してアップストリーミングインスタンスを破棄することしかできません。操作が完了すると、アップストリーミングが再接続されます。アップストリーミング用の RTMP 接続が再確立されます。*/
[self.livePusher reconnectPushAsync];
/* アップストリーミングインスタンスが破棄されると、アップストリーミングとプレビューが停止し、プレビュー画面が削除されます。AlivcLivePusher に関連するすべてのリソースが破棄されます。*/
[self.livePusher destory];
self.livePusher = nil;
/* アップストリーミングステータスを取得します。*/
AlivcLivePushStatus status = [self.livePusher getLiveStatus];

画面録画(画面共有)のアップストリーミング

ReplayKit は iOS 9 で導入された機能で、画面録画をサポートしています。iOS 10 では、ReplayKit にサードパーティの App Extension を呼び出して画面コンテンツをライブストリーミングする機能が追加されました。iOS 10 以降では、Push SDK を Extension 画面録画プロセスと組み合わせて使用することで、ライブストリーミングの画面共有を実装できます。

スムーズなシステム操作を確保するため、iOS は Extension 画面録画プロセスに割り当てるリソースを比較的に少なくしています。Extension 画面録画プロセスがメモリを使いすぎると、システムは強制的に終了させます。Extension 画面録画プロセスのメモリ制限に対処するため、Push SDK は画面共有のアップストリーミングを Extension 画面録画プロセス (Extension App) とメインアプリプロセス (Host App) に分割します。Extension App は画面コンテンツのキャプチャと、プロセス間通信による Host App への送信を担当します。Host App は AlivcLivePusher アップストリーミングエンジンを作成し、画面データをリモートサーバーにプッシュします。アップストリーミングプロセス全体が Host App で完了するため、マイクのキャプチャと送信は Host App で処理できます。Extension App は画面コンテンツのキャプチャのみを担当します。

重要

Push SDK のデモでは、App Group を使用して Extension 画面録画プロセスとメインアプリプロセス間のプロセス間通信を実装しています。このロジックは AlivcLibReplayKitExt.framework にカプセル化されています。

iOS で画面共有のアップストリーミングを実装するには、画面録画が必要なときにシステムによって Extension 画面録画プロセスが作成されます。これは、システムによってキャプチャされた画面イメージを受信する役割を担います。次の手順を実行します。

  1. App Group の作成

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

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

    2. [Identifier] ページに戻り、[App IDs] を選択し、App ID をクリックして App Group 機能を有効にします。メインアプリプロセスと Extension 画面録画プロセスの App ID は同じように設定する必要があります。詳細については、「 App Group の有効化」をご参照ください。

    3. 操作が完了したら、対応する Provisioning Profile を再度ダウンロードし、Xcode で設定します。

    操作を正しく実行すると、Extension 画面録画プロセスがメインアプリプロセスと通信できるようになります。

    説明

    App Group を作成したら、App Group Identifier の値を保存してください。この値は後続のステップで必要になります。

  2. Extension 画面録画プロセスの作成

    iOS Push SDK のデモでは、ライブストリーミングの画面共有をサポートする AlivcLiveBroadcast および AlivcLiveBroadcastSetupUI App Extension を提供しています。アプリで Extension 画面録画プロセスを作成するには、次の手順を実行します。

    1. 既存のプロジェクトで、[New > Target…] を選択し、[Broadcast Upload Extension] を選択します。次の図を参照してください。录屏2

    2. [Product Name] を変更し、[Include UI Extension] を選択して、[Finish] をクリックしてライブストリーミング Extension と UI を作成します。次の図を参照してください。录屏步骤1

    3. ライブストリーミング Extension の Info.plist ファイルを設定します。新しく作成されたターゲットでは、Xcode はデフォルトで SampleHandler という名前のヘッダーファイルとソースファイルを作成します。次の図を参照してください。录屏3

      AlivcLibReplayKitExt.framework をプロジェクトにドラッグして、Extension Target がそれに依存するようにします。1SampleHandler.m のコードを次のコードに置き換えます。コード内の KAPP Group を、最初のステップで作成した App Group Identifier に置き換えます。サンプルコード:

      
      #import "SampleHandler.h"
      #import <AlivcLibReplayKitExt/AlivcLibReplayKitExt.h>
      
      @implementation SampleHandler
      
      - (void)broadcastStartedWithSetupInfo:(NSDictionary<NSString *,NSObject *>
      *)setupInfo {
      
       // ユーザーがブロードキャストの開始を要求しました。UI Extension からのセットアップ情報は提供できますが、オプションです。
       [[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 ターゲットを作成します。この Extension Target で、画面録画 Extension モジュール用にカスタマイズされた AlivcLibReplayKitExt.framework を統合します。

  3. 画面共有アップストリーミングのために Live SDK をメインアプリプロセスに統合

    画面共有アップストリーミングのメインアプリプロセスで、AlivcLivePushConfig および AlivcLivePusher オブジェクトを作成します。ExternMainStream を True に、AudioFromExternal を False に設定します。この設定は、音声が引き続き SDK によってキャプチャされることを示します。StartScreenCapture を呼び出して、Extension App からの画面データの受信を開始します。その後、アップストリーミングを開始および停止します。詳細については、次の手順をご参照ください。

    1. 画面共有アップストリーミングのメインアプリプロセスで、AlivcLivePusher.framework、AlivcLibRtmp.framework、RtsSDK.framework、および AlivcLibReplayKitExt.framework への依存関係を追加します。3

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

      ExternMainStream を True に、ExternVideoFormat を AlivcLivePushVideoFormatYUV420P に設定します。音声キャプチャに内部 SDK を使用するには、AudioFromExternal を False に設定します。他のアップストリーミングパラメーターを設定します。詳細については、次のサンプルコードをご参照ください。

       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 Identifier に置き換えます。サンプルコード:

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

        サンプルコード:

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

        サンプルコード:

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

プレビュー表示モード

Push 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 で 3 つのモードのいずれかを設定できます。また、setpreviewDisplayMode API を使用して、プレビュー中およびアップストリーミング中にモードを動的に設定することもできます。

  • この設定はプレビュー表示にのみ有効です。実際にアップストリーミングされる動画ストリームの解像度は、AlivcLivePushConfig でプリセットされた解像度と同じであり、プレビュー表示モードを変更しても変わりません。プレビュー表示モードは、さまざまなサイズの携帯電話に対応するように設計されています。好みのプレビュー効果を選択できます。

画像アップストリーミング

より良いユーザーエクスペリエンスのために、SDK はバックグラウンドでの画像アップストリーミングと、ビットレートが低すぎる場合の画像アップストリーミングの設定を提供します。SDK がバックグラウンドに移動すると、デフォルトで動画のアップストリーミングは一時停止され、音声のみがアップストリーミングされます。このとき、画像アップストリーミング用の画像を設定できます。たとえば、「配信者は一時的に離席しており、まもなく戻ります」という画像を表示してユーザーに通知できます。サンプルコード:

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

さらに、ネットワークが貧弱な場合、ニーズに応じて静止画をアップストリーミングするように設定できます。画像を設定すると、SDK は現在のビットレートが低いことを検出し、動画ストリームのカクつきを避けるためにこの画像をアップストリーミングします。サンプルコード:

config.networkPoorImg = [UIImage imageNamed:@"image.png"];// ネットワークが貧弱な場合にアップストリーミングする画像を設定します。

外部の音声および動画ストリームのプッシュ

Push SDK は、音声ファイルや動画ファイルなど、外部の音声および動画ソースのアップストリーミングをサポートしています。

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

  2. サンプルコード:

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

  4. サンプルコード:

    /* 外部動画の YUV および RGB 形式の連続バッファーデータのみが sendVideoData インターフェイスを使用して送信できます。動画データバッファー、長さ、幅、高さ、タイムスタンプ、回転角度を送信できます。*/
    [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];

ウォーターマークの設定

Push SDK はウォーターマークを追加する機能を提供します。複数のウォーターマークを追加できます。ウォーターマーク画像は PNG 形式である必要があります。サンプルコード:

NSString *watermarkBundlePath = [[NSBundle mainBundle] pathForResource:
[NSString stringWithFormat:@"watermark"] ofType:@"png"];// ウォーターマーク画像のパスを設定します。
[config addWatermarkWithPath: watermarkBundlePath
 watermarkCoordX:0.1
 watermarkCoordY:0.1
 watermarkWidth:0.3];// ウォーターマークを追加します。
説明
  • coordX、coordY、および width は相対値です。たとえば、watermarkCoordX:0.1 は、ウォーターマークの x 座標がアップストリーミング画面の x 軸の 10% の位置にあることを示します。アップストリーミング解像度が 540 × 960 の場合、ウォーターマークの x 座標は 54 になります。

  • ウォーターマーク画像の高さは、ウォーターマーク画像の実際の幅と高さに基づいて、入力された幅の値に比例してスケーリングされます。

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

  • ウォーターマークの鮮明さとエッジの滑らかさを確保するために、ウォーターマークの出力サイズと同じサイズのウォーターマークソース画像を使用してください。たとえば、出力ビデオ解像度が 544 × 940 で、ウォーターマークの表示幅が 0.1f の場合、幅が約 544 × 0.1f = 54.4 のウォーターマークソース画像を使用します。

動画品質の設定

動画品質は、解像度優先、流暢さ優先、カスタムの 3 つのモードをサポートしています。

重要

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

解決優先度 (デフォルト)

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

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

流暢さ優先

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

config.qualityMode = AlivcLivePushQualityModeFluencyFirst;// 流暢さ優先モード

カスタムモード

カスタムモードでは、SDK は開発者の設定に基づいてビットレートを設定します。モードをカスタムに設定する場合、初期ビットレート、最小ビットレート、ターゲットビットレートを定義する必要があります。

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

  • 最小ビットレート:ネットワークが貧弱な場合、ビットレートは徐々に最小ビットレートまで低下し、動画のカクつきを減らします。

  • ターゲットビットレート:ネットワークが良好な場合、ビットレートは徐々にターゲットビットレートまで上昇し、動画の鮮明さを向上させます。

config.qualityMode = AlivcLivePushQualityModeCustom// カスタムモードに設定します。
config.targetVideoBitrate = 1400; // ターゲットビットレートは 1,400 kbit/s です。
config.minVideoBitrate = 600; // 最小ビットレートは 600 kbit/s です。
config.initialVideoBitrate = 1000; // 初期ビットレートは 1,000 kbit/s です。

カスタムビットレートを設定する際は、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

アダプティプ解像度

動的解像度調整が有効な場合、ネットワーク状態が悪いとアップストリーミング解像度が自動的に低下します。これにより、動画の滑らかさと鮮明さが向上します。サンプルコード:

config.enableAutoResolution = YES; // アダプティプ解像度を有効にします。デフォルト値は NO です。
重要
  • アダプティプ解像度は、動画品質モードが解像度優先または流暢さ優先に設定されている場合にのみ有効です。カスタムモードでは有効になりません。

  • 一部のプレーヤーは動的解像度をサポートしていない場合があります。アダプティプ解像度機能を使用する場合は、ApsaraVideo Player を使用してください。

バックグラウンドミュージック

Push SDK は、バックグラウンドミュージックの再生、オーディオミキシング、ノイズ除去、インイヤーモニタリング、ミュートをサポートしています。関連する API 操作は、プレビューが開始された後にのみ呼び出してください。次のコードは例です。

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

スナップショットのキャプチャ

Push SDK を使用すると、ローカルビデオストリームのスナップショットをキャプチャできます。以下はサンプルコードです。

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

美顔効果機能の設定

Alibaba Cloud Push 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;

美顔効果パラメーターのリアルタイム調整

Push 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) を挿入することで機能します。プレーヤーはその後 SEI を解析します。Push SDK は SEI メッセージを挿入するメソッドを提供します。このメソッドはアップストリーミング中にのみ呼び出してください。次のコードは例です。

/*
msg: ストリームに挿入する SEI メッセージの本文。JSON 形式を推奨します。ApsaraVideo Player SDK はこのメッセージを受信して解析し、表示できます。
repeatCount: メッセージを送信するフレーム数。SEI メッセージがドロップされるのを防ぐために、繰り返し回数を設定します。たとえば、値 100 はメッセージを次の 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]) {
 // ...
}

外部音声の再生

アップストリーミングページで外部音声を再生するには、AVAudioPlayer を使用してください。なぜなら、SDK は一時的に AudioServicesPlaySystemSound と互換性がないためです。再生後、AVAudioSession の設定を更新してください。以下はサンプルコードです。

- (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 は音声ストリームのアップストリーミングを継続し、ビデオは最後のフレームで一時停止します。アプリがバックグラウンドで音声を収集できるようにするには、アプリの Capabilities に移動し、Background Mode を有効にして、[Audio, AirPlay and Picture in Picture] を選択します。退后台和接听电话

アプリがバックグラウンドに移動したときに音声のアップストリーミングを停止するには、アップストリーミングエンジンを破棄します。アプリがフォアグラウンドに戻ったときに、エンジンを再作成してストリームを再開します。

説明

このメソッドを使用する場合、UIApplicationWillResignActiveNotification と UIApplicationDidBecomeActiveNotification をリッスンする必要があります。他のメソッドは脅威となり、エラーを引き起こす可能性があります。

コールバック

Push SDK には次のコールバックが含まれています。

コールバックの種類

コールバッククラス名

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

AlivcLivePusherInfoDelegate

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

AlivcLivePusherNetworkDelegate

エラーコールバック

AlivcLivePusherErrorDelegate

バックグラウンドミュージックコールバック

AlivcLivePusherBGMDelegate

外部の美顔効果およびフィルター処理のコールバック

AlivcLivePusherCustomFilterDelegate

ストリームインジェストのコールバック

アップストリーミングコールバックは、SDK のステータスをアプリに通知します。これらのコールバックには、プレビューの開始、最初のビデオフレームのレンダリング、最初の音声またはビデオフレームの送信、アップストリーミングの開始、およびアップストリーミングの停止の通知が含まれます。

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

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

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

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

ネットワークコールバックは、ネットワークと接続のステータスをアプリに通知します。`AlivcLivePushConfig` で設定された再接続タイムアウトとリトライ制限内の短いネットワーク変動や遷移については、SDK は自動的に再接続します。再接続が成功すると、アップストリーミングが再開されます。

  • onConnectFail:アップストリーミングが失敗したことを示します。アップストリーミング URL が無効であるか、無効な文字が含まれているか、認証に問題があるか、同時アップストリーミング制限を超えているか、アップストリーミング禁止ブラックリストに載っているかを確認してください。アップストリーミング URL が有効でアクティブであることを確認した後、再度アップストリーミングを試みてください。特定のエラーコードは 0x30020901 から 0x30020905 および 0x30010900 から 0x30010901 です。

  • onConnectionLost:接続が失われました。SDK は自動的に再接続し、`onReconnectStart` を返します。最大再接続試行回数 (`config.connectRetryCount`) 後に接続が回復しない場合、`onReconnectError` が返されます。

  • onNetworkPoor:ネットワークが遅いことを示します。このコールバックは、現在のネットワークがアップストリーミングに十分な強度ではないが、ストリームは中断されていないことを意味します。ここで、ユーザーに UI 通知を表示するなど、ビジネスロジックを処理できます。

  • onNetworkRecovery:ネットワークが回復したことを示します。

  • onReconnectError:再接続が失敗したことを示します。現在のネットワークを確認してください。ネットワークが回復したら、再度アップストリーミングを試みてください。

  • onSendDataTimeout:データ送信タイムアウトを示します。現在のネットワークを確認してください。ネットワークが回復したら、現在のアップストリーミングを停止し、新しいものを開始してください。

  • onPushURLAuthenticationOverdue:現在のアップストリーミング URL の URL 署名が期限切れになったことを示します。新しい URL を SDK に渡す必要があります。

エラーコールバック

  • onSystemError:システムデバイスエラーが発生しました。エンジンを破棄して再試行する必要があります。

  • onSDKError:SDK エラーが発生しました。エラーコードに基づいてエラーを処理します。

    • エラーコードが 805438211 の場合、デバイスのパフォーマンスが低く、エンコーディングとレンダリングのフレームレートが低いことを示します。配信者に通知し、高度な美顔効果やアニメーションなど、時間のかかるビジネスロジックをアプリレイヤーで停止してください。

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

    • その他すべてのエラーについては、ログに書き込むだけで、他のアクションは必要ありません。

バックグラウンドミュージックコールバック

  • onOpenFailed:バックグラウンドミュージックの開始に失敗しました。音楽ファイルが有効で、そのパスが正しいか確認してください。startBGMWithMusicPathAsync メソッドを呼び出して、再度再生を試みてください。

  • onDownloadTimeout:バックグラウンドミュージックの再生中にタイムアウトが発生しました。これは、ネットワーク URL からバックグラウンドミュージックを再生するときによく発生します。配信者に現在のネットワーク状態を確認するように促してください。startBGMWithMusicPathAsync メソッドを呼び出して、再度音楽を再生してください。

外部の美顔効果およびフィルター処理のコールバック

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

AlivcLivePushConfig の livePushMode スイッチを AlivcLivePushBasicMode に設定します。SDK は AlivcLivePusherCustomFilterDelegate を使用して、CVPixelBuffer ではなくテクスチャ ID を返します。コアとなるコールバックは次のとおりです。

  • onCreate:OpenGL コンテキストが作成されます。このコールバックは通常、美顔効果エンジンを初期化するために使用されます。

  • onProcess:SDK から元のテクスチャ ID を受信する OpenGL テクスチャ更新コールバック。このコールバックでは、美顔効果メソッドを呼び出し、処理されたテクスチャ ID を返すことができます。

  • onDestory:OpenGL コンテキストが破棄されます。このコールバックは通常、美顔効果エンジンを破棄するために使用されます。

一般的なメソッドとインターフェイス

/* カスタムモードでは、最小ビットレートとターゲットビットレートをリアルタイムで調整できます。*/
[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 を開くメソッドを呼び出さないでください。

サンプルコード:

[AlivcLivePusher showDebugView];// DebugView を開きます。

API ドキュメント

Basic Edition API ドキュメント

よくある質問

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

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

取り込まれたストリームに関する情報を取得するにはどうすればよいですか。

ストリーム管理に移動し、[アクティブなストリーム] でアップストリーミングされた音声および動画ストリームを表示します。

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

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

アプリケーションが App Store の審査に失敗しました

RtsSDK バイナリは、デバイスとエミュレーターの両方のスライスを含むファットライブラリです。Apple は、エミュレーターアーキテクチャを含む IPA を拒否します。lipo -remove を使用して x86_64 アーキテクチャを削除してください。