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

ApsaraVideo Live:一般的なビデオ操作と設定

最終更新日:Nov 05, 2025

このトピックでは、API 呼び出しを使用してビデオプロパティを設定する方法について説明します。

機能紹介

ビデオ通話またはインタラクティブストリーム中に、収集設定、エンコーディング解像度、ビデオフレームレート、ビットレート、イメージモード、表示モードなどのビデオ設定を構成できます。

  • 解像度:

    • 収集解像度: カメラなどのデバイスでキャプチャされたビデオの解像度。

    • エンコーディング解像度: エンコード後のビデオの解像度。

  • ビットレート: 1 秒あたりに送信されるビット数で、ビット/秒 (bps) で測定されます。

  • フレームレート: 1 秒あたりに表示されるフレーム数で、フレーム/秒 (fps) で測定されます。

適切なビデオ解像度、フレームレート、ビットレートを設定することで、オーディオおよびビデオシナリオのユーザーエクスペリエンスを向上させることができます。また、適切なイメージモードと表示モードを選択して、パーソナライズされたビデオ表示を提供することもできます。

サンプルコード

Android の一般的なビデオ操作と設定: Android/ARTCExample/BasicUsage/src/main/java/com/aliyun/artc/api/basicusage/VideoBasicUsage/VideoBasicUsageActivity.java

iOS の一般的なビデオ操作と設定: iOS/ARTCExample/BasicUsage/VideoBasicUsage/VideoBasicUsageVC.swift

前提条件

ビデオ設定を構成する前に、次の要件を満たしていることを確認してください:

実装

1. カメラ収集設定の構成

ARTC は、カメラの向きやキャプチャフレームレートなどのカメラキャプチャ設定を構成するための setCameraCapturerConfiguration メソッドを提供します。

説明
  • このメソッドは、カメラを有効にする前に呼び出す必要があります。 たとえば、startPreview を呼び出してプレビューを開始する前、または joinChannel を呼び出してチャンネルに参加する前に呼び出すことができます。 チャンネルに参加すると、カメラが自動的に有効になります。

  • enableLocalVideo(false) を呼び出してカメラキャプチャを無効にすると、カメラリソースが解放されます。 その後、設定を再構成できます。

このメソッドは次のように定義されています:

/**
 * @brief 収集プリファレンスを設定します。
 * @param cameraCapturerConfiguration プリファレンス設定。
 *      - preference:
 *        - {@link AliRtcCaptureOutputPreference#ALIRTC_CAPTURER_OUTPUT_PREFERENCE_PREVIEW} 高解像度プレビュー。 ビデオ収集では、ビデオプレビューの品質が優先されます。
 *        - {@link AliRtcCaptureOutputPreference#ALIRTC_CAPTURER_OUTPUT_PREFERENCE_PERFORMANCE} 収集解像度は、アップストリーミング解像度に最も近くなります。 デバイスのパフォーマンスが優先されます。
 *        - {@link AliRtcCaptureOutputPreference#ALIRTC_CAPTURER_OUTPUT_PREFERENCE_AUTO} 収集解像度は自動的に調整されます。
 *      - cameraDirection: 収集方向 (フロントカメラまたはリアカメラ) を設定します。
 * @return
 * - 0: 成功
 * - 0 以外の値: 失敗
 * @note このパラメーターは、カメラを有効にする前に設定する必要があります。たとえば、{@link #startPreview} または {@link #joinChannel} を呼び出す前です。
 */
public abstract int setCameraCapturerConfiguration(AliEngineCameraCapturerConfiguration cameraCapturerConfiguration);

次の表にパラメーターを示します。

パラメーター

タイプ

説明

preference

AliRtcCaptureOutputPreference

収集プリファレンス。

  • CAPTURER_OUTPUT_PREFERENCE_AUTO: SDK が自動的に設定を調整します。

  • CAPTURER_OUTPUT_PREFERENCE_PERFORMANCE: パフォーマンスが優先されます。 SDK は、エンコーディングパラメーターに最も近い設定を選択します。

  • CAPTURER_OUTPUT_PREFERENCE_PREVIEW: プレビューが優先されます。 SDK は、より高いカメラ入力パラメーターを選択します。

cameraDirection

AliRtcCameraDirection

カメラの向き (フロントまたはリア)。

fps

int

収集フレームレート。

デフォルト値は -1 で、エンコーディング設定で指定されたフレームレートが使用されることを示します。 SDK 内のデフォルト値は 15 です。

cameraCaptureProfile

AliRtcCameraCaptureProfile

ビデオ収集に指定された解像度。

  • デフォルト。 エンコーダーの設定が使用されます。

  • 1080p。

textureEncode

int

(Android のみ) テクスチャエンコーディングを使用するかどうかを指定します。

cameraTextureCapture

int

(Android のみ) カメラのテクスチャ収集を有効にするかどうかを指定します。

次のコードは、このメソッドを呼び出す方法の例を示しています:

Android

AliRtcEngine.AliEngineCameraCapturerConfiguration config = new AliRtcEngine.AliEngineCameraCapturerConfiguration();
config.preference = AliRtcEngine.AliRtcCaptureOutputPreference.ALIRTC_CAPTURER_OUTPUT_PREFERENCE_AUTO;
config.cameraCaptureProfile = AliRtcEngine.AliRtcCameraCaptureProfile.ALIRTC_CAMERA_CAPTURER_PROFILE_DEFAULT;
config.cameraDirection = AliRtcEngine.AliRtcCameraDirection.CAMERA_FRONT;
config.fps = 30;
mAliRtcEngine.setCameraCapturerConfiguration(config);

iOS

let cameraCaptureConfig: AliRtcCameraCapturerConfiguration = AliRtcCameraCapturerConfiguration()
cameraCaptureConfig.preference = .auto
cameraCaptureConfig.cameraCaptureProfile = .profileDefault
cameraCaptureConfig.cameraDirection = .front
cameraCaptureConfig.fps = 30
engine.setCameraCapturerConfiguration(cameraCaptureConfig)

2. ビデオエンコーディング設定の構成

ARTC は、ビデオエンコーディング設定を構成するための setVideoEncoderConfiguration メソッドを提供します。 これらの設定には、ビデオ解像度、フレームレート、ビットレート、キーフレーム間隔などのビデオ品質パラメーターが含まれ、さまざまなネットワーク条件下でビデオストリームがどのように表示されるかを制御します。

説明

setVideoEncoderConfiguration は、チャンネルに参加する前または後に呼び出すことができます。 通話中に一度だけ設定を構成する場合は、チャンネルに参加する前に設定することをお勧めします。

次の表にパラメーターを示します。

パラメーター

タイプ

説明

dimensions

AliRtcVideoDimensions

ビデオ解像度。 デフォルト値は 640 × 480 です。 最大値は 1920 × 1080 です。

frameRate

int

ビデオエンコーディングのフレームレート。 デフォルト値は 15 です。 最大値は 30 です。

bitrate

int

Kbps 単位のビデオエンコーディングビットレート。 デフォルト値は 512 です。 このパラメーターを 0 に設定すると、SDK はビデオ解像度とフレームレートに基づいて適切なエンコーディングビットレートを計算します。

ビットレートは、解像度とフレームレートに対応する妥当な範囲内にある必要があります。 指定された値が有効範囲外の場合、SDK は自動的にビットレートを有効な値に調整します。 ビットレート、解像度、フレームレート間のマッピングの詳細については、コードコメントをご参照ください。

keyFrameInterval

int

キーフレーム間隔 (ミリ秒単位)。 デフォルト値は 0 で、SDK がキーフレーム間隔を制御することを示します。

説明

このパラメーターは、インタラクティブストリーミングシナリオや miniapps との相互運用性が必要なシナリオで設定する必要があります。

forceStrictKeyFrameInterval

boolean

エンコーダーに指定された間隔で厳密にキーフレームを生成させるかどうかを指定します。 デフォルト値は false です。

  • false: エンコーダーは、別のユーザーがチャンネルに参加したときなど、キーフレームリクエストに応答します。 キーフレーム間隔は、指定された値と厳密には一致しません。

  • true: エンコーダーは他のキーフレームリクエストに応答せず、指定された間隔で厳密にキーフレームを生成します。 これにより、サブスクライバーの最初のフレームのレイテンシーが増加する可能性があります。

mirrorMode

AliRtcVideoEncoderMirrorMode

エンコードされたビデオのイメージモード。 このパラメーターは、取り込まれたビデオストリームをミラーリングするかどうかを制御します。

説明

setVideoMirrorMode インターフェイスを呼び出してイメージモードを設定できます。

orientationMode

AliRtcVideoEncoderOrientationMode

エンコードされたビデオの回転モード。

  • Adaptive: キャプチャされたビデオに一致します。

  • FixedLandscape: ビデオは固定ランドスケープモードです。

  • FixedPortrait: ビデオは固定ポートレートモードです。

rotationMode

AliRtcRotationMode

ビデオの回転角度 (0, 90, 180, または 270)。

codecType

AliRtcVideoCodecType

コーデックタイプ。

  • default: デフォルトのデバイス設定が使用されます。

  • software: ソフトウェアエンコーディング。

  • hardware: ハードウェアデコーディングを有効にします。

  • hardwareTexture: ハードウェアテクスチャエンコーディング。

encodeCodecType

AliRtcVideoEncodeCodecType

ビデオエンコーディングフォーマット (システムデフォルト、H.264、または H.265)。

seiForceFrontIFrame

int

Supplemental Enhancement Information (SEI) を送信する前に I フレームを強制します。

-1 はデフォルト値が使用されることを示します。 0 は I フレームが強制されないことを示します。 1 は I フレームが強制されることを示します (デフォルト)。

次のコードは、このメソッドを呼び出す方法の例を示しています:

Android

AliRtcEngine.AliRtcVideoEncoderConfiguration aliRtcVideoEncoderConfiguration = new AliRtcEngine.AliRtcVideoEncoderConfiguration();
aliRtcVideoEncoderConfiguration.dimensions = new AliRtcEngine.AliRtcVideoDimensions(720, 1280);
aliRtcVideoEncoderConfiguration.frameRate = 20;
aliRtcVideoEncoderConfiguration.bitrate = 1200;
aliRtcVideoEncoderConfiguration.keyFrameInterval = 2000;
aliRtcVideoEncoderConfiguration.orientationMode = AliRtcVideoEncoderOrientationModeAdaptive;
mAliRtcEngine.setVideoEncoderConfiguration(aliRtcVideoEncoderConfiguration);

iOS

let config = AliRtcVideoEncoderConfiguration()
config.dimensions = CGSize(width: 720, height: 1280)
config.frameRate = 20
config.bitrate = 1200
config.keyFrameInterval = 2000
config.orientationMode = AliRtcVideoEncoderOrientationMode.adaptive
engine.setVideoEncoderConfiguration(config)

3. カメラの向きを切り替える

Android および iOS デバイスには通常、フロントカメラとリアカメラがあります。 デフォルトでは、SDK はフロントカメラを使用します。 カメラを有効にする前にカメラを変更するには、setCameraCaptureConfiguration メソッドを呼び出します。 カメラがすでに有効になっている場合は、switchCamera メソッドを呼び出して、フロントカメラとリアカメラを切り替えることができます。

/**
 * @brief フロントカメラとリアカメラを切り替えます。
 * @return
 * - 0: 成功
 * - 0 以外の値: 失敗
 * @note このインターフェイスは iOS と Android でのみ利用可能です。
 */
public abstract int switchCamera();

次のコードは、このメソッドを呼び出す方法の例を示しています:

Android

mSwitchCameraBtn.setOnClickListener(v -> {
    if(mAliRtcEngine != null) {
        mAliRtcEngine.switchCamera();
    }
});

iOS

@IBAction func onCameraDirectionChanged(_ sender: UISegmentedControl) {
    rtcEngine?.switchCamera()
}

4. カメラの有効化/無効化

オーディオおよびビデオ通話中に、ARTC が提供する muteLocalCamera および enableLocalVideo メソッドを使用してカメラを有効または無効にできます。

インターフェイス

muteLocalCamera

enableLocalVideo

原理

ビデオストリームを黒いフレームに置き換えます。

カメラハードウェアによるビデオキャプチャを停止し、関連リソースを解放します。

カメラシャットダウンの問題

ローカルプレビューは表示され続けますが、リモートユーザーには黒い画面が表示されます。

ローカルプレビューとリモートビューの両方が、最後にキャプチャされたフレームでフリーズします。

特徴

  • ビデオストリーム接続を維持します。 受信側はビデオの中断を認識しません。

  • 高速な切り替え。 このメソッドはカメラハードウェアを頻繁に起動および停止しないため、応答レイテンシーが低くなります。 このメソッドは、カメラを動的に有効/無効にする必要があるシナリオに適しています。

  • カメラリソースを解放します。

  • 低速な切り替え。 このメソッドはカメラハードウェアを有効または無効にするため、応答レイテンシーが高くなります。 このメソッドは、オーディオのみのモードなど、カメラが長時間無効になるシナリオに適しています。

4.1. ビデオデータの送信を停止または再開する

ARTC は、ビデオミュート機能のために muteLocalCamera メソッドを提供します。 このメソッドは、ビデオキャプチャ、エンコーディング、および伝送チャネルをアクティブに保ちますが、リモートユーザーには黒いビデオフレームを送信します。 ローカルプレビューは影響を受けません。 このメソッドは次のように定義されています:

/**
 * ローカルビデオデータの送信を停止または再開します。
 * @param mute     true: 黒いフレームを送信します。 false: 通常の送信を再開します。
 * @param track    {@link AliRtcVideoTrack#AliRtcVideoTrackCamera} のみがサポートされています。
 * @return
 * - 0: 成功
 * - 0 以外の値: 失敗
 * @note 黒いビデオフレームを送信します。 ローカルプレビューは正常です。 収集、エンコーディング、送信モジュールはまだ動作していますが、ビデオコンテンツは黒いフレームに置き換えられます。
 */
public abstract int muteLocalCamera(boolean mute, AliRtcVideoTrack track);
/**
 * @brief リモートユーザーが黒いビデオフレームを送信しているという通知。
 * @param uid muteVideo を呼び出したユーザーの ID。
 * @param isMute
 * - true: 黒いフレームが取り込まれます。
 * - false: 通常のアップストリーミング。
 * @note このインターフェイスは、リモートユーザーが黒いビデオフレームを送信したときにトリガーされるコールバックです。
 */
public void onUserVideoMuted(String uid ,boolean isMute){}

次のコードに例を示します:

Android

ローカルカメラをミュートまたはミュート解除します:

if(!isMutedCamera) {
    mAliRtcEngine.muteLocalCamera(true, AliRtcEngine.AliRtcVideoTrack.AliRtcVideoTrackCamera);
    mPublishVideoBtn.setText(R.string.resume_pub_video);
    isMutedCamera = true;
} else {
    mAliRtcEngine.muteLocalCamera(false, AliRtcEngine.AliRtcVideoTrack.AliRtcVideoTrackCamera);
    mPublishVideoBtn.setText(R.string.stop_pub_video);
    isMutedCamera = false;
}

リモートコールバックをリッスンします:

@Override
public void onUserVideoMuted(String uid ,boolean isMute){
    handler.post(new Runnable() {
        @Override
        public void run() {
            ToastHelper.showToast(VideoBasicUsageActivity.this, "remote user uid:" + uid + " camera mute:" + isMute, Toast.LENGTH_SHORT);
        }
    });
}

iOS

カメラデータ収集を有効または無効にします:

@IBAction func onVideoMuteSwitched(_ sender: UISwitch) {
    if sender.isOn {
        // Black frames
        rtcEngine?.muteLocalCamera(false, for: AliRtcVideoTrack.camera)
    } else {
        rtcEngine?.muteLocalCamera(true, for: AliRtcVideoTrack.camera)
    }
}

リモート側でコールバックをリッスンできます:

extension VideoBasicUsageVC: AliRtcEngineDelegate {
    func onUserVideoMuted(_ uid: String, videoMuted isMute: Bool) {
        "onUserVideoMuted: user id \(uid) video muted: \(isMute)".printLog()
    }
}

4.2. カメラ収集の有効化/無効化

enableLocalVideo メソッドは、カメラなどのローカルビデオキャプチャデバイスをグローバルに制御します。 これは、ビデオデータストリームの生成と送信に直接影響します。

/**
 * @brief ローカルビデオ収集を無効または有効にします。
 * @param enabled
 * - true: ローカルビデオ収集を有効にします。
 * - false: ローカルビデオ収集を無効にします。
 * @return
 * - 0: 成功
 * - < 0: 失敗
 * @note デフォルトでは、この機能は有効になっています。 {@link AliRtcEngineNotify#onUserVideoEnabled} をリッスンして、ローカルビデオ収集のステータスを取得できます。
 */
public abstract int enableLocalVideo(boolean enabled);
/**
 * @brief リモートユーザーがカメラストリーム収集を無効にしたという通知。
 * @param uid enableLocalVideo を呼び出したユーザーの ID。
 * @param isEnable
 * - true: カメラストリーム収集が有効になっています。
 * - false: カメラストリーム収集が無効になっています。
 * @note このインターフェイスは、リモートユーザーがカメラストリーム収集を無効にしたときにトリガーされるコールバックです。
 */
public void onUserVideoEnabled(String uid, boolean isEnable){}

次のコードは、このメソッドを呼び出す方法の例を示しています:

Android

カメラを有効または無効にします:

mCameraSwitchBtn = findViewById(R.id.camera_control_btn);
mCameraSwitchBtn.setOnClickListener(v -> {
    if(mAliRtcEngine != null) {
        if(isEnableCamera) {
            mAliRtcEngine.enableLocalVideo(false);
            isEnableCamera = false;
            mCameraSwitchBtn.setText(R.string.camera_on);
        } else {
            mAliRtcEngine.enableLocalVideo(true);
            isEnableCamera = true;
            mCameraSwitchBtn.setText(R.string.camera_off);
        }
    }
});

リモートコールバックをリッスンします:

@Override
public void onUserVideoEnabled(String uid, boolean isEnable) {
    handler.post(new Runnable() {
        @Override
        public void run() {
            ToastHelper.showToast(VideoBasicUsageActivity.this, "remote user uid:" + uid + " camera enable:" + isEnable, Toast.LENGTH_SHORT);
        }
    });
}

iOS

カメラ収集を有効または無効にします:

@IBAction func onCameraSwitch(_ sender: UISwitch) {
    if sender.isOn {
        rtcEngine?.enableLocalVideo(true)
    } else {
        rtcEngine?.enableLocalVideo(false)
    }
    updateCaptureUIVisibility()
}

リモートコールバックをリッスンします:

extension VideoBasicUsageVC: AliRtcEngineDelegate {
    func onUserVideoEnabled(_ uid: String?, videoEnabled isEnable: Bool) {
        "onUserVideoEnabled: user id \(uid ?? "invalid uid") video enable: \(isEnable)".printLog()
    }
}

5. プレビューの開始または停止

ARTC は、ローカルプレビューを開始および停止するための startPreview および stopPreview メソッドを提供します。

次の点に注意してください:

  • プレビューを開始する前に、setLocalViewConfig を呼び出してローカルプレビューのレンダリングビューを設定する必要があります。

  • デフォルトでは、SDK はチャンネルに参加するとプレビューを開始します。 チャンネルに参加する前にプレビューを開始するには、startPreview を呼び出します。

  • プレビューを停止するメソッドを呼び出すと、ローカルプレビュー画面は最後にキャプチャされたフレームでフリーズします。

次のフローチャートは、プレビューを開始するプロセスを示しています。

次のコードに例を示します:

Android

プレビューを開始します:

private void startPreview() {
    if (mAliRtcEngine != null) {
        ViewGroup.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

        // Set the local view.
        if (mLocalVideoCanvas == null) {
            mLocalVideoCanvas = new AliRtcEngine.AliRtcVideoCanvas();
            SurfaceView localSurfaceView = mAliRtcEngine.createRenderSurfaceView(VideoBasicUsageActivity.this);
            if (localSurfaceView != null) {
                localSurfaceView.setZOrderOnTop(true);
                localSurfaceView.setZOrderMediaOverlay(true);
                fl_local.addView(localSurfaceView, layoutParams);
                mLocalVideoCanvas.view = localSurfaceView;
                try {
                    mAliRtcEngine.setLocalViewConfig(mLocalVideoCanvas, AliRtcVideoTrackCamera);
                } catch (Exception e) {
                    e.printStackTrace(); // 潜在的な例外を処理
                }
            }
        }
        // Start the preview.
        mAliRtcEngine.startPreview();
    }
}

プレビューを停止します:

mAliRtcEngine.stopPreview();
mAliRtcEngine.setLocalViewConfig(null, AliRtcVideoTrackCamera);
mAliRtcEngine.leaveChannel();
mAliRtcEngine.destroy();
mAliRtcEngine = null;

iOS

プレビューを開始します:

func startPreview() {
    let seatView = self.createSeatView(uid: self.userId)
    
    let canvas = AliVideoCanvas()
    canvas.view = seatView.canvasView
    canvas.renderMode = .auto
    canvas.mirrorMode = .onlyFrontCameraPreviewEnabled
    canvas.rotationMode = ._0
    
    self.rtcEngine?.setLocalViewConfig(canvas, for: AliRtcVideoTrack.camera)
    self.rtcEngine?.startPreview()
}

プレビューを停止します:

self.rtcEngine?.stopPreview()
self.rtcEngine?.leaveChannel()
AliRtcEngine.destroy()
self.rtcEngine = nil

6. イメージモードの設定

ARTC は、ローカルビデオプレビューと公開されたストリームのミラーリングを制御するための setVideoMirrorMode メソッドを提供します。 モードは実行時に動的に調整できます。 このメソッドは、オーディオおよびビデオ通話やインタラクティブストリーミングなどのシナリオに適しています。

/**
 * @brief プレビューとアップストリーミングのイメージ機能を設定します。
 * @param mirrorMode イメージモード。
 * @return
 * - 0: 設定は成功しました。
 * - <0: 設定に失敗しました。
 *  - AliRtcErrInner: 内部 SDK ステータスエラーが発生しました。 SDK インスタンスが正常に作成されたかどうかを確認してください。
 *
 * @note
 * - このインターフェイスは、チャンネルに参加する前後に動的に設定できます。 SDK はステータスを記録し、プレビューとエンコーディングが操作可能になったときにビデオ操作を実行します。
 * - このインターフェイスは、setLocalViewConfig および setVideoEncoderConfiguration よりも優先度が高くなります。
 * - このインターフェイスは、setLocalViewConfiguration および setVideoEncoderConfiguration のミラーパラメーターと重複します。 1 つのメソッドのみを使用することをお勧めします。
 */
public abstract int setVideoMirrorMode(AliRtcVideoPipelineMirrorMode mirrorMode);

次の表にイメージモードを示します。

列挙値

説明

AliRtcVideoPipelineMirrorModeNoMirror

プレビューとエンコーディングの両方でイメージが無効になります。

AliRtcVideoPipelineMirrorModeBothMirror

プレビューとエンコーディングの両方でイメージが有効になります (デフォルト)。

AliRtcVideoPipelineMirrorModeOnlyPreviewMirror

プレビューでのみイメージが有効になります。

AliRtcVideoPipelineMirrorModeOnlyPublishMirror

取り込まれたストリームでのみイメージが有効になります。

次のコードに例を示します:

Android

mMirrorSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
        if(mAliRtcEngine != null) {
            AliRtcEngine.AliRtcVideoPipelineMirrorMode mirrorMode = AliRtcEngine.AliRtcVideoPipelineMirrorMode.values()[position];
            mAliRtcEngine.setVideoMirrorMode(mirrorMode);
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {

    }
});

iOS

let mirrorMode: AliRtcVideoPipelineMirrorMode = {
    switch row {
    case 0: return .bothMirror
    case 1: return .noMirror
    case 2: return .onlyPreviewMirror
    case 3: return .onlyPublishMirror
    default: return .bothMirror
    }
}()
self.rtcEngine?.setVideoMirrorMode(mirrorMode)

7. レンダリングビューの設定

ローカルプレビューまたはリモートユーザーのビデオを表示する前に、setLocalViewConfig または setRemoteViewConfig メソッドを呼び出して、対応するレンダリングビューを設定する必要があります。

// ローカルプレビュー表示ビューを設定します。
public abstract int setLocalViewConfig(AliRtcVideoCanvas viewConfig, AliRtcVideoTrack track);
// リモートユーザーの表示ビューを設定します。
public abstract int setRemoteViewConfig(AliRtcVideoCanvas canvas, String uid, AliRtcVideoTrack track);

次の表に、AliRtcVideoCanvas の一般的な設定を示します。

パラメーター

タイプ

説明

view

View

表示ビュー (必須)。

renderMode

AliRtcRenderMode

レンダリングモード。

  • Auto: 自動モード。

  • Stretch: ストレッチして塗りつぶすモード。 入力ビデオの縦横比がアップストリーミング用に設定された縦横比と異なる場合、入力ビデオは指定された比率に引き伸ばされ、歪みが生じる可能性があります。

  • Fill: 黒枠付きフィットモード。 入力ビデオの縦横比がアップストリーミング用に設定された縦横比と異なる場合、入力ビデオの上下または左右に黒枠が追加されます。

  • Clip: トリミングモード。 入力ビデオの縦横比がアップストリーミング用に設定された縦横比と異なる場合、入力ビデオの幅または高さがトリミングされ、コンテンツが失われる可能性があります。

mirrorMode

AliRtcRenderMirrorMode

イメージモード。

  • イメージはフロントカメラでのみ有効です。

  • イメージはすべてで有効です。

  • イメージはすべてで無効です。

rotationMode

AliRtcRotationMode

回転モード (0, 90, 180, または 270)。

backgroundColor

int

16 進数 RGB 形式の背景色 (例: 0x000000)。

textureId

int

(Android のみ) サードパーティの OpenGL ES テクスチャ表示をサポートします。 テクスチャ ID。

textureWidth

int

(Android のみ) サードパーティの OpenGL ES テクスチャ表示をサポートします。 テクスチャの幅。

textureHeight

int

(Android のみ) サードパーティの OpenGL ES テクスチャ表示をサポートします。 テクスチャの高さ。

sharedContext

long

(Android のみ) サードパーティの OpenGL ES テクスチャ表示をサポートします。 共有テクスチャコンテキスト。

次のコードに例を示します:

7.1. ローカルレンダリングビューの設定

Android

mLocalVideoCanvas = new AliRtcEngine.AliRtcVideoCanvas();
// SurfaceView を取得して設定します。
SurfaceView localSurfaceView = mAliRtcEngine.createRenderSurfaceView(VideoChatActivity.this);
localSurfaceView.setZOrderOnTop(true);
localSurfaceView.setZOrderMediaOverlay(true);
FrameLayout fl_local = findViewById(R.id.fl_local);
fl_local.addView(localSurfaceView, layoutParams);
mLocalVideoCanvas.view = localSurfaceView;
// ローカルプレビュービューを設定します。
mAliRtcEngine.setLocalViewConfig(mLocalVideoCanvas, AliRtcVideoTrackCamera);
mAliRtcEngine.startPreview();

iOS

let videoView = self.createVideoView(uid: self.userId)

let canvas = AliVideoCanvas()
canvas.view = videoView.canvasView
canvas.renderMode = .auto
canvas.mirrorMode = .onlyFrontCameraPreviewEnabled
canvas.rotationMode = ._0

self.rtcEngine?.setLocalViewConfig(canvas, for: AliRtcVideoTrack.camera)
self.rtcEngine?.startPreview()

Windows

AliEngineVideoCanvas canvas;
/* Windows ウィンドウハンドル */
canvas.view = mHWnd;
mAliRtcEngine.setLocalViewConfig(canvas, AliEngineVideoTrackCamera);

7.2. リモートレンダリングビューの設定

Android

@Override
public void onRemoteTrackAvailableNotify(String uid, AliRtcEngine.AliRtcAudioTrack audioTrack, AliRtcEngine.AliRtcVideoTrack videoTrack){
    handler.post(new Runnable() {
        @Override
        public void run() {
            if(videoTrack == AliRtcVideoTrackCamera) {
                SurfaceView surfaceView = mAliRtcEngine.createRenderSurfaceView(VideoChatActivity.this);
                surfaceView.setZOrderMediaOverlay(true);
                FrameLayout fl_remote = findViewById(R.id.fl_remote);
                if (fl_remote == null) {
                    return;
                }
                fl_remote.addView(surfaceView, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
                AliRtcEngine.AliRtcVideoCanvas remoteVideoCanvas = new AliRtcEngine.AliRtcVideoCanvas();
                remoteVideoCanvas.view = surfaceView;
                mAliRtcEngine.setRemoteViewConfig(remoteVideoCanvas, uid, AliRtcVideoTrackCamera);
            } else if(videoTrack == AliRtcVideoTrackNo) {
                FrameLayout fl_remote = findViewById(R.id.fl_remote);
                fl_remote.removeAllViews();
                mAliRtcEngine.setRemoteViewConfig(null, uid, AliRtcVideoTrackCamera);
            }
        }
    });
}

iOS

func onRemoteTrackAvailableNotify(_ uid: String, audioTrack: AliRtcAudioTrack, videoTrack: AliRtcVideoTrack) {
    "onRemoteTrackAvailableNotify uid: \(uid) audioTrack: \(audioTrack)  videoTrack: \(videoTrack)".printLog()
    // The stream status of the remote user.
    if audioTrack != .no {
        let videoView = self.videoViewList.first { $0.uidLabel.text == uid }
        if videoView == nil {
            _ = self.createVideoView(uid: uid)
        }
    }
    if videoTrack != .no {
        var videoView = self.videoViewList.first { $0.uidLabel.text == uid }
        if videoView == nil {
            videoView = self.createVideoView(uid: uid)
        }

        let canvas = AliVideoCanvas()
        canvas.view = videoView!.canvasView
        canvas.renderMode = .auto
        canvas.mirrorMode = .onlyFrontCameraPreviewEnabled
        canvas.rotationMode = ._0
        self.rtcEngine?.setRemoteViewConfig(canvas, uid: uid, for: AliRtcVideoTrack.camera)
    }
    else {
        self.rtcEngine?.setRemoteViewConfig(nil, uid: uid, for: AliRtcVideoTrack.camera)
    }

    if audioTrack == .no && videoTrack == .no {
        self.removeVideoView(uid: uid)
        self.rtcEngine?.setRemoteViewConfig(nil, uid: uid, for: AliRtcVideoTrack.camera)
    }
}

Windows

virtual void OnRemoteTrackAvailableNotify(const char *uid, AliEngineAudioTrack audioTrack, AliEngineVideoTrack videoTrack) {
    AliEngineVideoCanvas remote_canvas;
    if (videoTrack == AliEngineVideoTrackCamera
        || videoTrack == AliEngineVideoTrackBoth) {
        RECT rect;
        ::GetWindowRect(mHWnd, &rect);
        remote_canvas.displayView = remoteView;
        remote_canvas.renderMode = AliEngineRenderModeAuto;
        mAliRtcEngine->SetRemoteViewConfig(remote_canvas,uid,AliEngineVideoTrackCamera);
    } else {
        mAliRtcEngine->SetRemoteViewConfig(remote_canvas, uid, AliEngineVideoTrackCamera);
    }
}