このトピックでは、Push SDK for Flutterを使用する方法と、SDKのクラスとメソッドについて説明します。 このトピックでは、Push SDK for Flutterが提供する機能の使用例についても説明します。
機能
RTMP (Real-Time Messaging Protocol) によるストリーム取り込みをサポートします。
UDP (User Datagram Protocol) に基づくARTC経由のストリーム取り込みをサポートします。
ビデオエンコーディングにH.264、オーディオエンコーディングにAdvanced Audio Coding (AAC) を採用します。
ビットレート制御、解像度、表示モードなどの機能のカスタム設定をサポートします。
さまざまなカメラ操作をサポートします。
リアルタイムのレタッチをサポートし、レタッチ効果を調整できます。
アニメーションステッカーをアニメーション透かしとして追加し、アニメーションステッカーを削除できます。
YUVやパルス符号変調 (PCM) など、さまざまな形式の外部オーディオおよびビデオ入力をサポートします。
オーディオのみのストリームの取り込みとバックグラウンドでのストリーム取り込みをサポートします。
バックグラウンドミュージックをサポートし、バックグラウンドミュージックを管理できます。
ビデオスナップショットのキャプチャをサポートします。
自動再接続とエラー処理をサポートします。
オーディオ3Aアルゴリズムをサポートします。
ビデオファイルのソフトウェアとハードウェアのエンコードモードを切り替えることができます。 これは、符号化モジュールの安定性を改善します。
制限事項
Push SDK for Flutterを使用する前に、次の制限事項に注意してください。
ストリームの取り込み前に画面の向きを設定する必要があります。 ライブストリーミング中は画面を回転できません。
ランドスケープモードでのストリーム取り込みの自動画面回転を無効にする必要があります。
ハードウェア符号化モードでは、出力解像度の値は、エンコーダと互換性があるように16の倍数でなければならない。 たとえば、解像度を540pに設定すると、出力解像度は544 × 960になります。 プレーヤービューのサイズを設定するときは、黒いバーを防ぐために、出力解像度に基づいて比例サイズ変更を設定します。
手順
次の表に、Flutter用プッシュSDKの使用方法を示します。
ステップ | 説明 |
1. SDKを登録します。 | ライセンス関連のパラメーターを設定して、Push SDK for Flutterを登録します。 登録関数を呼び出さない場合、ストリーム取り込み機能は使用できません。 |
2. ストリーム取り込みパラメーターを設定します。 | 基本パラメータ、ビットレート制御モード、アダプティブ解像度などの完全なストリーム取り込み設定。 |
3. ストリーム取り込みを実行します。 | Push SDK for Flutterを初期化し、ストリーム取り込みコールバックを登録し、プレビュービューを作成した後、ストリームの取り込みを開始できます。 ビジネス要件に基づいて、ストリームの管理、BGMの設定、カメラ設定の設定、外部オーディオソースの取り込み、アニメーションステッカーの追加を行うことができます。 説明 ApsaraVideo Liveでは、複数のストリームを同時にURLに取り込むことはできません。 複数のストリームを同時に取り込む場合、最初のストリームのみが取り込まれます。 |
SDKの登録
オールインワンライセンスはPush SDK for Flutterと一緒に使用されます。 ライセンスを申請および設定する方法の詳細については、「プッシュSDKライセンスの統合」をご参照ください。
ストリーム取り込み機能を使用する前に、Flutter用のPush SDKを登録する必要があります。
AlivcBaseインスタンスを作成します。
AlivcBase alivcBase = AlivcBase.init();
SDKを登録します。
重要SDKを登録するメソッドを呼び出す前に、ライセンスを設定する必要があります。
alivcBase.registerSDK();
コールバックのリスナーを設定します。
alivcBase.setObserver();
ライセンス検証用のコールバックを設定します。
alivcBase.setOnLicenceCheck((result, reason) { if (result == AlivcLiveLicenseCheckResultCode.success) { // The SDK is registered. } });
AlivcBaseの他のメソッドを呼び出します。
/// Obtain the version number of Push SDK. String sdkVersion = await AlivcBase.getSdkVersion(); /// Enable log printing in the console. AlivcBase.setConsoleEnable(true); /// Set the log level to Debug. AlivcBase.setLogLevel(AlivcLivePushLogLevel.debug); /// Specify the log path. String logPath = "xxxx"; // xxxx indicates the path in the phone. int maxPartFileSizeInKB = 100 * 1024 * 1024; // The custom settings. AlivcBase.setLogPath(logPath, maxPartFileSizeInKB);
ストリーム取り込みパラメーターの設定
AlivcLivePusherインスタンスを作成します。
AlivcLivePusher livePusher = AlivcLivePusher.init();
AlivcLivePusherConfigをAlivcLivePusherに関連付けるConfigオブジェクトを作成します。
livePusher.createConfig();
AlivcLivePusherConfigインスタンスを作成します。
AlivcLivePusherConfig pusherConfig = AlivcLivePusherConfig.init();
ビジネス要件に基づいて、基本的なストリーム取り込み設定を完了します。
基本的なストリーム取り込み設定に使用される各パラメーターには、デフォルト値があります。 デフォルト値の使用を推奨します。 次のサンプルコードに例を示します。
/// Set the resolution to 540p. pusherConfig.setResolution(AlivcLivePushResolution.resolution_540P); /// Specify the frame rate. We recommend that you set the frame rate to 20 frames per second (FPS). pusherConfig.setFps(AlivcLivePushFPS.fps_20); /// Enable adaptive bitrate streaming. The default value is true. pusherConfig.setEnableAutoBitrate(true); /// Specify the group of pictures (GOP) size. A larger value indicates higher latency. We recommend that you set the value to a number from 1 to 2. pusherConfig.setVideoEncodeGop(AlivcLivePushVideoEncodeGOP.gop_2); /// Specify the reconnection duration. The value cannot be less than 1000. Unit: milliseconds. We recommend that you use the default value. pusherConfig.setConnectRetryInterval(2000); /// Disable the mirroring mode for preview. pusherConfig.setPreviewMirror(false); /// Set the stream ingest orientation to portrait. pusherConfig.setOrientation(AlivcLivePushOrientation.portrait);
ビットレート制御モードを指定します。
AlivcLivePushQualityModeパラメーターを設定して、ビットレート制御モードを指定できます。 Push SDK for Flutterは、次のビットレート制御モードを提供します。 ビジネス要件に基づいて各パラメーターの値を指定します。
ビットレート制御モード
説明
サンプルコード
AlivcLivePushQualityMode.resolution_first
品質-最初のモード。 Push SDK for Flutterは、ビデオストリームの品質を優先するビットレートパラメータを設定します。
pusherConfig.setQualityMode(AlivcLivePushQualityMode.resolution_first);
AlivcLivePushQualityMode.fluency_first
滑らかさ-最初のモード。 Push SDK for Flutterは、ビデオストリームの滑らかさを優先するビットレートパラメータを設定します。
pusherConfig.setQualityMode(AlivcLivePushQualityMode.fluency_first);
AlivcLivePushQualityMode.custom
カスタムモード。 Push SDK for Flutterは、カスタム設定に基づいてビットレートパラメータを設定します。 カスタムモードを使用する場合は、ビジネス要件に基づいてquality-firstまたはsmoothness-firstを選択し、initialVideoBitrate、minVideoBitrate、およびtargetVideoBitrateパラメーターを設定できます。
initialVideoBitrate: ライブストリーム開始時の初期ビットレート。
minVideoBitrate: 悪いネットワーク条件では、ビットレートは吃音を防ぐために最小ビットレートまで徐々に低下します。
targetVideoBitrate: 良好なネットワーク条件では、ビデオストリームの品質を向上させるために、ビットレートがターゲットビットレートまで徐々に増加します。
pusherConfig.setQualityMode(AlivcLivePushQualityMode.custom);
説明quality-firstまたはsmoothness-firstモードを使用する場合、setInitialVideoBitrate、setMinVideoBitrate、およびsetTargetVideoBitrateを呼び出して、初期ビットレート、最小ビットレート、およびターゲットビットレートを指定する必要はありません。 Push SDKは、ネットワークジッタが発生したときにビデオストリームの品質または滑らかさを保証します。
カスタムモードを使用する場合は、推奨設定に基づいてビットレートパラメータを設定します。 推奨設定を次の表に示します。
品質優先モードでのカスタムビットレートの推奨設定
解像度
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
滑らかさでのカスタムビットレートの推奨設定-ファーストモード
解像度
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
アダプティブ解決機能を設定します。
適応解像度機能は、ストリームの解像度を動的に調整するために使用されます。 アダプティブ解像度機能を有効にすると、解像度が自動的に低下し、劣悪なネットワーク条件でビデオストリームの滑らかさと品質が保証されます。 次のサンプルコードに例を示します。
/// Enable the adaptive resolution feature. pusherConfig.setEnableAutoResolution(true);
重要アダプティブ解決機能は、すべてのプレイヤーでサポートされていません。 この機能を使用する必要がある場合は、ApsaraVideo Playerを使用することを推奨します。
アダプティブ解像度機能は、AlivcLivePushQualityModeパラメーターを設定することにより、quality-firstモードまたはsmoothness-firstモードを使用する場合にのみ有効になります。 カスタムモードを使用する場合、この機能は使用できません。
イメージ取り込みを設定します。
Push SDK for Androidを使用すると、アプリケーションがバックグラウンドに切り替えられたとき、またはビットレートが低いときに画像を取り込むことができます。 ユーザーエクスペリエンスが向上します。 アプリケーションをバックグラウンドに切り替えると、ビデオストリームの取り込みが一時停止されます。 この場合、オーディオストリームのみが取り込まれます。 取り込みたいイメージを指定することもできます。 次のサンプルコードに例を示します。
/// Specify the image that is displayed if stream ingest is paused. String pauseImagePath = "xxxx"; // xxxx is the path in which the image is stored. pusherConfig.setPauseImg(pauseImagePath);
ネットワーク条件が悪い場合は、ストリーム取り込み用の静的イメージを指定できます。 ビットレートが低い場合は、吃音を防ぐために指定した画像が取り込まれます。 次のサンプルコードに例を示します。
/// Specify the image that is displayed in poor network conditions. String networkPoorImagePath = "xxxx"; // xxxx is the path in which the image is stored. pusherConfig.setNetworkPoorImg(networkPoorImagePath);
プレビューモードを指定します。
Push SDK for Flutterは、次のプレビューモードをサポートしています。 プレビューモードは、ストリーム取り込みには影響しません。
AlivcPusherPreviewDisplayMode.preview_scale_fill: このモードでは、ビデオはプレビューウィンドウ全体に表示されます。 ビデオのアスペクト比がプレビューウィンドウのアスペクト比と同じでない場合、プレビュー中に変形が発生します。
AlivcPusherPreviewDisplayMode.preview_aspect_fit: このモードでは、プレビュー時にビデオの元のアスペクト比が使用されます。 ビデオのアスペクト比がプレビューウィンドウのアスペクト比と同じでない場合、プレビューウィンドウに黒いバーが表示されます。
AlivcPusherPreviewDisplayMode.preview_aspect_fill: このモードでは、プレビュー中にビデオがプレビューウィンドウに合うようにトリミングされます。 ビデオのアスペクト比がプレビューウィンドウのアスペクト比と同じでない場合、ビデオはトリミングされます。
次のサンプルコードに例を示します。
/// Set the preview mode to AlivcPusherPreviewDisplayMode.preview_aspect_fit. pusherConfig.setPreviewDisplayMode(AlivcPusherPreviewDisplayMode.preview_aspect_fit);
iOSでConfigオブジェクトをリセットします。
iOSでAlivcLivePusherConfigを使用しない場合、このメソッドを呼び出して、Configオブジェクトによって構成されている設定をクリアできます。
AlivcLivePusherのdestroyメソッドを呼び出した後、このメソッドを呼び出すことを推奨します。
/// Reset the Config object on iOS. livePusher.destroyConfigForIOS();
ストリーム取り込みの実行
ストリーム取り込みエンジンを作成します。
livePusher.initLivePusher();
ストリーム取り込みリスナーを登録します。
/// Set the listener for the stream ingest status. livePusher.setInfoDelegate(); /// Set the listener for stream ingest errors. livePusher.setErrorDelegate(); /// Set the listener for the network status during stream ingest. livePusher.setNetworkDelegate();
ストリーム取り込みに関連するコールバックを設定します。
/// Listener for stream ingest errors /// Configure the callback for system errors. livePusher.setOnSDKError((errorCode, errorDescription) {}); /// Configure the callback for system errors. livePusher.setOnSystemError((errorCode, errorDescription) {}); /// Listener for the stream ingest status /// Configure the callback for preview start. livePusher.setOnPreviewStarted(() {}); /// Configure the callback for preview stop. livePusher.setOnPreviewStoped(() {}); /// Configure the callback for first frame rendering. livePusher.setOnFirstFramePreviewed(() {}); /// Configure the callback for start of stream ingest. livePusher.setOnPushStarted(() {}); /// Configure the callback for pause of stream ingest from the camera. livePusher.setOnPushPaused(() {}); /// Configure the callback for resume of stream ingest from the camera. livePusher.setOnPushResumed(() {}); /// Configure the callback for restart of stream ingest. livePusher.setOnPushRestart(() {}); /// Configure the callback for end of stream ingest. livePusher.setOnPushStoped(() {}); /// Listener for the network status during stream ingest /// Configure the callback for failed connections during stream ingest. livePusher.setOnConnectFail((errorCode, errorDescription) {}); /// Configure the callback for network recovery. livePusher.setOnConnectRecovery(() {}); /// Configure the callback for disconnection. livePusher.setOnConnectionLost(() {}); /// Configure the callback for poor network connections. livePusher.setOnNetworkPoor(() {}); /// Configure the callback for failed reconnections. livePusher.setOnReconnectError((errorCode, errorDescription) {}); /// Configure the callback for reconnection start. livePusher.setOnReconnectStart(() {}); /// Configure the callback for successful reconnections. livePusher.setOnReconnectSuccess(() {});
ストリーム取り込み用のプレビュービューを作成します。
var x = 0.0; // The custom value. var y = 0.0; // The custom value. var width = MediaQuery.of(context).size.width; // The custom value. var height = MediaQuery.of(context).size.height; // The custom value. AlivcPusherPreview pusherPreviewView = AlivcPusherPreview( onCreated: _onPusherPreviewCreated, x: x, y: y, width: width, height: height); return Container( color: Colors.black, width: width, height: height, child: pusherPreviewView);
プレビューを開始します。
/// The callback that is fired when a preview view is created. _onPusherPreviewCreated(id) { /// Start preview. livePusher.startPreview(); }
説明Flutterプロジェクトの画面の向きが縦向きであると仮定し、setOrientationを呼び出して画面の向きを横向きに設定します。 プレビュービューを作成し、startPreviewを呼び出してプレビューを開始した後、ビデオがプレビュービュー全体に表示されない場合は、startPreviewを呼び出すまでしばらく待つことをお勧めします。 たとえば、100ミリ秒待ってからstartPreviewを呼び出すことができます。
Future.de layed (期間 (ミリ秒: 100));
ストリームの取り込みを開始します。 プレビューが成功した後にのみ、ストリームの取り込みを開始できます。
String pushURL = "Ingest URL (rtmp://......)"; livePusher.startPushWithURL(pushURL);
他のストリーム取り込み設定を完了します。
/// Pause stream ingest from the camera. Call the pause method to switch from camera ingest to image ingest after you call setPauseImg. The audio stream continues to be ingested. livePusher.pause(); /// Switch from image ingest to camera ingest. The audio stream continues to be ingested. livePusher.resume(); /// Stop a stream that is being ingested. 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. livePusher.stopPreview(); /// Restart stream ingest when the stream is being ingested or when an error callback is received. If an error occurs, you can call only this method or the reconnectPushAsync method to restart stream ingest. You can also call the destroy method to destroy the stream ingest engine. Then, you can restart all AlivcLivePusher resources that are required for operations, such as preview and stream ingest. livePusher.restartPush(); /// Call this method when the stream is being ingested or when an error callback related to setNetworkDelegate is received. If an error occurs, you can call only this method or the restartPush method to restart stream ingest. You can also call the destroy method to destroy the stream ingest engine. Then, you can restart stream ingest over RTMP. livePusher.reconnectPushAsync(); /// Destroy the stream ingest engine. After you call this method, stream ingest and preview are stopped, and the preview window is removed. All resources related to AlivcLivePusher are destroyed. livePusher.destory();
バックグラウンドミュージックを管理します。
/// Start the playback of background music. String musicPath = "xxxx"; // xxxx is the path in which the music resources are stored. 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. livePusher.stopBGMAsync(); /// Pause the playback of background music. You can call this method only after the playback of background music starts. livePusher.pauseBGM(); /// Resume the playback of background music. You can call this method only after the playback of background music is paused. livePusher.resumeBGM(); /// Enable looping. livePusher.setBGMLoop(true); /// Configure noise reduction. If you enable noise reduction, the system filters out non-vocal parts from 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. 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. livePusher.setBGMEarsBack(true); /// Specify the volume of the background music in the mixed audio. livePusher.setBGMVolume(50); // Valid values: 0 to 100. Default value: 50. /// Specify the volume of the human voice in the mixed audio. livePusher.setCaptureVolume(50); // Valid values: 0 to 100. Default value: 50. /// 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 the volume. livePusher.setMute(true);
BGMに関連するコールバックを設定します。
/// Configure the callback for complete playback of background music. livePusher.setOnBGMCompleted(() {}); /// Configure the callback for timeout of the download of background music. livePusher.setOnBGMDownloadTimeout(() {}); /// Configure the callback for failed playback of background music. livePusher.setOnBGMOpenFailed(() {}); /// Configure the callback for paused playback of background music. livePusher.setOnBGMPaused(() {}); /// Configure the callback for playback progress. livePusher.setOnBGMProgress((progress, duration) {}); /// Configure the callback for resumed playback of background music. livePusher.setOnBGMResumed(() {}); /// Configure the callback for start of playback of background music. livePusher.setOnBGMStarted(() {}); /// Configure the callback for stop of playback of background music. livePusher.setOnBGMStoped(() {});
ストリーム取り込みスナップショットを設定します。
/// Configure snapshot settings. String dir = "xxxx"; // xxxx is the path in which snapshots are stored. if (Platform.isIOS) { /// dir parameter: On iOS, the path is a relative path. A custom directory is automatically generated in the system sandbox. If you set this parameter to "", snapshots are stored in the root directory of the system sandbox. /// dirTypeForIOS parameter: Optional. If you do not specify this parameter, snapshots are stored in the [document] directory of the system sandbox. livePusher.snapshot(1, 0, dir, dirTypeForIOS: AlivcLiveSnapshotDirType.document); } else { livePusher.snapshot(1, 0, dir); } /// Set the listener for snapshot capture. livePusher.setSnapshotDelegate(); /// Configure callbacks related to snapshot capture. livePusher.setOnSnapshot((saveResult, savePath, {dirTypeForIOS}) { // The callback that is fired when a snapshot is stored. if (saveResult == true) { if (Platform.isIOS) { // Construct the full path of snapshots in the system sandbox. Format: dirTypeForIOS + savePath. } else { // Obtain the path of screenshots in SD based on the value of savePath. } } });
カメラ関連の操作を実行します。
/// Switch between the front and rear cameras. livePusher.switchCamera(); /// Enable or disable flash. You cannot enable flash for the front camera. livePusher.setFlash(false); /// Adjust the focal length to zoom in or out. If you set the input parameter to a positive number, the system increases the focal length. If you set the input parameter to a negative number, the system decreases the focal length. double max = await livePusher.getMaxZoom(); livePusher.setZoom(min(1.0, max)); /// Configure manual focus. /// The autoFocus parameter specifies whether to enable autofocus. This parameter takes effect only for this configuration. Whether autofocus is enabled otherwise depends on the setAutoFocus method. double pointX = 50.0; // The custom value. double pointY = 50.0; // The custom value. bool autoFocus = true; livePusher.focusCameraAtAdjustedPoint(pointX, pointY, autoFocus); /// Disable autofocus. livePusher.setAutoFocus(false); /// Disable the mirroring mode for preview. livePusher.setPreviewMirror(false); /// Disable the mirroring mode for stream ingest. livePusher.setPushMirror(false);
透かしを設定します。 Flutter用Push SDKを使用すると、1つ以上の透かしを追加できます。 透かしはPNG形式でなければなりません。 次のサンプルコードに例を示します。
String watermarkBundlePath = "xxxx"; //xxxx is the path in which watermark resources are stored. double coordX = 0.1; double coordY = 0.1; double width = 0.3; /// Add a watermark. livePusher.addWatermark(watermarkBundlePath, coordX, coordY, width);
説明coordX、coordY、およびwidthパラメータの値は相対的です。 たとえば、coordXパラメータの値0.1は、透かしの左端がストリーム取り込み画面のx軸上の10% 位置にあることを示します。 したがって、ストリーム解像度が540 × 960の場合、coordXパラメータの値は54となります。
透かしの高さは、ソース画像の幅および高さ、ならびに透かしの入力幅値に基づいてスケーリングされます。
テキスト透かしを追加する場合は、テキストを画像に変換し、addWatermarkメソッドを呼び出して画像を透かしとして追加します。
透かしのエッジの明瞭さと滑らかさを確保するために、出力透かしと同じサイズのソースイメージを使用することをお勧めします。 たとえば、出力ビデオの解像度が544 × 940で、ウォーターマークの幅が0.1fの場合、ソースイメージには544 × 0.1f = 54.4の幅を使用することを推奨します。
外部オーディオおよびビデオソースを設定します。 Push SDK for Flutterを使用すると、ストリーム取り込み用の外部オーディオおよびビデオソースをインポートできます。 たとえば、オーディオまたはビデオファイルを取り込むことができます。
ストリーム取り込み設定で外部オーディオおよびビデオソースの入力を設定します。
/// Enable the input of external streams. pusherConfig.setExternMainStream(true); /// 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. pusherConfig.setExternVideoFormat(AlivcLivePushVideoFormat.YUVNV21); /// 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. pusherConfig.setExternMainStream(AlivcLivePushAudioFormat.S16);
外部ビデオデータをインポートします。
/// The sendVideoData method supports only native YUV and RGB buffer data. You can call the sendVideoData method to transmit video data such as the buffer, length, width, height, timestamp, and rotation angle. Uint8List bufferData = xxxx; // xxxx indicates the continuous video buffer data in the Uint8List format. int width = 720; // The video width. int height = 1280; // The video height. int dataSize = xxxx; // xxxx indicates the size of the data. int pts = xxxx; // xxxx indicates the timestamp in microseconds. int rotation = 0; // The rotation angle. livePusher.sendVideoData(bufferData, width, height, size, pts, rotation);
外部オーディオデータをインポートします。
/// The sendPCMData method supports only native PCM buffer data. You can call this method to transmit audio data such as the buffer, length, and timestamp. Uint8List bufferData = xxxx; // xxxx indicates the continuous audio buffer data in the Uint8List format. int dataSize = xxxx; // xxxx indicates the size of the data. int sampleRate = xxxx; // xxxx indicates the sampling rate. int channel = 0; // The number of sound channels. int pts = xxxx; // xxxx indicates the timestamp in microseconds. livePusher.sendPCMData(bufferData, size, sampleRate, channel, pts);
レタッチ効果の追加
Push SDK for Flutterは、プラグインを使用してレタッチ効果を提供します。 レタッチ機能を使用するには、SDK downloadからソースコードパッケージをダウンロードし、demo > pluginsディレクトリにあるflutter_livepush_beauty_pluginプラグインを使用します。 注: レタッチプラグインは一般に公開されていません。
/// 1. Initialize a retouching object.
AlivcLiveBeautyManager beautyManager = AlivcLiveBeautyManager.init();
beautyManager.setupBeauty();
/// 2. Open the retouching panel.
beautyManager.showPanel();
/// 3. Close the retouching panel (for Android).
beautyManager.hidePanel();
/// 4. Destroy the retouching object.
beautyManager.destroyBeauty();