カメラキャプチャ、画面共有、レタッチなどの例を交えながら、ライブアップストリーミングのための Push SDK for Android の登録、設定、使用方法について説明します。
特徴
リアルタイムメッセージングプロトコル (RTMP) 経由のアップストリーミングをサポートします。
Real-Time Communication (RTC) に基づく RTS ストリームのアップストリーミングとプルをサポートします。
共同ストリーミングと対戦をサポートします。
ビデオエンコーディングには H.264 を、音声エンコーディングには AAC を採用しています。
ビットレート制御、解像度、表示モードなどの機能のカスタム設定をサポートします。
さまざまなカメラ操作をサポートします。
リアルタイムのレタッチとカスタムレタッチ効果をサポートします。
アニメーションスタンプをウォーターマークとして追加および削除できます。
画面録画をストリーミングできます。
YUV やパルス符号変調 (PCM) など、さまざまなフォーマットの外部音声およびビデオ入力をサポートします。
複数ストリームのミキシングをサポートします。
音声のみおよびビデオのみのストリームのアップストリーミングと、バックグラウンドでのアップストリーミングをサポートします。
BGM をサポートします。
ビデオスナップショットキャプチャをサポートします。
自動再接続とエラー処理をサポートします。
自動ゲイン制御 (AGC)、自動ノイズリダクション (ANR)、アコースティックエコーキャンセレーション (AEC) アルゴリズムをサポートします。
ビデオファイルのソフトウェアエンコーディングモードとハードウェアエンコーディングモードを切り替えることができます。これにより、エンコーディングモジュールの安定性が向上します。
制限事項
Push SDK for Android を使用する前に、次の制限事項にご注意ください:
アップストリーミングの前に画面の向きを設定する必要があります。ライブストリーミング中に画面を回転させることはできません。
横向きモードでのアップストリーミングでは、画面の自動回転を無効にする必要があります。
ハードウェアエンコーディングモードでは、エンコーダーとの互換性を保つため、出力解像度の値を 16 の倍数にする必要があります。たとえば、解像度を 540p に設定した場合、出力解像度は 544 × 960 になります。黒枠を防ぐために、出力解像度に基づいてプレーヤーの画面サイズをスケーリングする必要があります。
API リファレンス
操作手順
機能の使用方法
SDK の登録
ライセンスを取得して設定するには、「プッシュ SDK ライセンスの統合」をご参照ください。
SDK のアップストリーミング機能を使用する前に、SDK を登録する必要があります。
Push SDK for Android を使用する前に、アプリケーションのライフサイクルの早い段階でライセンス登録 API を呼び出してください。
AlivcLiveBase.setListener(new AlivcLiveBaseListener() {
@Override
public void onLicenceCheck(AlivcLivePushConstants.AlivcLiveLicenseCheckResultCode result, String reason) {
Log.e(TAG, "onLicenceCheck: " + result + ", " + reason);
}
});
AlivcLiveBase.registerSDK();
-
AlivcLiveBaseクラスを使用して、ログレベルの設定、ローカルログパスの指定、SDK バージョンの取得を行います。 -
SDK ライセンスを登録するには、AlivcLiveBase の
registerSDKメソッドを呼び出す必要があります。 -
AlivcLiveBase#setListenerインターフェイスのonLicenceCheckコールバックを実装して、ライセンス設定を非同期で検証します。説明このコールバックは、プッシャーインスタンスを初期化した後にのみトリガーされます。
アップストリーミングパラメーターの設定
アップストリーミングパラメーターにはデフォルト値があり、追加の設定は不要です。
// アップストリーミング設定クラスを初期化します。
AlivcLivePushConfig mAlivcLivePushConfig = new AlivcLivePushConfig();
// アップストリーミングモードを設定します。デフォルトは基本モードです。
mAlivcLivePushConfig.setLivePushMode(AlivcLiveMode.AlivcLiveBasicMode);
// 解像度を設定します。デフォルトは 540p です。
mAlivcLivePushConfig.setResolution(AlivcResolutionEnum.RESOLUTION_540P);
// フレームレートを設定します。デフォルトは 25 fps です。
mAlivcLivePushConfig.setFps(AlivcFpsEnum.FPS_25);
// ビデオエンコーディングの GOP サイズを秒単位で設定します。デフォルトは 2 秒です。
mAlivcLivePushConfig.setVideoEncodeGop(AlivcVideoEncodeGopEnum.GOP_TWO);
// ビットレート制御を有効にします。これはデフォルトで有効になっています。
mAlivcLivePushConfig.setEnableBitrateControl(true);
// 画面の向きを設定します。デフォルトは縦向きです。ホームボタンが左または右にある横向きにも設定できます。
mAlivcLivePushConfig.setPreviewOrientation(AlivcPreviewOrientationEnum.ORIENTATION_PORTRAIT);
// 音声エンコードプロファイルを設定します。デフォルトは AAC-LC です。
mAlivcLivePushConfig.setAudioProfile(AlivcAudioAACProfileEnum.AAC_LC);
// ビデオエンコーディングモードを設定します。デフォルトはハードウェアエンコーディングです。
mAlivcLivePushConfig.setVideoEncodeMode(AlivcEncodeModeEnum.Encode_MODE_HARD);
// 音声エンコーディングモードを設定します。デフォルトはソフトウェアエンコーディングです。
mAlivcLivePushConfig.setAudioEncodeMode(AlivcEncodeModeEnum.Encode_MODE_SOFT);
// カメラの種類を設定します。デフォルトはフロントカメラです。
mAlivcLivePushConfig.setCameraType(AlivcLivePushCameraTypeEnum.CAMERA_TYPE_FRONT);
// アプリがバックグラウンドにあるときやアップストリーミングが一時停止したときに表示する画像を設定します。
mAlivcLivePushConfig.setPausePushImage("TODO: Image Path");
// ネットワーク状態が悪いときに表示する画像を設定します。
mAlivcLivePushConfig.setNetworkPoorPushImage("TODO: Image Path");
-
デバイスのパフォーマンスと帯域幅の最適なバランスを得るために、解像度を 540p に設定してください。
-
ビットレート制御を無効にすると、ビットレートはネットワーク状態に適応せずに初期値に固定されるため、再生のコマ落ちが発生する可能性があります。
カメラストリームの取り込み
-
初期化
アップストリーミングパラメーターを設定した後、
initメソッドを呼び出します:AlivcLivePusher mAlivcLivePusher = new AlivcLivePusher(); mAlivcLivePusher.init(mContext, mAlivcLivePushConfig);説明AlivcLivePusherは複数のインスタンスをサポートしていません。各init呼び出しはdestroy呼び出しとペアにする必要があります。 -
プレビューコールバックの登録
setLivePushInfoListenerメソッドを呼び出してプレビューコールバックを登録します:/** * アップストリーミングイベント通知用のリスナーを設定します。 * * @param infoListener 通知リスナー。 */ mAlivcLivePusher.setLivePushInfoListener(new AlivcLivePushInfoListener() { @Override public void onPreviewStarted(AlivcLivePusher pusher) { // プレビューが開始されたことの通知。 } // その他のオーバーライドメソッド //.... //.... }); -
プレビューの開始
カメラプレビュー用の
SurfaceViewを渡してプレビューを開始します:mAlivcLivePusher.startPreview(mSurfaceView); // プレビューを開始します。必要に応じて非同期の startPreviewAsync メソッドを呼び出すこともできます。 -
アップストリーミングの開始
onPreviewStarted コールバックメソッド内に次のコードを追加します。
mAlivcLivePusher.startPush(mPushUrl);説明-
RTMP と RTS (artc://) のインジェスト URL に対応しています。 URL を取得するには、「インジェスト URL とストリーミング URL を生成する」をご参照ください。
-
ApsaraVideo Live は、同じ URL への同時アップストリーミングリクエストを拒否します。
-
一般的なアップストリーミングメソッド
SDK は、開始、停止、一時停止、再開、再起動、再接続、破棄など、ストリームのライフサイクルを制御するためのメソッドを提供します。
/* アップストリーミング中のストリームを一時停止するために呼び出します。一時停止後、ビデオプレビューとビデオストリームのアップストリーミングは最後のフレームで保持されますが、音声ストリームのアップストリーミングは継続します。 */
mAlivcLivePusher.pause();
/* 一時停止したストリームを再開するために呼び出します。再開後、音声とビデオのプレビューおよびアップストリーミングは通常の状態に戻ります。 */
mAlivcLivePusher.resume();
/* アップストリーミング中のストリームを停止するために呼び出します。完了後、アップストリーミングは停止します。 */
mAlivcLivePusher.stopPush();
/* プレビュー状態のときにのみプレビューを停止するために呼び出します。アップストリーミング中にこれを呼び出しても効果はありません。プレビューが停止すると、プレビューフレームは最後のフレームでフリーズします。 */
mAlivcLivePusher.stopPreview();
/* ストリームがアップストリーミング中、またはエラー関連のコールバックを受信した後に、アップストリーミングを再起動するために呼び出します。エラー状態では、この API、reconnectPushAsync、または destroy のみを呼び出すことができます。再起動すると、プレビューとアップストリーミングを含む AlivcLivePusher のすべての内部リソースが再初期化されます。 */
mAlivcLivePusher.restartPush();
/* ストリームがアップストリーミング中、または AlivcLivePusherNetworkDelegate に関連するエラーコールバックを受信した後に、ストリームを再接続するために呼び出します。エラー状態では、この API、restartPush、または destroy のみを呼び出すことができます。再接続すると、アップストリーミングのための RTMP 接続が再確立されます。 */
mAlivcLivePusher.reconnectPushAsync();
/* アップストリーミングインスタンスを破棄するために呼び出します。破棄後、アップストリーミングとプレビューは停止し、プレビューサーフェスは削除されます。AlivcLivePusher に関連するすべてのリソースが解放されます。 */
mAlivcLivePusher.destroy();
カメラ操作
アップストリーミング、一時停止、または再接続中に、カメラの切り替え、フラッシュの切り替え、フォーカス、ズーム、ミラーリングの調整を行います:
/* フロントカメラとリアカメラを切り替えます。 */
mAlivcLivePusher.switchCamera();
/* フラッシュをオンまたはオフにします。フロントカメラがアクティブな場合、フラッシュをオンにしても効果はありません。 */
mAlivcLivePusher.setFlash(true);
/* 焦点距離を調整して、キャプチャした画像をズームします。ズーム範囲は [0, getMaxZoom()] です。 */
mAlivcLivePusher.setZoom(5);
/* カメラを手動でフォーカスします。これには 2 つのパラメーターが必要です:1. `point` (フォーカスする点の座標) と 2. `autoFocus` (この特定の操作でオートフォーカスを有効にするかどうか)。その後のオートフォーカスの動作は、setAutoFocus API で設定された値に従います。 */
mAlivcLivePusher.focusCameraAtAdjustedPoint(x, y, true);
/* オートフォーカスを有効にするかどうかを設定します。 */
mAlivcLivePusher.setAutoFocus(true);
/* ミラーリングを設定します。ミラーリング API には、アップストリーミングストリーム用の PushMirror とローカルプレビュー用の PreviewMirror の 2 つがあります。PushMirror は再生表示にのみ影響し、PreviewMirror はプレビュー表示にのみ影響します。互いに影響しません。 */
mAlivcLivePusher.setPreviewMirror(false);
mAlivcLivePusher.setPushMirror(false);
カメラ API は、プレビューが開始された後にのみ利用可能です。
画面共有ストリームのインジェスト
画面共有は MediaProjection を使用し、ユーザーの権限が必要です。権限の結果データを SDK に渡します。画面共有中は、カメラはデフォルトで無効になっています。
画面共有の設定
// resultData は画面共有システムの意図です。
mAlivcLivePushConfig.setMediaProjectionPermissionResultData(resultData);
画面回転の設定
画面共有中に横向きおよび縦向きの録画をサポートするために、画面の回転角度を設定します:
mAlivcLivePusher.setScreenOrientation(0);
アプリケーション層で OrientationEventListener イベントをリッスンし、画面の向きが変わったときにこの API を介して回転角度を設定する必要があります。
プライバシー保護の設定
画面共有中にプライバシー保護を有効にして、パスワードなどの機密入力を非表示にします:
mAlivcLivePusher.pauseScreenCapture(); // プライバシー保護を有効にします。
mAlivcLivePusher.resumeScreenCapture(); // プライバシー保護を無効にします。
これにより画面共有が一時停止します。設定で setPausePushImage が設定されている場合、視聴者には指定された画像が表示されます。それ以外の場合、視聴者には一時停止前の最後のフレームが表示されます。
カメラと画面共有ストリームのアップストリーミング
画面共有中にカメラのアップストリーミングを有効にすることができます。2 つのアプローチがあります:
-
ストリーマーにカメラプレビューがある。
ストリーマーと視聴者の両方がカメラフィードを見ることができます。
-
ストリーマーにカメラプレビューがない。
たとえば、ゲームストリーミング中、ストリーマーはカメラビューがゲームを妨げることを望まないかもしれません。しかし、視聴者は最終的なストリームでストリーマーのカメラフィードを見ることができます。
ストリーマーがカメラプレビューを表示できる場合
画面共有が開始された後、API を呼び出してカメラプレビューを開始または停止します。
mAlivcLivePusher.startCamera(surfaceView); // カメラプレビューを開始します。
mAlivcLivePusher.stopCamera(); // カメラプレビューを停止します。
-
画面回転時の調整を避けるため、カメラプレビューの
surfaceViewの縦横比を 1:1 に設定してください。 -
縦横比が 1:1 でない場合は、画面が回転したときに
surfaceViewの比率を調整し、stopCameraの後にstartCameraを呼び出す必要があります。 -
ストリーマーがプレビューを必要としない場合は、
surfaceviewを null に設定します。
ストリーマーがカメラプレビューを表示できない場合
カメラストリームミキシングを有効にして、ローカルプレビューなしでカメラフィードをストリームに含めます。
mAlivcLivePusher.startCameraMix(x, y, w, h); // カメラストリームミキシングを有効にし、ミキシングされたストリームの x, y, w, h レイアウトを設定します。
mAlivcLivePusher.stopCameraMix(); // カメラストリームミキシングを停止します。
プレビュー表示モード
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);
画像ストリームのアップストリーミング
SDK は、アプリがバックグラウンドにあるときやネットワーク状態が悪いときに、プレースホルダー画像をアップストリーミングできます。
アプリがバックグラウンドに入ると、ビデオのアップストリーミングは一時停止し、音声は継続します。視聴者に知らせるためにプレースホルダー画像を表示します:
mAlivcLivePushConfig.setPausePushImage("path/to/background.png"); // バックグラウンドアップストリーミング用の画像を設定します。
SDK は、低いビットレートを検出すると、このイメージを取り込んで動画のコマ落ちを低減します:
mAlivcLivePushConfig.setNetworkPoorPushImage("path/to/network_poor.png"); // ネットワーク状態が悪いときにアップストリーミングする画像を設定します。
音声のみのアップストリーミング
mAlivcLivePushConfig.setAudioOnly(true);
外部のオーディオおよびビデオストリームを取り込む
SDK は、ビデオファイルなどの外部ソースからの音声およびビデオのアップストリーミングをサポートしています。
まず、カスタム音声およびビデオ入力を有効にします:
外部の音声およびビデオのアップストリーミングは、SDK 7.8.0 以降でサポートされています。主要な操作は、setExternMainStream (カスタム音声およびビデオ入力を有効にする)、inputStreamAudioData (外部音声ストリームをアップストリーミングする)、および inputStreamVideoData (外部ビデオストリームをアップストリーミングする) です。SDK 7.11.0 は主にクライアント認証の有効期限ロジックを最適化し、ビデオキャプチャエラーコールバックを追加しますが、外部ストリームのアップストリーミング機能は導入されていないため、この機能のためだけにアップグレードする必要はありません。
/**
* 出力解像度、音声サンプルレート、チャンネル数などの他のパラメーターは、
* setResolution、setAudioSampleRate、setAudioChannels を使用して config オブジェクトで設定されます。
*/
mAlivcLivePushConfig.setExternMainStream(true,AlivcImageFormat.IMAGE_FORMAT_YUVNV12,AlivcSoundFormat.SOUND_FORMAT_S16);
カスタム音声およびビデオ入力を有効にした後、外部ストリームをアップストリーミングできます。
外部音声ストリームの取り込み
/**
* この API はタイミングを制御しません。呼び出し元が入力音声フレームのタイミングを制御する必要があります。
*/
mAlivcLivePusher.inputStreamAudioData(byte[] data, int size, int sampleRate, int channels, long pts);
外部ビデオストリームのインジェスト
/**
* この API はタイミングを制御しません。呼び出し元が入力ビデオフレームのタイミングを制御する必要があります。
*/
mAlivcLivePusher.inputStreamVideoData(byte[] data, int width, int height, int stride, int size, long pts, int rotation);
プッシュ SDK は RTSP プロトコルをサポートしていません。ネットワークカメラ (IP カメラ) から RTSP ストリームをアップストリーミングするには、まずストリームを YUV/PCM フォーマットにデコードし、次に inputStreamAudioData/inputStreamVideoData API を使用してアップストリーミングします。
利用可能なデコードツール:
-
FFmpeg:RTSP 入力をサポートし、YUV420p および PCM s16le にデコードできます。コマンド例:
ffmpeg -rtsp_transport tcp -i rtsp://camera_ip/stream -an -c:v rawvideo -pix_fmt yuv420p output.yuv -
GStreamer:RTSP 入力をサポートし、YUV420p および PCM s16le にデコードできます。
-
MediaCodec:Android 4.1 (API レベル 16) 以降でハードウェア H.264 デコードを YUV にサポートする Android フレームワーク API (
android.media.MediaCodec) です。
デコードされたデータ形式は、SDK の設定と一致する必要があります:ビデオ形式を IMAGE_FORMAT_YUVNV12 に、音声形式を SOUND_FORMAT_S16 に設定します。
ウォーターマークの設定
PNG 形式のウォーターマークを 1 つ以上追加します:
mAlivcLivePushConfig.addWaterMark(waterPath,0.1,0.2,0.3); // ウォーターマークを追加します。
-
x、y、および幅のパラメーターは相対値です。たとえば、x=0.1 は、ウォーターマークの x 座標がストリームの幅の 10% の位置にあることを意味します。ストリームの解像度が 540x960 の場合、ウォーターマークの x 座標は 54 になります。
-
ウォーターマーク画像の高さは、元の縦横比と指定された幅の値に基づいて比例的にスケーリングされます。
-
テキストウォーターマークを実装するには、まずテキストを画像に変換し、次にこの API を使用してウォーターマークとして追加します。
ビデオ品質の設定
解像度優先モード、流暢さ優先モード、カスタムモードの 3 つのビデオ品質モードがサポートされています。
ビデオ品質を設定するには、ビットレート制御を有効にする必要があります:mAlivcLivePushConfig.setEnableBitrateControl(true);
解像度優先モード (デフォルト)
SDK は、ビットレートパラメーターを自動的に設定することで、ビデオの鮮明さを優先します。
mAlivcLivePushConfig.setQualityMode(AlivcQualityModeEnum.QM_RESOLUTION_FIRST); // 解像度を優先します。
流暢さ優先モード
SDK は、ビットレートパラメーターを自動的に設定することで、ビデオの滑らかさを優先します。
mAlivcLivePushConfig.setQualityMode(AlivcQualityModeEnum.QM_FLUENCY_FIRST); // 流暢さを優先します。
カスタムモード
SDK は、設定したビットレートを使用します。初期、最小、および目標のビットレート値を定義します。
-
目標ビットレート:ネットワーク状態が良い場合、ビットレートは徐々に目標ビットレートまで増加し、ビデオの鮮明さが向上します。
-
最小ビットレート:ネットワーク状態が悪い場合、ビットレートは徐々に最小ビットレートまで減少し、ビデオのコマ落ちが軽減されます。
-
初期ビットレート:ライブストリーム開始時のビットレートです。
mAlivcLivePushConfig.setQualityMode(AlivcQualityModeEnum.QM_CUSTOM); // カスタムモード
mAlivcLivePushConfig.setTargetVideoBitrate(1000); // 目標ビットレート:1,000 kbit/s
mAlivcLivePushConfig.setMinVideoBitrate(300); // 最小ビットレート:300 kbit/s
mAlivcLivePushConfig.setInitialVideoBitrate(800); // 初期ビットレート:800 kbit/s
以下の推奨ビットレート設定をご参照ください:
表 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 |
適応解像度
適応解像度は、ネットワーク状態が悪い場合に自動的に解像度を下げて、滑らかさを向上させます:
mAlivcLivePushConfig.setEnableAutoResolution(true); // 適応解像度を有効にします。デフォルトは false です。
-
適応解像度は、解像度優先または流暢さ優先モードでのみ機能し、カスタムモードでは機能しません。
-
一部のプレーヤーは動的な解像度の変更をサポートしていません。互換性のために Alibaba Cloud プレーヤーを使用してください。
BGM
SDK は、BGM の再生、ミキシング、ノイズ除去、インイヤーモニタリング、ミュートをサポートしています:
/* BGM の再生を開始します。 */
mAlivcLivePusher.startBGMAsync(mPath);
/* BGM の再生を停止します。BGM がすでに再生中で曲を切り替える必要がある場合は、現在の BGM を停止する必要はなく、BGM 開始 API を再度呼び出すだけです。 */
mAlivcLivePusher.stopBGMAsync();
/* BGM を一時停止します。これは BGM が再生を開始した後にのみ呼び出すことができます。 */
mAlivcLivePusher.pauseBGM();
/* BGM を再開します。これは BGM が一時停止しているときにのみ呼び出すことができます。 */
mAlivcLivePusher.resumeBGM();
/* BGM のループを有効にします。 */
mAlivcLivePusher.setBGMLoop(true);
/* ノイズ除去スイッチを設定します。有効にすると、キャプチャされた音声の非人間的な音がフィルタリングされます。これにより、人間の声がわずかに抑制される場合があります。ユーザーがこの機能を有効にするかどうかを選択できるようにすることを推奨します。デフォルトでは無効になっています。 */
mAlivcLivePusher.setAudioDenoise(true);
/* インイヤーモニタリングスイッチを設定します。この機能は主にカラオケシナリオで使用されます。ヘッドフォンを接続して有効にすると、ストリーマーは自分の声を聞くことができます。無効にすると、聞こえません。ヘッドフォンが接続されていない場合は効果がありません。 */
mAlivcLivePusher.setBGMEarsBack(true);
/* ミキシングを設定して、BGM とキャプチャされた音声の音量を調整します。 */
mAlivcLivePusher.setBGMVolume(50); // BGM の音量を設定します。
mAlivcLivePusher.setCaptureVolume(50); // キャプチャされた音声の音量を設定します。
/* 音声をミュートします。これにより、音楽と音声入力の両方がミュートされます。音楽または音声のみをミュートするには、ミキシング音量調整 API を使用します。 */
mAlivcLivePusher.setMute(true);
BGM API は、プレビューが開始された後にのみ利用可能です。
ストリームスナップショット
ローカルビデオストリームのスナップショットを撮ります:
// ビデオストリームのスナップショットを撮ります。パラメーター:キャプチャする画像の数、各キャプチャ間の間隔 (秒)、およびコールバックリスナー。
pusher.snapshot(1, 1, new AlivcSnapshotListener() {
@Override
public void onSnapshot(Bitmap bmp) {
// スナップショットをローカルの PNG ファイルに保存できます。次のコードは例です。
String dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss-SS").format(new Date());
File f = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "snapshot-" + dateFormat + ".png");
if (f.exists()) {
f.delete();
}
try {
FileOutputStream out = new FileOutputStream(f);
bmp.compress(Bitmap.CompressFormat.PNG, 90, out);
out.flush();
out.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
バックグラウンド実行と画面ロック
-
アプリがバックグラウンドに移動したり、画面がロックされたりした場合、
AlivcLivePusherのpause()またはresume()メソッドを呼び出して、アップストリーミングを一時停止または再開できます。 -
システム以外の音声およびビデオ通話の場合、SDK は音声をキャプチャしてアップストリーミングします。ビジネスニーズに応じて、
mAlivcLivePusher.setMute(true or false)API を呼び出して、アプリがバックグラウンドにあるときや画面がロックされているときに音声をキャプチャするかどうかを決定できます。
コールバック
|
コールバックタイプ |
コールバッククラス名 |
設定メソッド |
|
AlivcLivePushInfoListener |
|
|
|
AlivcLivePushNetworkListener |
|
|
|
AlivcLivePushErrorListener |
|
|
|
AlivcLivePushBGMListener |
|
ストリームインジェストのコールバック
アップストリーミングコールバックは、SDK のステータスの変更 (プレビュー開始、最初のフレームのレンダリング、最初のフレームの送信、アップストリーミング開始、アップストリーミング停止) をアプリに通知します。
-
onPushStarted:サーバーへの接続が成功したことを示します。 -
onFirstFramePushed:最初の音声またはビデオフレームが正常に送信されたことを示します。 -
onPushStartedおよびonFirstFramePushedコールバックは、SDK がアップストリーミングを正常に開始したことを示します。
ネットワーク関連のコールバック
ネットワークコールバックは接続ステータスを報告します。SDK は、AlivcLivePushConfig で設定されたタイムアウトとリトライの制限内で、短いネットワーク変動時に自動的に再接続します。
-
onConnectFail:アップストリーミングに失敗しました。アップストリーミング URL の有効性、認証の問題、同時ストリーム制限、またはブロックリストのステータスを確認してください。エラーコード:0x30020901–0x30020905, 0x30010900–0x30010901。 -
onConnectionLost:接続が失われました。SDK は自動的に再接続し、onReconnectStartをトリガーします。リトライ回数がconfig.connectRetryCountを超えると、onReconnectFailが発生します。 -
onNetworkPoor:ネットワークが安定したアップストリーミングには不十分ですが、ストリームは中断されていません。これを使用して UI 通知を表示します。 -
onNetworkRecovery:ネットワークが回復しました。 -
onReconnectFail:AlivcLivePushConfig のタイムアウトとリトライ制限を超えた後、自動再接続に失敗しました。ネットワークが回復した後、mAlivcLivePusher.reconnectPushAsyncを呼び出して手動で再接続してください。 -
onSendDataTimeout:データ送信がタイムアウトしました。ネットワークを確認し、アップストリーミングを停止して再起動してください。 -
onPushURLAuthenticationOverdue:アップストリーミング URL の認証が期限切れになりました。SDK に新しい URL を提供してください。
エラーコールバック
-
onSystemError:システムまたはデバイスのエラーです。エンジンを破棄して再試行してください。 -
onSDKError:エラーコードに基づいて処理します:-
エラー 805438211:デバイスのパフォーマンスが低く、エンコーディングのフレームレートが低い。ストリーマーに通知し、高度なレタッチなどのリソースを大量に消費する操作を停止してください。
-
権限不足のエラーを処理します:268455940 (マイク) および 268455939 (カメラ)。
-
他のすべてのエラーをログに記録します。
-
BGM コールバック
-
onOpenFailed:BGM の開始に失敗しました。ファイルパスとフォーマットを確認し、再度startBGMAsyncを呼び出してください。 -
onDownloadTimeout:音楽の再生がタイムアウトしました。通常、URL からストリーミングしている場合に発生します。ネットワークを確認し、再度startBGMAsyncを呼び出してください。
一般的なメソッドと API
一般的なメソッド
/* カスタムモードでは、最小および目標ビットレートをリアルタイムで調整できます。 */
mAlivcLivePusher.setTargetVideoBitrate(800);
mAlivcLivePusher.setMinVideoBitrate(400);
/* カメラがオートフォーカスをサポートしているか確認します。 */
mAlivcLivePusher.isCameraSupportAutoFocus();
/* カメラがフラッシュをサポートしているか確認します。 */
mAlivcLivePusher.isCameraSupportFlash();
/* 現在のアップストリーミングステータスを取得します。 */
mAlivcLivePusher.isPushing();
/* アップストリーミング URL を取得します。 */
mAlivcLivePusher.getPushUrl();
/* アップストリーミングのパフォーマンスとデバッグ情報を取得します。パフォーマンスパラメーターの詳細については、API リファレンスまたはインターフェイスのコメントをご参照ください。 */
mAlivcLivePusher.getLivePushStatsInfo();
/* SDK のバージョン番号を取得します。 */
mAlivcLivePusher.getSDKVersion();
/* 必要に応じてデバッグ情報をフィルタリングするためにログレベルを設定します。 */
mAlivcLivePusher.setLogLevel(AlivcLivePushLogLevelAll);
/* SDK の現在のステータスを取得します。 */
mAlivcLivePusher.getCurrentStatus();
/* 最後のエラーコードを取得します。エラーがない場合は ALIVC_COMMON_RETURN_SUCCESS を返します。 */
mAlivcLivePusher.getLastError();
一般的な API
|
クラス |
説明 |
|
AlivcLivePushConfig |
アップストリーミングの初期設定。 |
|
AlivcLivePusher |
アップストリーミング機能用のクラスです。 |
|
AlivcLivePusherErrorListener |
エラーのコールバック。 |
|
AlivcLivePusherNetworkListener |
ネットワーク関連の通知のコールバック。 |
|
AlivcLivePusherInfoListener |
アップストリーミング情報のコールバック。 |
|
AlivcLivePusherBGMListener |
BGM のコールバック。 |
|
AlivcLivePushCustomFilter |
カスタムフィルターのコールバック。 |
|
AlivcLivePushCustomDetect |
カスタム顔認識のコールバック。 |
|
AlivcSnapshotListener |
スナップショットのコールバック。 |
レタッチの統合
レタッチライブラリをインポートし、コールバックを設定してレタッチを有効にします。
レタッチには、レタッチ SDK 用のライセンスが必要です。Queen SDK のライセンスを取得する。
-
Maven を使用してレタッチライブラリをインポートします。
build.gradleファイルに以下を追加します。SDK バージョンについては、最新のデモをご確認ください。implementation "com.aliyun.maliang.android:queen:2.5.0-official-full" implementation("com.aliyun.maliang.android:queen_menu:2.5.0-official-full") { exclude group: 'com.aliyun.maliang.android', module: 'queen' }デモから LiveBeauty モジュールを統合することもできます:
ファイルまたはフォルダ
説明
live_beauty
レタッチの基本抽象クラス。
queen_beauty
レタッチの基本 UI コントロール。
-
LiveBeauty レタッチプラグインライブラリを取得します。
-
cloneコマンドを使用して、LiveBeauty パスから関連するプラグインライブラリコードをローカルマシンにダウンロードします。git clone https://github.com/MediaBox-Demos/amdemos-android-live.git -
Android Studio プロジェクトのルートディレクトリでコマンドラインを開きます。次のコードを実行し、
File > New > Import Moduleを使用してLiveBeautyモジュールを Android プロジェクトにインポートします。git submodule add https://github.com/MediaBox-Demos/amdemos-android-live.git ***/***/***説明サンプルコードでは、/*** は
LiveBeautyモジュールへのパスのプレースホルダーです。 -
プロジェクトの
settings.gradleファイルに、モジュールのパスを追加します:include ':app', ':LiveBeauty', ':LiveBeauty:live_queenbeauty'説明サンプルコードでは、「app」はメインモジュールです。
-
また、プロジェクトのメインモジュールの
build.gradleファイルに、LiveBeautyモジュールへの依存関係を追加します:dependencies { implementation project(':LiveBeauty') implementation project(':LiveBeauty:live_queenbeauty') } -
File > Sync Project with Gradle Filesをクリックします。Gradle の同期が完了すると、LiveBeautyモジュールを使用できます。
-
-
レタッチプラグインの UI モジュールを設定します。
-
プロジェクトのレイアウト XML ファイルに
QueenBeautyMenuコントロールを追加します。例:<com.aliyunsdk.queen.menu.QueenBeautyMenu android:id="@+id/beauty_beauty_menuPanel" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" /> -
Activity で
QueenBeautyMenuを初期化します。例:// レタッチメニューパネルを初期化します。 QueenMenuPanel beautyMenuPanel = QueenBeautyMenu.getPanel(context); beautyMenuPanel.onHideMenu(); beautyMenuPanel.onHideValidFeatures(); beautyMenuPanel.onHideCopyright(); // レイアウトにレタッチメニューを追加します。 QueenBeautyMenu beautyBeautyContainerView = findViewById(R.id.beauty_beauty_menuPanel); beautyBeautyContainerView.addView(beautyMenuPanel);
-
-
顔認識とレタッチのコールバックを設定します。
サードパーティのレタッチライブラリを統合する必要がある場合は、
setCustomDetectおよびsetCustomFilterコールバックを設定します。-
customDetectProcessでは、dataパラメーターはサードパーティ処理用のキャプチャされたデータへのポインターです。 -
customFilterProcessでは、inputTextureパラメーターは処理対象の画像テクスチャです。処理されたテクスチャ ID を返すか、変更されていない場合は元のinputTextureを返します。
-
注意事項
|
項目 |
説明 |
|
難読化ルール |
難読化の問題を防ぐために、SDK のパッケージ名を ProGuard の除外リストに追加してください。
|
|
API 呼び出しシーケンス |
|
よくある質問
アップストリーミングが失敗するのはなぜですか?
トラブルシューティングツールを使用して、アップストリーミング URL を検証してください。
アクティブなストリームに関する情報を取得するにはどうすればよいですか?
ストリーム管理ページでアクティブなストリームを表示および管理します。
ストリームの再生をテストするにはどうすればよいですか?
アップストリーミングを開始した後、Alibaba Cloud プレーヤー、FFplay、または VLC で再生をテストします。「アップストリーミング URL とストリーミング URL の生成」をご参照ください。