このトピックでは、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。
前提条件
ビデオ設定を構成する前に、次の要件を満たしていることを確認してください:
有効な Alibaba Cloud アカウントを持ち、リアルタイム音声・映像アプリケーションを作成済みであること。 詳細については、「アプリケーションの作成」をご参照ください。 アプリケーション管理コンソールから App ID と App Key を取得できます。
Alibaba Real-Time Communication (ARTC) SDK をプロジェクトに統合し、基本的なリアルタイムオーディオおよびビデオ機能を実装済みであること。 SDK 統合の詳細については、「SDK のダウンロードと統合」をご参照ください。 オーディオおよびビデオ機能の実装の詳細については、「オーディオおよびビデオ通話の実装」をご参照ください。
実装
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 | 収集プリファレンス。
| |
cameraDirection | カメラの向き (フロントまたはリア)。 | |
fps | int | 収集フレームレート。 デフォルト値は -1 で、エンコーディング設定で指定されたフレームレートが使用されることを示します。 SDK 内のデフォルト値は 15 です。 |
cameraCaptureProfile | ビデオ収集に指定された解像度。
| |
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 | ビデオ解像度。 デフォルト値は 640 × 480 です。 最大値は 1920 × 1080 です。 | |
frameRate | int | ビデオエンコーディングのフレームレート。 デフォルト値は 15 です。 最大値は 30 です。 |
bitrate | int | Kbps 単位のビデオエンコーディングビットレート。 デフォルト値は 512 です。 このパラメーターを 0 に設定すると、SDK はビデオ解像度とフレームレートに基づいて適切なエンコーディングビットレートを計算します。 ビットレートは、解像度とフレームレートに対応する妥当な範囲内にある必要があります。 指定された値が有効範囲外の場合、SDK は自動的にビットレートを有効な値に調整します。 ビットレート、解像度、フレームレート間のマッピングの詳細については、コードコメントをご参照ください。 |
keyFrameInterval | int | キーフレーム間隔 (ミリ秒単位)。 デフォルト値は 0 で、SDK がキーフレーム間隔を制御することを示します。 説明 このパラメーターは、インタラクティブストリーミングシナリオや miniapps との相互運用性が必要なシナリオで設定する必要があります。 |
forceStrictKeyFrameInterval | boolean | エンコーダーに指定された間隔で厳密にキーフレームを生成させるかどうかを指定します。 デフォルト値は false です。
|
mirrorMode | エンコードされたビデオのイメージモード。 このパラメーターは、取り込まれたビデオストリームをミラーリングするかどうかを制御します。 説明
| |
orientationMode | エンコードされたビデオの回転モード。
| |
rotationMode | ビデオの回転角度 (0, 90, 180, または 270)。 | |
codecType | コーデックタイプ。
| |
encodeCodecType | ビデオエンコーディングフォーマット (システムデフォルト、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 = nil6. イメージモードの設定
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 | レンダリングモード。
|
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);
}
}