このトピックでは、iOS 向け Push SDK のインターフェースと基本的なワークフロー、および主な機能の使用例を紹介します。
機能
RTMP (Real-Time Messaging Protocol) によるストリーム取り込みをサポートします。
リアルタイム通信 (RTC) に基づくリアルタイムストリーミング (RTS) プロトコルを介したストリームの取り込みとストリームのプルをサポートします。
共同ストリーミングと戦闘をサポートします。
ビデオエンコーディングにH.264、オーディオエンコーディングにAdvanced Audio Coding (AAC) を採用。
ビットレート制御、解像度、表示モードなどの機能のカスタム設定をサポートします。
さまざまなカメラ操作をサポートします。
リアルタイムのレタッチをサポートし、レタッチ効果を調整できます。
アニメーションステッカーをアニメーション透かしとして追加し、アニメーションステッカーを削除できます。
画面録画をストリーミングできます。
YUVやパルス符号変調 (PCM) など、さまざまな形式の外部オーディオおよびビデオ入力をサポートします。
複数のストリームの混合をサポートします。
オーディオのみとビデオのみのストリームの取り込みと、バックグラウンドでのストリーム取り込みをサポートします。
バックグラウンドミュージックをサポートし、バックグラウンドミュージックを管理できます。
ビデオスナップショットのキャプチャをサポートします。
自動再接続とエラー処理をサポートします。
オーディオ3Aアルゴリズムをサポートします。
ビデオファイルのソフトウェアとハードウェアのエンコードモードを切り替えることができます。 これは、符号化モジュールの安定性を改善します。
制限事項
iOS用プッシュSDKを使用する前に、次の制限事項に注意してください。
ストリームの取り込み前に画面の向きを設定する必要があります。 ライブストリーミング中は画面を回転できません。
ランドスケープモードでのストリーム取り込みの自動画面回転を無効にする必要があります。
ハードウェア符号化モードでは、出力解像度の値は、エンコーダと互換性があるように16の倍数でなければならない。 たとえば、解像度を540pに設定すると、出力解像度は544 × 960になります。 黒いバーを防ぐために、出力解像度に基づいてプレーヤーの画面サイズをスケーリングする必要があります。
API リファレンス
ワークフロー
基本的なワークフローは次のとおりです。
機能の使用
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 です。キーフレーム間隔が大きいほどレイテンシーが大きくなります。値は 1 または 2 を推奨します。
config.connectRetryInterval = 2000; // 再接続間隔 (ミリ秒) です。デフォルトは 2000 ms (2s) です。間隔は 1s 以上である必要があります。デフォルト値の使用を推奨します。
config.previewMirror = false; // デフォルト値は false です。通常は false にしてください。
config.orientation = AlivcLivePushOrientationPortrait; // デフォルトの向きは縦向きです。ホームボタンが左または右にある横向きに設定できます。モバイルデバイスのパフォーマンスとネットワーク帯域幅を考慮すると、解像度は 540p に設定することを推奨します。主流のライブストリーミングアプリのほとんどは 540p を使用しています。
ビットレート制御を無効にすると、ビットレートは初期ビットレートに固定され、設定したターゲットビットレートと最小ビットレートの間で適応しません。ネットワークが不安定な状況では再生の途切れが発生する可能性があります。この設定は注意して使用してください。
カメラストリームのインジェスト
SDK を初期化します。
インジェストパラメーターを設定した後、initWithConfig メソッドを呼び出して SDK を初期化します。サンプルコード:
self.livePusher = [[AlivcLivePusher alloc] initWithConfig:config];説明AlivcLivePusherは複数インスタンスをサポートしていません。そのため、各init呼び出しに対して、対応するdestroy呼び出しを行う必要があります。インジェストのコールバックを登録します。
次のストリーム取り込みコールバックがサポートされています。
Info: 通知とステータス検出に使用されるコールバック。
エラー: エラーが発生したときに返されるコールバック。
ネットワーク: ネットワークに関連するコールバック。
デリゲートを登録して、対応するコールバックを受信します。サンプルコード:
[self.livePusher setInfoDelegate:self]; [self.livePusher setErrorDelegate:self]; [self.livePusher setNetworkDelegate:self];プレビューを開始します。
livePusher オブジェクトを初期化した後、プレビューを開始できます。カメラプレビュー用に、UIView のサブクラスである表示ビューを渡す必要があります。サンプルコード:
[self.livePusher startPreview:self.view];インジェストを開始します。
プレビューが成功した後にのみ、インジェストを開始できます。これを行うには、
AlivcLivePusherInfoDelegateのonPreviewStartedコールバックをリッスンし、コールバック内に次のコードを追加します。[self.livePusher startPushWithURL:@"Test ingest URL (rtmp://......)"];説明インジェスト URL は、RTMP および RTS (artc://) プロトコルをサポートしています。URL の取得方法については、「インジェスト URL とストリーミング URL の生成」をご参照ください。
ApsaraVideo Live では、同じ URL へ複数のストリームを同時にインジェストすることはできません。2 つ目のインジェスト リクエストは拒否されます。
カメラ操作
カメラ関連のメソッドは、プレビュー開始後 (インジェスト中、一時停止中、または再接続中など) にのみ呼び出すことができます。これらのメソッドを使用すると、カメラの切り替え、フラッシュの制御、フォーカス 調整、ズーム、ミラーリングの設定を行えます。プレビュー開始前にこれらのメソッドを呼び出しても効果はありません。
/* フロントカメラとリアカメラを切り替えます。 */
[self.livePusher switchCamera];
/* フラッシュをオンまたはオフにします。フロントカメラではフラッシュを使用できません。 */
[self.livePusher setFlash:false];
/* 焦点距離を調整して、キャプチャした画像をズームします。正の値で拡大し、負の値で縮小します。 */
CGFloat max = [_livePusher getMaxZoom];
[self.livePusher setZoom:MIN(1.0, max)];
/* フォーカスを手動で設定します。次の 2 つのパラメーターを渡す必要があります:1. point:フォーカスポイントの座標。2. autoFocus:この操作に対してオートフォーカスを有効にするかどうか。以降のオートフォーカスの動作は、前回設定した値に従います。 */
[self.livePusher focusCameraAtAdjustedPoint:CGPointMake(50, 50) autoFocus:true];
/* オートフォーカスを有効または無効にします。 */
[self.livePusher setAutoFocus:false];
/* ミラーリングを設定します。ミラーリングのインターフェイスは 2 つあります。インジェスト ストリーム用の PushMirror と、プレビュー用の PreviewMirror です。PushMirror は再生表示にのみ影響し、PreviewMirror はプレビュー表示にのみ影響します。両者は独立しています。 */
[self.livePusher setPushMirror:false];
[self.livePusher setPreviewMirror:false];インジェスト操作
インジェスト操作には、開始、停止、一時停止、再開、再起動、および破棄があります。アプリケーションの要件に基づいて、これらの操作をトリガーするボタンを UI に追加できます。サンプルコード:
/* pauseImage を設定してから pause を呼び出し、カメラ配信から静止画配信に切り替えます。オーディオのインジェストは継続されます。 */
[self.livePusher pause];
/* 静止画配信からカメラ配信に戻します。オーディオのインジェストは継続されます。 */
[self.livePusher resume];
/* 現在のインジェストを停止します。これは、ストリームがアクティブな場合にのみ呼び出すことができます。 */
[self.livePusher stopPush];
/* プレビューを停止します。これはプレビュー 状態のときにのみ呼び出すことができ、アクティブなインジェスト中には呼び出せません。停止後、プレビュー表示は最後のフレームでフリーズします。 */
[self.livePusher stopPreview];
/* ストリームを再起動します。これは、アクティブなストリームのインジェスト中、またはエラー状態で呼び出すことができます。エラー状態の場合、呼び出せるのはこのメソッド、reconnectPushAsync、または destroy のみです。この操作により、プレビューとインジェストを含む、内部の AlivcLivePusher リソースがすべて再起動されます。 */
[self.livePusher restartPush];
/* ストリームを非同期に再接続します。これは、アクティブなストリーム中、または AlivcLivePusherNetworkDelegate からのネットワーク関連エラー状態で呼び出すことができます。エラー状態の場合、restartPush または destroy も呼び出せます。この操作は、RTMP 接続の再確立を試みます。 */
[self.livePusher reconnectPushAsync];
/* インジェストインスタンスを破棄します。これにより、インジェストとプレビューが停止し、プレビュー表示が削除されます。AlivcLivePusher に関連するすべてのリソースが解放されます。 */
[self.livePusher destroy];
self.livePusher = nil;
/* 現在のインジェストステータスを取得します。 */
AlivcLivePushStatus status = [self.livePusher getLiveStatus];画面共有インジェスト
iOS 9 で導入された ReplayKit は、画面収録をサポートしています。iOS 10 では、ReplayKit を使用して、サードパーティの App 拡張機能を通じて画面コンテンツをライブブロードキャストできるようになりました。iOS 10 以降では、Push SDK と App 拡張機能を使用して、ライブ画面ブロードキャストを実装できます。
システムのパフォーマンスを確保するため、iOS は画面収録機能拡張に限定されたリソースを割り当てます。拡張機能が過剰なメモリを使用すると、システムはそれを終了させます。このメモリ制限を回避するため、Push SDK は画面共有プロセスを拡張アプリとホストアプリに分割します。拡張アプリは画面コンテンツをキャプチャし、プロセス間通信を介してホストアプリに送信します。ホストアプリは AlivcLivePusher エンジンを作成し、画面データをサーバーにインジェストします。ストリームインジェストプロセス全体がホストアプリで処理されるため、マイクのキャプチャと送信もホストアプリで管理でき、拡張アプリは画面キャプチャのみを担当します。
Push SDK デモでは、拡張アプリとホストアプリ間のプロセス間通信に App Group を使用します。このロジックは、AlivcLibReplayKitExt.framework にカプセル化されています。
iOS で画面共有を実装するには、画面収録機能拡張を作成する必要があります。システムは、キャプチャされた画面イメージを受信するために、必要に応じてこの拡張機能をインスタンス化します。
App Group の作成
Apple Developer にログインし、次の手順を実行します。
[Certificates, IDs & Profiles] ページで、App Group を登録します。詳細については、「Register an App Group」をご参照ください。
[Identifier] ページに戻り、[App IDs] を選択し、App ID をクリックして App Group 機能を有効にします。ホストアプリと拡張アプリの両方の App ID に対して同じ設定を実行する必要があります。詳細については、「Enable App Group」をご参照ください。
設定が完了したら、更新されたプロビジョニングプロファイルをダウンロードし、Xcode にインストールします。
これらの手順が正しく実行されると、拡張アプリとホストアプリは相互に通信できるようになります。
説明App Group を作成した後、App Group 識別子を控えておいてください。後の手順で必要になります。
画面収録機能拡張の作成
iOS 向け Push SDK デモには、画面共有用の AlivcLiveBroadcast および AlivcLiveBroadcastSetupUI 拡張機能が含まれています。アプリで画面収録機能拡張を作成するには、次の手順に従います。
既存のプロジェクトで、[New] > [Target…] を選択し、[Broadcast Upload Extension] を選択します。
[Product Name] を変更し、[Include UI Extension] チェックボックスにチェックを入れ、[Finish] をクリックしてブロードキャストおよび UI 拡張機能を作成します。たとえば、[Product Name] を
AlivcLiveBroadcastに設定します。ブロードキャスト拡張機能の Info.plist ファイルを設定します。新しいターゲットでは、Xcode は SampleHandler という名前のヘッダーファイルとソースファイルを自動的に作成します。このターゲットディレクトリの名前は AlivcLiveBroadcast です。
AlivcLibReplayKitExt.frameworkをプロジェクトにドラッグし、拡張機能ターゲットの依存関係としてリンクします。
SampleHandler.m内のコードを次のコードに置き換えます。コード内のkAPPGROUPを、ステップ 1 で作成した App Group 識別子に置き換える必要があります。サンプルコード:#import "SampleHandler.h" #import <AlivcLibReplayKitExt/AlivcLibReplayKitExt.h> @implementation SampleHandler - (void)broadcastStartedWithSetupInfo:(NSDictionary<NSString *,NSObject *> *)setupInfo { // ユーザーがブロードキャストの開始をリクエストしました。UI拡張機能からのセットアップ情報は任意で提供可能です。 [[AlivcReplayKitExt sharedInstance] setAppGroup:kAPPGROUP]; } - (void)processSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType { if (sampleBufferType != RPSampleBufferTypeAudioMic) { // オーディオはホストアプリによってキャプチャおよび送信されます。 [[AlivcReplayKitExt sharedInstance] sendSampleBuffer:sampleBuffer withType:sampleBufferType]; } } - (void)broadcastFinished { [[AlivcReplayKitExt sharedInstance] finishBroadcast]; } @end
プロジェクトでブロードキャストアップロード機能拡張のターゲットを作成し、そのターゲットに、画面収録機能拡張モジュール用にカスタマイズされた
AlivcLibReplayKitExt.frameworkを統合します。ライブ SDK のホストアプリへの統合
ホストアプリで、
AlivcLivePushConfigオブジェクトとAlivcLivePusherオブジェクトを作成します。ExternMainStreamをtrueに、AudioFromExternalをfalseに設定します。この設定では、オーディオは引き続き SDK によってキャプチャされます。startScreenCaptureを呼び出して拡張アプリから画面データの受信を開始し、その後ストリームインジェストを開始および停止します。次の具体的な手順に従います。ホストアプリプロセスに、AlivcLivePusher.framework、AlivcLibRtmp.framework、RtsSDK.framework、および AlivcLibReplayKitExt.framework に依存関係を追加します。
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];AlivcLivePusher の次のメソッドを呼び出して、ライブストリーミング機能を管理します。
画面収録データの受信開始
コード内の
kAPPGROUPを、ステップ 1 で作成したApp Group 識別子に置き換える必要があります。サンプルコード:[self.livePusher startScreenCapture:kAPPGROUP];ストリームインジェストの開始
サンプルコード:
[self.livePusher startPushWithURL:self.pushUrl]ストリームインジェストの停止
サンプルコード:
[self.livePusher stopPush]; [self.livePusher destroy]; self.livePusher = nil;
プレビュー表示モード
プッシュ SDK は 3 つのプレビューモードをサポートしています。プレビュー表示モードは、インジェストストリームには影響しません。
ALIVC_LIVE_PUSHER_PREVIEW_SCALE_FILL: プレビューがウィンドウを埋めます。ビデオとウィンドウのアスペクト比が異なる場合、プレビューが歪みます。ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FIT: (デフォルト) プレビューがビデオのアスペクト比を維持します。ビデオとウィンドウのアスペクト比が異なる場合、プレビューに黒帯が表示されます。ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FILL: プレビューがウィンドウのアスペクト比に合わせてビデオをクロップします。ビデオとウィンドウのアスペクト比が異なる場合、ビデオがクロップされます。サンプルコード:
mAlivcLivePushConfig.setPreviewDisplayMode(AlivcPreviewDisplayMode.ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FIT);AlivcLivePushConfigでモードを設定するか、プレビューまたはストリームインジェスト中にsetPreviewDisplayModeAPI で動的に設定できます。この設定はプレビューにのみ影響します。インジェストされたビデオストリームの解像度は
AlivcLivePushConfigによって決定され、プレビューモードの影響を受けません。プレビュー表示モードは、さまざまなスマートフォンの画面サイズに適応し、最適なプレビュー効果を選択できるように設計されています。
画像インジェスト
SDK は、アプリがバックグラウンドにある場合やビットレートが低すぎる場合に、静的画像をインジェストできます。アプリがバックグラウンドにある場合、ビデオインジェストはデフォルトで一時停止され、オーディオのみがインジェストされます。このとき、インジェストする画像を設定できます。たとえば、ホストはまもなく戻ります のようなメッセージを含む画像を表示できます。サンプルコード:
config.pauseImg = [UIImage imageNamed:@"image.png"];// バックグラウンドでのインジェスト用画像を設定します。さらに、ネットワーク状態が悪い場合にインジェストする静的画像を設定できます。画像を設定すると、SDK は現在のビットレートが低いことを検出し、ビデオのスタッターを回避するためにこの画像をインジェストします。サンプルコード:
config.networkPoorImg = [UIImage imageNamed:@"image.png"];// ネットワーク状態が悪い場合にインジェストする画像を設定します。外部音声・映像のインジェスト
Push SDK は、音声ファイルや映像ファイルなどの外部ソースからの音声・映像のインジェストをサポートしています。
アップストリーミング設定で、外部の音声・映像入力を設定します。
外部映像データを挿入します。
音声データを挿入します。
サンプルコード:
config.externMainStream = true;// 外部ストリーム入力を有効にします。
config.externVideoFormat = AlivcLivePushVideoFormatYUVNV21;// 映像データのカラーフォーマットを設定します。この例では YUVNV21 に設定していますが、必要に応じて他のフォーマットにも設定できます。
config.externAudioFormat = AlivcLivePushAudioFormatS16;// 音声データのビット深度フォーマットを設定します。この例では S16 に設定していますが、必要に応じて他のフォーマットにも設定できます。サンプルコード:
/* sendVideoData インターフェイスは、YUV や RGB などの外部映像フォーマットにおける連続バッファーデータのみをサポートしています。これを使用して、映像データのバッファー、長さ、幅、高さ、タイムスタンプ、および回転角度を送信できます。 */
[self.livePusher sendVideoData:yuvData width:720 height:1280 size:dataSize pts:nowTime rotation:0];
/* 外部映像データが CMSampleBufferRef フォーマットの場合は、sendVideoSampleBuffer インターフェイスを使用できます。 */
[self.livePusher sendVideoSampleBuffer:sampleBuffer]
/* CMSampleBufferRef フォーマットを連続バッファーに変換してから、sendVideoData インターフェイスに渡すこともできます。以下は変換の参考コードです。 */
// サンプルバッファのサイズを取得します。
- (int) getVideoSampleBufferSize:(CMSampleBufferRef)sampleBuffer {
if(!sampleBuffer) {
return 0;
}
int size = 0;
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
if(CVPixelBufferIsPlanar(pixelBuffer)) {
int count = (int)CVPixelBufferGetPlaneCount(pixelBuffer);
for(int i=0; i<count; i++) {
int height = (int)CVPixelBufferGetHeightOfPlane(pixelBuffer,i);
int stride = (int)CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer,i);
size += stride*height;
}
}else {
int height = (int)CVPixelBufferGetHeight(pixelBuffer);
int stride = (int)CVPixelBufferGetBytesPerRow(pixelBuffer);
size += stride*height;
}
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
return size;
}
// サンプルバッファを連続バッファーに変換します。
- (int) convertVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer toNativeBuffer:(void*)nativeBuffer
{
if(!sampleBuffer || !nativeBuffer) {
return -1;
}
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
int size = 0;
if(CVPixelBufferIsPlanar(pixelBuffer)) {
int count = (int)CVPixelBufferGetPlaneCount(pixelBuffer);
for(int i=0; i<count; i++) {
int height = (int)CVPixelBufferGetHeightOfPlane(pixelBuffer,i);
int stride = (int)CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer,i);
void *buffer = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, i);
int8_t *dstPos = (int8_t*)nativeBuffer + size;
memcpy(dstPos, buffer, stride*height);
size += stride*height;
}
}else {
int height = (int)CVPixelBufferGetHeight(pixelBuffer);
int stride = (int)CVPixelBufferGetBytesPerRow(pixelBuffer);
void *buffer = CVPixelBufferGetBaseAddress(pixelBuffer);
size += stride*height;
memcpy(nativeBuffer, buffer, size);
}
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
return 0;
}サンプルコード:
/* 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 座標をストリーム全体の幅の 10% の位置に配置します。ストリームの解像度が 540×960 の場合、ウォーターマークの x 座標は 54 になります。ウォーターマーク画像の高さは、元のアスペクト比と指定した
width値に基づいて比例してスケーリングされます。テキストウォーターマークを実装するには、まずテキストを画像に変換し、その後、このインターフェイスを使用してその画像をウォーターマークとして追加します。
ウォーターマークの鮮明さとエッジの滑らかさを確保するには、ウォーターマークの最終的な出力サイズと同じ寸法のソース画像を使用してください。たとえば、出力ビデオの解像度が 544×940 で、ウォーターマークの相対的な幅が
0.1fの場合、理想的なソース画像の幅は約 54.4 ピクセル (544 * 0.1) です。
画質の設定
解像度優先モード、流暢性優先モード、カスタムモードの 3 つの画質モードがサポートされています。
画質を設定するには、ビットレート制御を有効にする必要があります。config.enableAutoBitrate = true;
解像度優先モード (デフォルト)
解像度優先モードでは、SDK がビットレートパラメーターを内部的に設定し、取り込まれたビデオストリームの鮮明さを優先します。
config.qualityMode = AlivcLivePushQualityModeResolutionFirst; // 解像度優先モード流暢性優先モード
流暢性優先モードでは、SDK がビットレートパラメーターを内部的に設定し、取り込まれたビデオストリームの滑らかさを優先します。
config.qualityMode = AlivcLivePushQualityModeFluencyFirst; // 流暢性優先モードカスタムモード
カスタムモードでは、SDK はユーザーが設定したビットレートに基づいてストリームを設定します。カスタムモードを使用する場合、初期ビットレート、最小ビットレート、および目標ビットレートを定義する必要があります。
初期ビットレート:ライブストリーム開始時のビットレート。
最小ビットレート:ネットワーク接続が良くない場合、ビデオのカクつきを軽減するために、ビットレートは徐々に最小ビットレートまで低下します。
目標ビットレート:ネットワーク接続が良好な場合、ビデオの鮮明さを向上させるために、ビットレートは徐々に目標ビットレートまで増加します。
config.qualityMode = AlivcLivePushQualityModeCustom // カスタムモードに設定
config.targetVideoBitrate = 1400; // 目標ビットレート: 1400 Kbps
config.minVideoBitrate = 600; // 最小ビットレート: 600 Kbps
config.initialVideoBitrate = 1000; // 初期ビットレート: 1000 Kbpsカスタムビットレートを設定する際は、Alibaba Cloud の推奨設定を参照してください。推奨設定は次の各表のとおりです。
表 1. 推奨設定のカスタムビットレート品質-ファーストモード
解像度 | initialVideoBitrate | minVideoBitrate | targetVideoBitrate |
360p | 600 | 300 | 1000 |
480p | 800 | 300 | 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 |
アダプティブ解像度
アダプティブ解像度を有効にすると、ネットワーク状態が悪い場合に SDK が解像度を自動的に下げ、動画の滑らかさを向上させます。
config.enableAutoResolution = YES; // アダプティブ解像度を有効にします。デフォルトでは無効 (NO) です。アダプティブ解像度は、画質モードが画質優先または流暢性優先に設定されている場合にのみ有効で、カスタムモードでは有効になりません。
プレーヤーによっては、動的解像度の変更をサポートしていない場合があります。アダプティブ解像度機能を使用する必要がある場合は、ApsaraVideo Player の使用を推奨します。
バックグラウンドミュージック
プッシュ SDK は、バックグラウンドミュージックの再生、オーディオミキシング、ノイズ除去、インイヤーモニタリング、およびミュートをサポートしています。バックグラウンドミュージック関連のインターフェイスは、プレビュー開始後にのみ呼び出すことができます。サンプルコード:
/* バックグラウンドミュージックの再生を開始します。 */
[self.livePusher startBGMWithMusicPathAsync:musicPath];
/* バックグラウンドミュージックの再生を停止します。バックグラウンドミュージックの再生中に曲を切り替える場合は、再生開始インターフェイスを再度呼び出すだけです。現在のバックグラウンドミュージックを事前に停止する必要はありません。 */
[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.livePusher setSnapshotDelegate:self];
/* スナップショット API を呼び出します。 */
[self.livePusher snapshot:1 interval:1];美顔の設定
ApsaraVideo Live 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: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:@"Question Information" repeatCount:100 delayTime:0 KeyFrameOnly:false];iPhone X への対応
ほとんどのシナリオでは、プレビュービューのフレームをフルスクリーンに設定すると正しく動作します。ただし、iPhone X では、デバイス固有のアスペクト比により、フルスクリーンプレビューが引き伸ばされて表示される場合があります。iPhone X でのプレビューでは、フルスクリーンビューを避けることを推奨します。
インジェスト中のビューサイズ変更
startPreview または startPreviewAsync インターフェイスを呼び出すときに割り当てた UIView を反復処理し、プレビュービューのすべてのサブビューの frame を変更します。例:
[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 fileURLWithPath: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 をリッスンする必要があります。他の方法を使用すると、リスクが生じる可能性があります。
コールバック
プッシュ 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 の認証が期限切れになったことを示すコールバックです。SDK に新しい URL を提供する必要があります。
エラーコールバック
onSystemError:システムデバイスの例外に関するコールバックです。エンジンを破棄して再試行する必要があります。onSDKError:SDK エラーのコールバックです。エラーコードに基づいて各種エラーを処理する必要があります。エラーコードが 805438211 の場合は、デバイスのパフォーマンスが低く、エンコーディングとレンダリングのフレームレートが低下していることを示します。配信者に通知し、高度なレタッチやアニメーションなど、アプリレイヤーでリソースを大量に消費するビジネスロジックを停止する必要があります。
マイクとカメラの権限不足に関するコールバックを処理する必要があります。マイクの権限不足のエラーコードは 268455940、カメラの権限不足のエラーコードは 268455939 です。
現時点では、他のすべてのエラーはログに記録するだけで、追加のアクションは不要です。
バックグラウンドミュージックコールバック
onOpenFailed:バックグラウンドミュージックの開始に失敗しました。startBGMWithMusicPathAsyncメソッドに渡された音楽ファイルとそのパスが正しいか確認してください。startBGMWithMusicPathAsyncを呼び出して再試行できます。onDownloadTimeout:バックグラウンドミュージックの再生がタイムアウトしました。これは、ネットワーク URL から音楽を再生するときによく発生します。配信者に現在のネットワーク状態を確認するよう促してください。startBGMWithMusicPathAsyncを呼び出して再試行できます。
カスタムフィルターコールバック
AlivcLivePusherCustomFilterDelegate コールバックを使用してサードパーティのレタッチ SDK と統合し、基本および高度なレタッチ機能を実装します。AlivcLivePusherCustomFilterDelegate の主な目的は、SDK の内部テクスチャまたは CVPixelBuffer をレタッチ SDK に提供して処理させ、処理後のテクスチャまたは CVPixelBuffer を本 SDK に返してレタッチエフェクトを適用することです。
AlivcLivePushConfig の livePushMode プロパティが AlivcLivePushBasicMode に設定されている場合、SDK は CVPixelBuffer ではなく、AlivcLivePusherCustomFilterDelegate コールバックを通じてテクスチャ ID を提供します。主なコールバックは次のとおりです。
onCreate:OpenGL コンテキストが作成されたときのコールバック。通常、レタッチエンジンを初期化するために使用されます。onProcess:OpenGL テクスチャが更新されたときのコールバック。このメソッドは、SDK の元の内部テクスチャ ID を提供します。このコールバックでレタッチ処理メソッドを呼び出し、処理されたテクスチャ ID を返します。onDestroy:OpenGL コンテキストが破棄されたときのコールバック。通常、レタッチエンジンを破棄するために使用されます。
共通 API
/* カスタムモードでは、最小ビットレートとターゲットビットレートをリアルタイムで調整できます。 */
[self.livePusher setTargetVideoBitrate:800];
[self.livePusher setMinVideoBitrate:200]
/* 現在のストリームプッシュ状態を取得します。 */
BOOL isPushing = [self.livePusher isPushing];
/* プッシュ URL を取得します。 */
NSString *pushURLString = [self.livePusher getPushURL];
/* ストリームプッシュのパフォーマンスデバッグ情報を取得します。具体的なパラメーターと説明については、API ドキュメントまたはインターフェイスコメントを参照してください。 */
AlivcLivePushStatsInfo *info = [self.livePusher getLivePushStatusInfo];
/* SDK バージョン番号を取得します。 */
NSString *sdkVersion = [self.livePusher getSDKVersion];
/* 必要に応じてデバッグ情報をフィルターするため、ログレベルを設定します。 */
[self.livePusher setLogLevel:(AlivcLivePushLogLevelDebug)];デバッグツール
SDK には、DebugView という UI デバッグツールが用意されています。DebugView は移動可能なグローバルなフローティングウィンドウで、常にビュー階層の最前面に表示されます。ストリームインジェスト ログの表示、パフォーマンスパラメーターのリアルタイムモニタリング、主要なパフォーマンスメトリクスのラインチャートなどのデバッグ機能が含まれています。
リリースビルド では、DebugView を追加するインターフェイスを呼び出さないでください。
サンプルコード:
[AlivcLivePusher showDebugView];// デバッグツールを開きます。API リファレンス
よくある質問
ストリームインジェストが失敗する場合
トラブルシューティングツールを使用して、インジェスト URL が有効かどうかを確認できます。
インジェストしたオーディオ/ビデオストリームの情報を取得する方法
[Stream Management] ページに移動します。[Active Streams] セクションで、インジェストしたオーディオ/ビデオストリームを表示、管理できます。
ストリームを再生する方法
ストリームインジェストを開始した後、ApsaraVideo Player、FFplay、VLC などのプレーヤーを使用してストリームプルをテストできます。再生 URL を取得する方法については、「インジェスト URL とストリーミング URL の生成」をご参照ください。
App Store への申請が却下される場合
RtsSDK は、実機とシミュレーター両方のアーキテクチャを含むファットバイナリです。アプリを App Store に提出するには、シミュレーターのアーキテクチャを削除する必要があります。lipo -remove を使用して、バイナリから x86_64 スライスを削除できます。