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

ApsaraVideo Live:Push SDK for iOS の使用

最終更新日:Nov 09, 2025

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

特徴

  • リアルタイムメッセージングプロトコル (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 の登録

ライセンスの申請と設定方法の詳細については、「Push 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 に設定することをお勧めします。ほとんどの主流のライブストリーミングアプリはこの解像度を使用しています。

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

カメラストリームを取り込む

  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://......)"];
    説明

カメラ関連の操作

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

/* フロントカメラとリアカメラを切り替えます */
[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];
/* ミラー設定。ミラー関連のインターフェイスは 2 つあります: アップストリーミングミラーリング用の PushMirror とプレビューミラーリング用の PreviewMirror です。PushMirror 設定は再生画面にのみ影響します。PreviewMirror 設定はプレビュー画面にのみ影響します。2 つは互いに影響しません。*/
[self.livePusher setPushMirror:false];
[self.livePusher setPreviewMirror:false];

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

アップストリーミング制御には、アップストリーミングの開始、停止、破棄、プレビューの停止、アップストリーミングの再開、カメラストリームのアップストリーミングの一時停止と再開などの操作が含まれます。ビジネスニーズに基づいて、これらの操作を実行するためのボタンを追加できます。以下はサンプルコードです。

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

画面共有ストリームのインジェスト

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

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

重要

Push SDK デモでは、App Group を使用して Extension App と Host App 間のプロセス間通信を有効にします。このロジックは AlivcLibReplayKitExt.framework にカプセル化されています。

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

  1. App Group の作成

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

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

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

    3. 完了したら、対応するプロビジョニングプロファイルを再ダウンロードし、Xcode で設定します。

    操作を正しく完了すると、Extension App は Host App と通信できるようになります。

    説明

    App Group を作成した後、後続のステップで使用するために App Group Identifier の値を保存します。

  2. 機能拡張画面録画プロセスの作成

    Push SDK for iOS デモには、ライブストリーミングのための画面共有をサポートする AlivcLiveBroadcast および AlivcLiveBroadcastSetupUI アプリ拡張機能が含まれています。アプリで機能拡張画面録画プロセスを作成するには、次のステップに従います。

    1. 既存のプロジェクトで、[新規] > [ターゲット...] を選択し、[Broadcast Upload Extension] を選択します。次の図に示します。录屏2

    2. [製品名] を変更し、[UI 拡張機能を含める] を選択し、[完了] をクリックしてブロードキャスト拡張機能と UI を作成します。次の図に示します。录屏步骤1

    3. ブロードキャスト拡張機能の Info.plist を設定します。新しく作成されたターゲットでは、Xcode はデフォルトで SampleHandler という名前のヘッダーファイルとソースファイルを作成します。次の図に示します。录屏3

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

      
      #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 Target を作成します。この Extension Target で、画面録画拡張モジュール用にカスタマイズされた AlivcLibReplayKitExt.framework を統合します。

  3. Live SDK をホストアプリに統合する

    Host App で、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.1 の場合、幅が約 544 × 0.1 = 54.4 のソースウォーターマーク画像を使用します。

ビデオ品質の設定

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

重要

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

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

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

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

流暢さ優先

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

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

カスタムモード

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

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

  • 最小ビットレート: ネットワークが貧弱な場合、ビットレートは徐々に最小ビットレートまで低下し、ビデオの途切れを減らします。

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

config.qualityMode = AlivcLivePushQualityModeCustom// カスタムモードに設定します。
config.targetVideoBitrate = 1400; // ターゲットビットレート: 1400 kbit/s
config.minVideoBitrate = 600; // 最小ビットレート: 600 kbit/s
config.initialVideoBitrate = 1000; // 初期ビットレート: 1000 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 は、バックグラウンドミュージックの再生、ミキシング、ノイズリダクション、インイヤーモニタリング、ミュートなどの機能を提供します。バックグラウンドミュージック関連のインターフェイスは、プレビューが開始された後にのみ呼び出すことができます。以下はサンプルコードです。

/* バックグラウンドミュージックの再生を開始します。*/
[self.livePusher startBGMWithMusicPathAsync:musicPath];
/* バックグラウンドミュージックの再生を停止します。BGM が現在再生中で曲を切り替える必要がある場合は、バックグラウンドミュージック開始インターフェイスを呼び出すだけです。現在再生中のバックグラウンドミュージックを停止する必要はありません。*/
[self.livePusher stopBGMAsync];
/* バックグラウンドミュージックの再生を一時停止します。このインターフェイスは、バックグラウンドミュージックの再生が開始された後にのみ呼び出すことができます。*/
[self.livePusher pauseBGM];
/* バックグラウンドミュージックの再生を再開します。このインターフェイスは、バックグラウンドミュージックが一時停止している場合にのみ呼び出すことができます。*/
[self.livePusher resumeBGM];
/* 音楽のループ再生を有効にします。*/
[self.livePusher setBGMLoop:true];
/* ノイズリダクションスイッチを設定します。ノイズリダクションをオンにすると、キャプチャされた音の人間の声以外の部分がフィルタリングされます。これにより、人間の声がわずかに抑制される場合があります。ユーザーがノイズリダクション機能を有効にするかどうかを選択できるようにすることをお勧めします。デフォルトでは使用されません。*/
[self.livePusher setAudioDenoise:true];
/* インイヤーモニタリングスイッチを設定します。インイヤーモニタリング機能は、主に KTV シナリオで使用されます。インイヤーモニタリングをオンにすると、ヘッドフォンを接続したときにストリーマーの声がヘッドフォンで聞こえます。オフにすると、人間の声はヘッドフォンで聞こえません。インイヤーモニタリングはヘッドフォンなしでは機能しません。*/
[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 からの 1 つ。
* @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 メッセージを挿入し、それをプレーヤーで解析することで実装できます。Push 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 でプレビュービューを全画面サイズに設定すると、画像が引き伸ばされます。iPhone X では、プレビューに全画面ビューを使用しないことをお勧めします。

アップストリーミング中のビューサイズの変更

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

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

外部効果音の再生

アップストリーミングページで効果音や音楽を再生するには、AVAudioPlayer を使用することをお勧めします。これは、SDK が現在 AudioServicesPlaySystemSound と競合しているためです。再生後、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 はデフォルトで音声のアップストリーミングを継続し、ビデオは最後のフレームのままになります。アプリの機能でバックグラウンドモードオプションを開き、[オーディオ、AirPlay、ピクチャ・イン・ピクチャ] を選択する必要があります。これにより、アプリがバックグラウンドにあるときに正常に音声をキャプチャできるようになります。次の図を参照してください。退后台和接听电话

アプリがバックグラウンドにあるときに音声ストリームのアップストリーミングを維持する必要がない場合は、アプリがバックグラウンドに入ったときにアップストリーミングを停止し、アプリがフォアグラウンドに戻ったときに再開できます。これを行うには、アプリがバックグラウンドに入ったときにアップストリーミングエンジンを破棄し、アプリがフォアグラウンドに戻ったときに再作成してアップストリーミングを再開します。

説明

このアプローチでは、アプリがバックグラウンドに入るときに `UIApplicationWillResignActiveNotification` と `UIApplicationDidBecomeActiveNotification` をリッスンする必要があります。他の方法はリスクを伴う可能性があります。

コールバックのリスニング

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

コールバックタイプ

コールバッククラス名

アップストリーミングコールバック

AlivcLivePusherInfoDelegate

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

AlivcLivePusherNetworkDelegate

エラーコールバック

AlivcLivePusherErrorDelegate

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

AlivcLivePusherBGMDelegate

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

AlivcLivePusherCustomFilterDelegate

アップストリーミングコールバック

アップストリーミングコールバックは、プレビューの開始、最初のビデオフレームのレンダリング、最初の音声/ビデオフレームの送信、アップストリーミングの開始、アップストリーミングの停止など、SDK のステータスをアプリに通知するために使用されます。

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

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

  • onPushStarted, onFirstFramePushed: SDK のアップストリーミングが成功したことを示します。

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

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

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

  • onConnectionLost: 接続が失われたことを示すコールバックです。接続が失われた後、SDK は内部で自動的に再接続し、`onReconnectStart` をトリガーします。最大再接続試行回数 (`config.connectRetryCount`) 後にアップストリーミング接続が復元されない場合、`onReconnectError` がトリガーされます。

  • onNetworkPoor: ネットワークが遅いことを示すコールバックです。このコールバックを受信すると、現在のネットワークがアップストリーミングをサポートするのに不十分であることを示します。この時点では、アップストリーミングはまだ進行中であり、中断されていません。ここで、ユーザーに UI 通知を表示するなど、ビジネスロジックを処理できます。

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

  • onReconnectError: 再接続が失敗したことを示すコールバックです。これは、再接続が失敗したことを示します。現在のネットワークを確認し、ネットワークが回復したときにアップストリーミングを再開してください。

  • onSendDataTimeout: データ送信がタイムアウトしたことを示すコールバックです。現在のネットワークを確認してください。ネットワークが回復した後、アップストリーミングを停止して再開してください。

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

エラーコールバック

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

  • onSDKError: SDK エラーを示すコールバックです。エラーコードに基づいて異なる方法で処理する必要があります。

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

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

    • その他のエラーについては、他のアクションを実行せずにログに記録できます。

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

  • onOpenFailed: このコールバックは、バックグラウンドミュージックの開始に失敗したことを示します。バックグラウンドミュージック開始インターフェイスに渡された音楽パスと音楽ファイルが正しいかどうかを確認してください。startBGMWithMusicPathAsync を呼び出して再度再生できます。

  • onDownloadTimeout: このコールバックは、バックグラウンドミュージックの再生がタイムアウトしたことを示します。これは、ネットワーク URL からバックグラウンドミュージックを再生するときによく発生します。ストリーマーに現在のネットワークステータスを確認するように促してください。startBGMWithMusicPathAsync を呼び出して再度再生できます。

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

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

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

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

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

  • onDestroy: 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];
/* バージョン番号を取得します。*/
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 アーキテクチャを削除できます。