このトピックでは、Push SDK for iOSを使用する方法と、SDKのクラスとメソッドについて説明します。 このトピックでは、Push SDK for iOSが提供する機能の使用例についても説明します。
モバイルデバイスでストリームを取り込む方法の詳細については、「ストリーム取り込み、ストリームプル、およびストリーミング」をご参照ください。
特徴
RTMP (Real-Time Messaging Protocol) によるストリーム取り込みをサポートします。
リアルタイム通信 (RTC) に基づくリアルタイムストリーミング (RTS) プロトコルを介したストリームの取り込みとストリームのプルをサポートします。
共同ストリーミングと戦闘をサポートします。
ビデオエンコーディングにH.264、オーディオエンコーディングにAdvanced Audio Coding (AAC) を採用します。
ビットレート制御、解像度、表示モードなどの機能のカスタム設定をサポートします。
さまざまなカメラ操作をサポートします。
リアルタイムのレタッチをサポートし、レタッチ効果を調整できます。
アニメーションステッカーをアニメーション透かしとして追加し、アニメーションステッカーを削除できます。
画面録画をストリーミングできます。
YUVやパルス符号変調 (PCM) など、さまざまな形式の外部オーディオおよびビデオ入力をサポートします。
複数のストリームの混合をサポートします。
オーディオのみとビデオのみのストリームの取り込みと、バックグラウンドでのストリーム取り込みをサポートします。
バックグラウンドミュージックをサポートし、バックグラウンドミュージックを管理できます。
ビデオスナップショットのキャプチャをサポートします。
自動再接続とエラー処理をサポートします。
オーディオ3Aアルゴリズムをサポートします。
ビデオファイルのソフトウェアとハードウェアのエンコードモードを切り替えることができます。 これは、符号化モジュールの安定性を改善します。
制限事項
iOS用プッシュSDKを使用する前に、次の制限事項に注意してください。
ストリームの取り込み前に画面の向きを設定する必要があります。 ライブストリーミング中は画面を回転できません。
ランドスケープモードでのストリーム取り込みの自動画面回転を無効にする必要があります。
ハードウェア符号化モードでは、出力解像度の値は、エンコーダと互換性があるように16の倍数でなければならない。 たとえば、解像度を540pに設定すると、出力解像度は544 × 960になります。 黒いバーを防ぐために、出力解像度に基づいてプレーヤーの画面サイズをスケーリングする必要があります。
手順
次の表に、Push SDK for iOSの基本エディションの使用方法を示します。
ステップ | 説明 | 関連ドキュメント |
1. SDKを登録します。 | ライセンス関連のパラメーターを設定して、Push SDK for iOSを登録します。 登録機能を呼び出さない場合、ストリーム取り込み機能は使用できません。 | |
2. ストリーム取り込みパラメーターを設定します。 | 基本パラメータ、ビットレート制御モード、適応解像度、レタッチなどのストリーム取り込み設定を完了します。 | |
3. プッシュSDK for iOSを使用してストリームを取り込みます。 | Push SDK for iOSを初期化し、ストリーム取り込みコールバックを登録し、プレビュービューを作成した後、ストリームの取り込みを開始できます。 ビジネス要件に基づいて、ストリームの管理、BGMの設定、カメラ設定の設定、ライブクイズの有効化、外部オーディオソースの取り込み、アニメーションステッカーの追加を行うことができます。 説明 ApsaraVideo Liveでは、複数のストリームを同時にURLに取り込むことはできません。 複数のストリームを同時に取り込む場合、最初のストリームのみが取り込まれます。 | |
4. (オプション) 画面録画のストリーム取り込みを設定します。 | 画面録画をストリーミングする場合は、画面録画のストリーム取り込みを設定します。 |
次の表に、Push SDK for iOSのインタラクティブエディションの使用方法を示します。
ステップ | 説明 | 関連ドキュメント |
1. SDKを登録します。 | ライセンス関連のパラメーターを設定して、Push SDK for iOSを登録します。 登録機能を呼び出さない場合、ストリーム取り込み機能は使用できません。 | |
2. コストリーミング設定を構成します。 | コストリーミング設定を構成した後、ストリーマーとビューアは、iOS用のPush SDKのインタラクティブエディションを使用して、300 ms未満の超低レイテンシで相互に対話できます。 |
SDKの登録
Push SDK for iOS V4.4.2以降では、オールインワンライセンスが使用されます。 ストリーム取り込み機能を使用する前に、Push SDK for iOSを登録する必要があります。 詳細については、「プッシュSDKライセンスの統合」をご参照ください。
ストリーム取り込みパラメーターの設定 (基本版)
AlivcLivePushConfigクラスを使用して、ストリーム取り込みパラメーターを設定できます。 各パラメーターにはデフォルト値が設定されてます。 各パラメーターのデフォルト値と有効な値の詳細については、 Push SDK for iOS V6.9.0 (基本版) のAPIリファレンスまたはPush SDK for iOS V6.9.0 (インタラクティブ版) のAPIリファレンスまたはコード内のコメントを表示します。
ストリームの取り込み中にこれらのパラメーターをリアルタイムで変更するには、AlivcLivePusherクラスで提供されるメソッドを参照してください。
基本的なストリーム取り込み設定を完了します。
AlivcLivePusherが必要なビューコントローラーにヘッダーファイルをインポートします。
# Import <AlivcLivePusher/AlivcLivePusher.h>
サンプルコード:AlivcLivePushConfig *config = [[AlivcLivePushConfig alloc] init];// Initialize the AlivcLivePushConfig class. You can also use initWithResolution to perform initialization. config.resolution = AlivcLivePushResolution540P; // By default, the resolution is set to 540p. The maximum resolution is 720p. config.fps = AlivcLivePushFPS20; // We recommend that you set the frame rate to 20 frames per second (FPS). config.enableAutoBitrate = true; // Specify whether to enable adaptive bitrate streaming. The default value is true. config.videoEncodeGop = AlivcLivePushVideoEncodeGOP_2;// The default value is 2. The longer the interval between key frames, the higher the latency. We recommend that you set this parameter to a value from 1 to 2. config.connectRetryInterval = 2000; // The reconnection interval in milliseconds. The default reconnection interval is 2 seconds. The reconnection interval cannot be shorter than 1 second. We recommend that you use the default value. config.previewMirror = false; // The default value is false. We recommend that you use the default value. config.orientation = AlivcLivePushOrientationPortrait; // The default screen orientation is portrait. You can change the orientation to landscape left or landscape right.
説明携帯電話のパフォーマンスとネットワーク帯域幅要件に基づいて、解像度を540pに設定することを推奨します。 ほとんどの場合、ライブストリーミング用の主流アプリは540pを使用します。
基本的なストリーム取り込み設定に使用されるすべてのパラメータにはデフォルト値があります。 デフォルト値の使用を推奨します。
適応ビットレートストリーミングが無効になっている場合、ビットレートは初期値に固定され、指定されたターゲットビットレートと最小ビットレートの間で自動的に調整されません。 この場合、ネットワークが不安定なときに吃音が発生する可能性があります。 この機能を無効にする前に注意してください。
ビットレート制御モードを指定します。
次の表に、Push SDK for iOSが提供するビットレート制御モードを示します。 ビジネス要件に基づいて各パラメーターの値を指定します。
ビットレート制御モード
説明
サンプルコード
AlivcLivePushQualityModeResolutionFirst
品質-最初のモード。 Push SDK for iOSは、ビデオストリームの品質を優先するようにビットレートパラメータを設定します。
config.qualityMode = AlivcLivePushQualityModeResolutionFirst; // The default mode is quality-first. You can change the mode to smoothness-first or custom mode.
AlivcLivePushQualityModeFluencyFirst
滑らかさ-最初のモード。 Push SDK for iOSは、ビデオストリームの滑らかさを優先するビットレートパラメータを設定します。
config.qualityMode = AlivcLivePushQualityModeFluencyFirst; // The default mode is smoothness-first. You can change the mode to quality-first or custom mode.
AlivcLivePushQualityModeCustom
カスタムモード。 Push SDK for iOSは、カスタム設定に基づいてビットレートパラメータを設定します。 カスタムモードを使用する場合は、初期ビットレート、最小ビットレート、および目標ビットレートを指定する必要があります。
initialVideoBitrate: ライブストリーム開始時の初期ビットレート。
minVideoBitrate: 悪いネットワーク条件では、ビットレートは吃音を防ぐために最小ビットレートまで徐々に低下します。
targetVideoBitrate: 良好なネットワーク条件では、ビデオストリームの品質を向上させるために、ビットレートがターゲットビットレートまで徐々に増加します。
config.qualityMode = AlivcLivePushQualityModeCustom// Select the custom mode. config.targetVideoBitrate = 1400; // The maximum bitrate is 1,400 Kbit/s. config.minVideoBitrate = 600; // The minimum bitrate is 600 Kbit/s. config.initialVideoBitrate = 1000; // The initial bitrate is 1,000 Kbit/s.
説明quality-firstまたはsmoothness-firstモードを使用する場合、initialVideoBitrate、minVideoBitrate、およびtargetVideoBitrateパラメーターを設定する必要はありません。 Push SDKは、ネットワークジッタが発生したときにビデオストリームの品質または滑らかさを保証します。
カスタムモードを使用する場合は、推奨設定に基づいてビットレートパラメータを設定します。 推奨設定を次の表に示します。
表 1. 推奨設定のカスタムビットレート品質-ファーストモード
解像度
initialVideoBitrate
minVideoBitrate
targetVideoBitrate
360p
600
300
1000
480p
800
300
1,200
540p
1000
600
1400
720p
1500
600
2000
1080p
1800
1,200
2,500
表 2. 滑らかさ-ファーストモードでのカスタムビットレートの推奨設定
解像度
initialVideoBitrate
minVideoBitrate
targetVideoBitrate
360p
400
200
600
480p
600
300
800
540p
800
300
1000
720p
1000
300
1,200
1080p
1500
1,200
2200
アダプティブ解決機能を設定します。
アダプティブ解像度機能を有効にすると、解像度が自動的に低下し、劣悪なネットワーク条件でビデオストリームの滑らかさと品質が保証されます。 サンプルコード:
config.enableAutoResolution = YES; // Specify whether to enable adaptive resolution. The default value is NO.
重要アダプティブ解決機能は、すべてのプレイヤーでサポートされていません。 この機能を使用する必要がある場合は、ApsaraVideo Playerを使用することを推奨します。
アダプティブ解像度機能は、AlivcQualityModeEnumパラメーターを設定することにより、quality-firstモードまたはsmoothness-firstモードを使用する場合にのみ有効になります。 カスタムモードを使用する場合、この機能は使用できません。
レタッチ機能を設定します。
Push SDK for iOSは、基本的および高度なレタッチ効果を提供します。 基本的なレタッチ効果には、美白、肌のスムージング、バラ色の頬が含まれます。 顔認識に基づく高度なレタッチ効果には、美白、肌のスムージング、バラ色の頬、大きな目、顔のサイズ変更、顔の痩身などがあります。 詳細については、「クイーンSDK overview」をご参照ください。 サンプルコード:
# pragma mark - "Retouching effects and related methods/** * @brief Enable or disable a retouching effect. * @param type Specify a value for the QueenBeautyType parameter. * @param isOpen YES: enables the retouching effect. NO: disables the retouching effect. * */ - (void)setQueenBeautyType:(kQueenBeautyType)type enable:(BOOL)isOpen; /** * @brief Set retouching parameters. * @param param Specify a retouching parameter. This parameter is a field of the QueenBeautyParams parameter. * @param value Specify a value for the retouching parameter. Valid values: 0 to 1. If the original value is smaller than 0, set the value to 0. If the original value is greater than 1, set the value to 1. */ - (void)setQueenBeautyParams:(kQueenBeautyParams)param value:(float)value; # pragma mark - "Methods for filters" /** * @brief Specify a filter material. Before you specify the filter material, set the kQueenBeautyTypeLUT parameter. * @param imagePath Specify the path of the filter material. */ - (void)setLutImagePath:(NSString *)imagePath; # pragma mark - "Methods for face shaping" /** * @brief Specify a face shaping effect. Before you specify the face shaping effect, set the kQueenBeautyTypeFaceShape parameter. * @param faceShapeType Specify the face shaping effect that you want to use. This parameter is similar to the QueenBeautyFaceShapeType parameter. * @param value Specify a value for the faceShapeType parameter. */ - (void)setFaceShape:(kQueenBeautyFaceShapeType)faceShapeType value:(float)value; # pragma mark - "Methods for makeup" /** * @brief Specify a makeup type and the paths of makeup materials. Before you specify the makeup type, set the kQueenBeautyTypeMakeup parameter. * @param makeupType Specify a makeup type. * @param imagePaths Specify the paths of makeup materials. * @param blend Specify mixed makeup. */ - (void)setMakeupWithType:(kQueenBeautyMakeupType)makeupType paths:(NSArray<NSString *> *)imagePaths blendType:(kQueenBeautyBlend)blend; /** * @brief Specify a makeup type and the paths of makeup materials. * @param makeupType Specify a makeup type. * @param imagePaths Specify the paths of makeup materials. * @param blend Specify mixed makeup. * @param fps Specify the frame rate. */ - (void)setMakeupWithType:(kQueenBeautyMakeupType)makeupType paths:(NSArray<NSString *> *)imagePaths blendType:(kQueenBeautyBlend)blend fps:(int)fps; /** * @brief Configure the transparency for a makeup type. You can specify the gender. * @param makeupType Specify a makeup type. * @param isFeMale Specify whether the gender is female. YES: female. NO: male. * @param alpha Specify the transparency for the makeup. */ - (void)setMakeupAlphaWithType:(kQueenBeautyMakeupType)makeupType female:(BOOL)isFeMale alpha:(float)alpha; /** * @brief Specify the type of mixed makeup. * @param makeupType Specify a makeup type. * @param blend Specify mixed makeup. */ - (void)setMakeupBlendWithType:(kQueenBeautyMakeupType)makeupType blendType:(kQueenBeautyBlend)blend; /** * @brief Clear all makeup effects. */ - (void)resetAllMakeupType;
イメージ取り込みを設定します。
Push SDK for iOSを使用すると、アプリがバックグラウンドに切り替えられたとき、またはビットレートが低いときに画像を取り込むことができます。 ユーザーエクスペリエンスが向上します。 アプリをバックグラウンドに切り替えると、ビデオストリームの取り込みが一時停止されます。 この場合、オーディオストリームのみが取り込まれます。 取り込みたいイメージを指定することもできます。 たとえば、次のようなメッセージを含む画像を取り込むことができます。The streamer will be back soon. は視聴者に通知するために表示されます。 サンプルコード:
config.pauseImg = [UIImage imageNamed:@"image.png"]; // Specify the image for stream ingest when your app is switched to the background.
ネットワーク条件が悪い場合は、ストリーム取り込み用の静的イメージを指定できます。 ビットレートが低い場合は、吃音を防ぐために指定した画像が取り込まれます。 サンプルコード:
config.networkPoorImg = [UIImage imageNamed:@"image.png"]; // Specify the image for stream ingest in poor network conditions.
透かしを設定します。
Push SDK for iOSを使用すると、1つ以上の透かしを追加できます。 透かしはPNG形式でなければなりません。 サンプルコード:
NSString *watermarkBundlePath = [[NSBundle mainBundle] pathForResource: [NSString stringWithFormat:@"watermark"] ofType:@"png"]; // Specify the path of the watermark. [config addWatermarkWithPath: watermarkBundlePath watermarkCoordX:0.1 watermarkCoordY:0.1 watermarkWidth:0.3]; // Add the watermark.
説明watermarkCoordX、watermarkCoordY、およびwatermarkWidthパラメータの値は相対値です。 たとえば、watermarkCoordXパラメータの値0.1は、透かしの左端がストリーム取り込み画面のx軸上の10% 位置にあることを示します。 したがって、ストリーム解像度が540 × 960である場合、watermarkCoordXパラメータの値は54です。
透かしの高さは、ソース画像の幅および高さ、ならびに透かしの入力幅値に基づいてスケーリングされます。
テキスト透かしを追加する場合は、テキストを画像に変換し、addWatermarkWithPathメソッドを呼び出して画像を透かしとして追加します。
透かしのエッジの明瞭さと滑らかさを確保するために、出力透かしと同じサイズのソースイメージを使用することをお勧めします。 たとえば、出力ビデオの解像度が544 × 940で、ウォーターマークの幅が0.1fの場合、ソースイメージには544 × 0.1f = 54.4の幅を使用することを推奨します。
プレビューモードを指定します。
Push SDK for iOSは、次のプレビューモードをサポートしています。 プレビューモードは、ストリーム取り込みには影響しません。
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メソッドを呼び出して、プレビューおよびストリームの取り込み中にプレビューモードを指定することもできます。
この設定はプレビューに対してのみ有効です。 出力ビデオの実際の解像度は、AlivcLivePushConfigクラスで設定されている解像度に従います。 プレビューモードは実際の解像度には影響しません。 携帯電話のさまざまな画面サイズに合わせてプレビューモードを選択できます。
プッシュSDK for iOSを使用してストリームを取り込む (基本版)
AlivcLivePusherは、iOS用のPush SDKのコアクラスです。 このクラスは、カメラプレビュー、ストリーム取り込みコールバック、およびストリーム取り込み管理のパラメーターを提供します。 このクラスを使用して、ストリームの取り込み中にパラメーターを変更することもできます。 このセクションでは、ストリーム取り込みのキーメソッドの使用方法について説明します。
AlivcLivePusherクラスを初期化します。
ストリーム取り込みパラメーターを設定した後、initWithConfigメソッドを呼び出してクラスを初期化します。 サンプルコード:
self.livePusher = [[AlivcLivePusher alloc] initWithConfig:config];
説明AlivcLivePusherクラスは複数のインスタンスをサポートしていません。 したがって、initWithConfigメソッドの呼び出しごとにdestroyメソッドを1回呼び出す必要があります。
ストリーム取り込みコールバックを登録します。
次のストリーム取り込みコールバックがサポートされています。
Info: 通知とステータス検出に使用されるコールバック。
エラー: エラーが発生したときに返されるコールバック。
ネットワーク: ネットワークに関連するコールバック。
delegateメソッドを使用して、指定されたコールバックを受け取ることができます。 サンプルコード:
[self.livePusher setInfoDelegate:self]; [self.livePusher setErrorDelegate:self]; [self.livePusher setNetworkDelegate:self];
プレビューを開始します。
livePusherオブジェクトを初期化した後、プレビューを開始できます。 UIViewクラスでビューインスタンスを作成するか、UIViewから継承するクラスを使用してプレビューを開始します。 サンプルコード:
[self.livePusher startPreview:self.view];
ストリームの取り込みを開始します。
プレビューが成功した後にのみ、ストリームの取り込みを開始できます。 したがって、AlivcLivePusherInfoDelegateのonPreviewStartedコールバックを指定するには、次のコードを追加する必要があります。
[self.livePusher startPushWithURL:@"Ingest URL for testing (rtmp://......)"];
説明Push SDK for iOSを使用すると、startPushWithURLAsyncを呼び出して、非同期でストリームの取り込みを開始できます。
Push SDK for iOSは、RTMP形式とRTS形式の取り込みURLをサポートしています。 RTMPフォーマットの取り込みURLと比較して、RTSフォーマットの取り込みURLは、改善された安定性を提供し、劣悪なネットワーク条件でより良好に動作する。 取り込みURLをRTS形式で使用することを推奨します。 RTMP形式とRTS形式の取り込みURLの比較、およびRTS経由でストリームを取り込む方法の詳細については、「プッシュSDKを使用してRTS経由でストリームを取り込む」をご参照ください。
有効な取り込みURLを使用してストリームの取り込みを開始した後、ApsaraVideo player、FFplay、VLCなどのプレーヤーを使用してストリームのプルをテストできます。 ストリーミングURLの取得方法については、「取り込みURLとストリーミングURLの生成」をご参照ください。
SDKは、バックグラウンドモードの組み込み設定を提供します。 アプリをバックグラウンドに切り替えると、ビデオは最後のフレームで一時停止されます。 アプリはバックグラウンドでオーディオを再生し続けます。 Xcodeでプロジェクトを開きます。 [署名と機能] タブで、[バックグラウンドモード] セクションの [オーディオ] 、[AirPlay] 、[ピクチャインピクチャ] を選択します。 これにより、アプリをバックグラウンドに切り替えたときに音声を収集できます。 詳細については、「アプリをバックグラウンドに切り替えるか、電話に応答する」をご参照ください。
他のストリーム取り込み設定を完了します。
Push SDK for iOSを使用すると、ストリームの取り込みを管理できます。 たとえば、ストリーム取り込みの開始、停止、再起動、一時停止、再開、ストリーム取り込みインスタンスのプレビューの停止、および破棄ができます。 これらの操作を実行するボタンを追加できます。 サンプルコード:
/* Call the pause method to switch from camera ingest to image ingest after you configure the pauseImage parameter. The audio stream continues to be ingested. */ [self.livePusher pause]; /* Switch from image ingest to camera ingest. The audio stream continues to be ingested. */ [self.livePusher resume]; /* Stop a stream that is being ingested. */ [self.livePusher stopPush]; /* Stop preview. However, this operation does not take effect for a stream that is being ingested. When preview is stopped, the preview window is frozen at the last frame. */ [self.livePusher stopPreview]; /* Restart stream ingest when the stream is being ingested or when an error callback is received. If an error occurs, you can use only this method or the reconnectPushAsync method to restart stream ingest. You can also call the destroy method to destroy the stream ingest instance. Then, you can restart all ALivcLivePusher resources that are required for operations, such as preview and stream ingest. */ [self.livePusher restartPush]; /* Call this method when the stream is being ingested or when an error callback related to AlivcLivePusherNetworkDelegate is received. If an error occurs, you can use only this method or the restartPush method to restart stream ingest. You can also call the destroy method to destroy the stream ingest instance. Then, you can restart stream ingest over RTMP. */ [self.livePusher reconnectPushAsync]; /* Destroy the stream ingest instance. After you call this method, stream ingest and preview are stopped, and the preview window is removed. All resources related to AlivcLivePusher are destroyed. */ [self.livePusher destory]; self.livePusher = nil; /* Query the status of stream ingest. */ AlivcLivePushStatus status = [self.livePusher getLiveStatus];
レタッチ効果のレベルをリアルタイムで調整します。
Push SDK for iOSを使用すると、ストリームの取り込み中にレタッチ効果のレベルをリアルタイムで調整できます。 レタッチ機能を有効にし、ビジネス要件に基づいてレタッチ機能のパラメーターを設定できます。 この機能はQueen 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];
バックグラウンドミュージックを管理します。
iOS用プッシュSDKを使用すると、バックグラウンドミュージックを管理できます。 たとえば、バックグラウンドミュージックの再生、オーディオミキシング、ノイズリダクション、インイヤーモニタリング、ミュートなどの機能を設定できます。 関連するメソッドは、プレビューの開始後にのみ呼び出すことができます。 サンプルコード:
/* Start the playback of background music. */ [self.livePusher startBGMWithMusicPathAsync:musicPath]; /* Stop the playback of background music. If you want to change the background music, call the method that is used to start the playback of background music. You do not need to stop the playback of the current background music. */ [self.livePusher stopBGMAsync]; /* Pause the playback of background music. You can call this method only after the playback of background music starts. */ [self.livePusher pauseBGM]; /* Resume the playback of background music. You can call this method only after the playback of background music is paused. */ [self.livePusher resumeBGM]; /* Enable looping. */ [self.livePusher setBGMLoop:true]; /* Configure noise reduction. If you enable noise reduction, the system filters out non-vocal parts from the collected audio. This feature may slightly reduce the volume of the human voice. We recommend that you allow your users to determine whether to enable this feature. By default, this feature is disabled. */ [self.livePusher setAudioDenoise:true]; /* Configure in-ear monitoring. In-ear monitoring is suitable for scenarios that involve karaoke. If you enable in-ear monitoring, you can hear your voice on your earphones during streaming. If you disable in-ear monitoring, you cannot hear your voice on your earphones during streaming. This feature does not take effect if no earphones are detected. */ [self.livePusher setBGMEarsBack:true]; /* Configure audio mixing. You can adjust the volumes of the background music and human voice. */ [self.livePusher setBGMVolume:50]; // Specify the volume of the background music. [self.livePusher setCaptureVolume:50]; // Specify the volume of the human voice. /* Configure muting. If you enable this feature, the background music and human voice are muted. To separately mute the background music or human voice, call the method that is used to configure audio mixing. */ [self.livePusher setMute:isMute?true:false];
ストリーム取り込みスナップショットを設定します。
Push SDK for iOSを使用すると、ローカルビデオストリームのスナップショットをキャプチャできます。 サンプルコード:
/* Configure the callback for snapshot capture. */ [self.livePushersetSnapshotDelegate:self]; /* Call the snapshot method. */ [self.livePushersnapshot:1interval:1];
カメラ関連の操作を実行します。
カメラ関連の操作は、ストリーミング、一時停止、または再接続の状態でプレビューを開始した後にのみ実行できます。 たとえば、フロントカメラとリアカメラを切り替えて、フラッシュ、焦点距離、ズーム、ミラーリングモードを設定できます。 プレビューを開始しない場合、以下の方法は無効です。 サンプルコード:
/* Switch between the front and rear cameras. */ [self.livePusher switchCamera]; /* Enable or disable flash. You cannot enable flash for the front camera. */ [self.livePusher setFlash:false]; /* Adjust the focal length to zoom in or out. If you set the value to a positive number, the system increases the focal length. If you set the value to a negative number, the system decreases the focal length. */ CGFloat max = [_livePusher getMaxZoom]; [self.livePusher setZoom:MIN(1.0, max)]; /* Configure manual focus. To configure manual focus, you must set the following parameters: point and autoFocus. The point parameter specifies the coordinates of the focus point. The autoFocus parameter specifies whether to enable autofocus. The autoFocus parameter takes effect only for this call. Whether autofocus is enabled otherwise depends on the setAutoFocus method. */ [self.livePusher focusCameraAtAdjustedPoint:CGPointMake(50, 50) autoFocus:true]; /* Configure autofocus. */ [self.livePusher setAutoFocus:false]; /* Configure the mirroring mode. The methods for mirroring are PushMirror and PreviewMirror. The PushMirror method is used to enable the mirroring mode for stream ingest. The PreviewMirror method is used to enable the mirroring mode for preview. PushMirror takes effect only for stream playback, and PreviewMirror takes effect only for preview. */ [self.livePusher setPushMirror:false]; [self.livePusher setPreviewMirror:false];
ライブクイズ機能を有効にします。
ライブクイズ機能を有効にするには、補足拡張情報 (SEI) をライブストリームに挿入し、プレーヤーを使用してSEIを解析する必要があります。 Push SDK for iOSは、SEIを挿入する方法を提供します。 このメソッドは、ストリームの取り込み中にのみ呼び出すことができます。 サンプルコード:
/* sendMessage: Specify the SEI message to be inserted into the live stream. The SEI message is in the JSON format. ApsaraVideo Player SDK can receive and parse the SEI message. repeatCount: Specify the number of frames into which the SEI message is inserted. To ensure that the SEI message is not dropped for a frame, you must specify the number of repetitions. For example, a value of 100 indicates that the SEI message is inserted into the subsequent 100 frames. ApsaraVideo Player SDK removes duplicate SEI messages. delayTime: Specify the period of time to wait before the frames are sent. Unit: milliseconds. KeyFrameOnly: Specify whether to send only keyframes. */ [self.livePusher sendMessage:@"Information about questions" repeatCount:100 delayTime:0 KeyFrameOnly:false];
外部オーディオおよびビデオソースを設定します。
Push SDK for iOSを使用すると、ストリーム取り込み用の外部オーディオおよびビデオソースをインポートできます。 たとえば、オーディオまたはビデオファイルを取り込むことができます。
ストリーム取り込み設定で外部オーディオおよびビデオソースの入力を設定します。
サンプルコード:
config.externMainStream = true;// Enable the input of external streams. config.externVideoFormat = AlivcLivePushVideoFormatYUVNV21; // Specify the color format for video data. In this example, the color format is YUVNV21. You can also use other formats based on your business requirements. config.externAudioFormat = AlivcLivePushAudioFormatS16;// Specify the bit depth format for audio data. In this example, the bit depth format is S16. You can also use other formats based on your business requirements.
外部ビデオデータをインポートします。
サンプルコード:
/* The sendVideoData method supports only native YUV and RGB buffer data. You can use the sendVideoData method to transmit video data such as the buffer, length, width, height, timestamp, and rotation angle. */ [self.livePusher sendVideoData:yuvData width:720 height:1280 size:dataSize pts:nowTime rotation:0]; /* For CMSampleBufferRef video data, you can use the sendVideoSampleBuffer method. */ [self.livePusher sendVideoSampleBuffer:sampleBuffer] /* You can also convert CMSampleBufferRef video data to native buffer before you use the sendVideoData method. The following sample code provides an example on how to convert video data. */ // Query the length of sample buffer. - (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; } // Convert video sample buffer to native buffer. - (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; }
外部オーディオデータをインポートします。
サンプルコード:
/* The sendPCMData method supports only native PCM buffer data. You can use this method to transmit audio data such as the buffer, length, and timestamp. */ [self.livePusher sendPCMData:pcmData size:size pts:nowTime];
アニメーションステッカーを管理します。
Push SDK for iOSを使用すると、ライブストリームにアニメーションステッカーを追加できます。 アニメーションステッカーは透かしとして使用できます。
アニメーションステッカーを作成するには、デモで提供されているマテリアルを使用および変更できます。 アニメーションステッカーのシーケンスフレーム画像を作成します。 config.jsonファイルで次のパラメーターを設定します。
"du": 2.04,// Specify the duration for which each time the animated sticker is played. "n": "qizi",// Specify the name of the animated sticker. Make sure that the name of the folder in which the animated sticker is stored is the same as the name of the sticker, and the name of each frame ends with a sequence number. Example: qizi0. "c": 68.0,// Specify the number of frames, which is the number of images included in an animated sticker. "kerneframe": 51,// Specify an image as the keyframe. For example, specify the 51st frame as the keyframe in the demo. Make sure that the specified frame exists. "frameArry": [ {"time":0,"pic":0}, {"time":0.03,"pic":1}, {"time":0.06,"pic":2}, ], // Configure the parameters of the animated sticker. In the preceding settings, "time":0,"pic":0 indicates that the first frame qizi0 is displayed 0 seconds after the animated sticker is played. "time":0.03,"pic":1 indicates that the second frame qizi1 is displayed 0.03 seconds after the animated sticker is played. Configure all frames in the animated sticker in the same manner.
説明他のパラメーターについては、デモで提供されているconfig.jsonファイルの値を保持できます。
アニメーションステッカーを追加します。
サンプルコード:
/** * Add an animated sticker. * @param path Specify the path of the animated sticker. The path must include the config.json file. * @param x Specify the starting position on the x-axis. Valid values: 0 to 1.0f. * @param y Specify the starting position on the y-axis. Valid values: 0 to 1.0f. * @param w Specify the width. Valid values: 0 to 1.0f. * @param h Specify the height. Valid values: 0 to 1.0f. * @return id Specify the ID of the sticker. You must specify the ID of a sticker if you want to remove the sticker. */ [self.livePusher addDynamicWaterMarkImageDataWithPath: "Path of the sticker" x:0.2f y:0.2f w:0.2f h:0.2f];
アニメーションステッカーを削除します。
サンプルコード:
[self.livePusher removeDynamicWaterMark:id];
デバッグツールを設定します。
DebugViewは、問題を診断できるUIデバッグツールです。 DebugViewには、ドラッグ可能なウィンドウがあり、デバッグのために常にビューの上部に表示されます。 DebugViewを使用して、ストリーム取り込みのログを照会し、リアルタイムでストリーム取り込みパフォーマンスのメトリクスを監視し、主要なパフォーマンスメトリクスの折れ線グラフを生成できます。
説明アプリのリリースバージョンでは、DebugViewを呼び出すために使用されるメソッドを呼び出さないでください。
サンプルコード:
[AlivcLivePusher showDebugView]; // Open DebugView.
他のメソッドを呼び出します。
/* In custom mode, you can change the minimum bitrate and target bitrate in real time. */ [self.livePusher setTargetVideoBitrate:800]; [self.livePusher setMinVideoBitrate:200] /* Query whether the stream is being ingested. */ BOOL isPushing = [self.livePusher isPushing]; /* Query the ingest URL. */ NSString *pushURLString = [self.livePusher getPushURL]; /* Query the stream ingest performance debugging information. For more information about the parameters of stream ingest performance, see the API references or comments in the code. */ AlivcLivePushStatsInfo *info = [self.livePusher getLivePushStatusInfo]; /* Query the SDK version number. */ NSString *sdkVersion = [self.livePusher getSDKVersion]; /* Specify the log level to filter debugging information. */ [self.livePusher setLogLevel:(AlivcLivePushLogLevelDebug)];
画面録画用のストリーム取り込みの設定 (基本版)
ReplayKitはiOS 9によって導入されたフレームワークで、画面を記録できます。 iOS 10では、ReplayKitを使用すると、サードパーティのアプリ拡張機能を使用して画面録画をストリーミングできます。 iOS 10以降では、アプリ拡張機能と一緒にPush SDK for iOSを使用して画面録画をストリーミングできます。
システムの安定性を確保するために、iOSは画面録画をキャプチャするアプリ拡張機能のリソースを少なくします。 アプリ拡張機能が過剰なメモリ量を占有している場合、アプリ拡張機能は終了して終了します。 アプリ拡張機能のメモリ制限に対処するために、Push SDK for iOSは、拡張アプリとホストアプリに記録プロセスを指定します。 拡張アプリは、画面録画をキャプチャし、キャプチャしたコンテンツをプロセス間通信を使用してホストアプリに送信するために使用されます。 ホストアプリを使用してAlivcLivePusherオブジェクトを作成し、画面の録画をクライアントにプッシュします。 ストリーム取り込みのプロセス全体がホストアプリで完了します。 ホストアプリでオーディオの収集と収集したオーディオの送信を設定することもできます。 拡張アプリは、画面録画のキャプチャにのみ使用されます。
Push SDK for iOSのデモでは、拡張アプリとホストアプリ間のプロセス間通信がアプリグループを使用して有効になっています。 ロジックのこの部分は、AlivcLibReplayKitExt.framework
にカプセル化されています。
iOSで画面録画をストリーミングするには、システムは画面録画をキャプチャする拡張アプリを作成します。 次の手順は、iOSで画面録画をストリーミングする方法を示しています。
アプリグループを作成します。
最初に Apple Developerポータルを使用して、次の操作を実行します。
[証明書、識別子、プロファイル] ページで、アプリグループを登録します。 詳細については、次をご参照ください: アプリグループの登録
[識別子] ページで、[アプリID] をクリックし、アプリIDを選択します。 アプリIDをクリックして、アプリグループを有効にします。 ホストアプリと拡張アプリの両方のアプリIDに対して、上記の操作を実行する必要があります。 詳細については、次をご参照ください: アプリ機能の有効化
再生成されたプロビジョニングプロファイルをダウンロードし、Xcodeでプロビジョニングプロファイルを再構成します。
これにより、拡張アプリはホストアプリと通信できます。
説明アプリグループを作成した後、アプリグループ識別子の値を保存する必要があります。 この値は、後続のステップで使用されます。
拡張アプリを作成します。
デモでは、Push SDK for iOSは、画面録画をストリーミングするためのAlivcLiveBroadcastおよびAlivcLiveBroadcastSetupUIアプリ拡張機能を提供しています。 アプリで拡張アプリを作成するには、次の手順を実行します。
現在のプロジェクトで を選択します。 次に、次の図に示すように、[ブロードキャストアップロード拡張機能] をクリックします。
次の図に示すように、[プロダクト名] パラメーターを設定し、[UI拡張機能を含める] を選択し、[完了] をクリックします。その後、ライブストリーミング拡張機能とライブストリーミングUIが作成されます。
Info.plist拡張子を設定します。 デフォルトでは、次の図に示すように、Xcodeは作成したターゲットにヘッダーファイルとSampleHandlerという名前のソースファイルを作成します。
AlivcLibReplayKitExt.framework
をプロジェクトにドラッグします。 このように、ターゲット拡張はAlivcLibReplayKitExt.frameworkに依存します。 SampleHandler.mのコードを次のコードに置き換えます。 コード内のkAPPGroupを、前の手順で作成したアプリグループ識別子に置き換える必要があります。 サンプルコード:#import "SampleHandler.h" #import <AlivcLibReplayKitExt/AlivcLibReplayKitExt.h> @implementation SampleHandler - (void)broadcastStartedWithSetupInfo:(NSDictionary<NSString *,NSObject *> *)setupInfo { //User has requested to start the broadcast. Setup info from the UI extension can be supplied but optional. [[AlivcReplayKitExt sharedInstance] setAppGroup:kAPPGROUP]; } - (void)processSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType { if (sampleBufferType != RPSampleBufferTypeAudioMic) { // The audio is collected and sent by the host app. [[AlivcReplayKitExt sharedInstance] sendSampleBuffer:sampleBuffer withType:sampleBufferType]; } } - (void)broadcastFinished { [[AlivcReplayKitExt sharedInstance] finishBroadcast]; } @end
ブロードキャストアップロード拡張機能のターゲットはプロジェクトで作成され、
AlivcLibReplayKitExt.framework
は画面録画拡張機能用にカスタマイズされます。Push SDK for iOSをホストアプリに統合します。
ホストアプリでAlivcLivePushConfigオブジェクトとAlivcLivePusherオブジェクトを作成します。 externMainStreamパラメーターをtrueに設定します。 audioFromExternalパラメーターをfalseに設定します。これは、オーディオコレクションがSDKで処理され続けることを指定します。 拡張アプリから画面記録データを受信するには、startScreenCaptureメソッドを呼び出します。 次に、ストリームの取り込みを開始または停止します。 次の操作を実行して、Push SDK for iOSをホストアプリに統合します。
AlivcLivePusher.framework、AlivcLibRtmp.framework、RtsSDK.framework、およびAlivcLibReplayKitExt.frameworkの依存関係をホストアプリに追加します。
iOS用のプッシュSDKを初期化し、ストリーム取り込み用の外部ビデオソースを設定します。
externMainStreamパラメーターをtrueに、externVideoFormatパラメーターをAlivcLivePushVideoFormatYUV420Pに、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];
AlivcLivePusherクラスの次のメソッドを呼び出して、ライブストリーミング機能を使用します。
画面録画データを受信します。
コード内の
kAPPGroup
を、前の手順で作成したアプリグループ識別子
に置き換えます。 サンプルコード:[self.livePusher startScreenCapture:kAPPGROUP];
ストリーム取り込みを開始します。
サンプルコード:
[self.livePusher startPushWithURL:self.pushUrl]
ストリームの取り込みを停止します。
サンプルコード:
[self.livePusher stopPush]; [self.livePusher destory]; self.livePusher = nil;
コストリーミング設定の構成 (インタラクティブエディション)
Push SDK V4.4.4以降のインタラクティブエディションは、RTCベースのコストリーミング機能を提供します。 Push SDK V4.4.5以降のインタラクティブエディションは、RTCベースのバトル機能を提供します。 ストリーマーとビューアは、Push SDKのインタラクティブエディションを使用することで、300ミリ秒未満の超低レイテンシで相互作用できます。 インタラクティブストリーミングの詳細については、「共同ストリーミングの開発者ガイド」および「バトルの開発者ガイド」をご参照ください。
使用上の注意
パッケージサイズ: SDKの統合後、IPAパッケージのサイズは約3 MB増加します。
互換性のある携帯電話:
iPhone 7以降、iOS 8.0以降のバージョン。