Topik ini menjelaskan cara mengonfigurasi properti video menggunakan panggilan API.
Pengenalan fitur
Selama panggilan video atau streaming interaktif, Anda dapat mengonfigurasi pengaturan video seperti konfigurasi koleksi, resolusi encoding, laju frame video, bitrate, mode gambar, dan mode tampilan.
Resolusi:
Resolusi Koleksi: Resolusi video yang ditangkap oleh perangkat, seperti kamera.
Resolusi Encoding: Resolusi video setelah di-encode.
Bitrate: Jumlah bit yang ditransmisikan per detik, diukur dalam bit per detik (bps).
Laju Frame: Jumlah frame yang ditampilkan per detik, diukur dalam frame per detik (fps).
Dengan menyetel resolusi video, laju frame, dan bitrate yang sesuai, Anda dapat meningkatkan pengalaman pengguna untuk skenario audio dan video Anda. Anda juga dapat memilih mode gambar dan tampilan yang sesuai untuk menawarkan tampilan video yang dipersonalisasi.
Kode contoh
Operasi dan Konfigurasi Video Umum untuk Android: Android/ARTCExample/BasicUsage/src/main/java/com/aliyun/artc/api/basicusage/VideoBasicUsage/VideoBasicUsageActivity.java.
Operasi dan Konfigurasi Video Umum untuk iOS: iOS/ARTCExample/BasicUsage/VideoBasicUsage/VideoBasicUsageVC.swift.
Prasyarat
Sebelum mengonfigurasi pengaturan video, pastikan Anda telah memenuhi persyaratan berikut:
Anda memiliki Akun Alibaba Cloud yang valid dan telah membuat aplikasi ApsaraVideo Real-time Communication. Untuk informasi lebih lanjut, lihat Buat Aplikasi. Anda dapat memperoleh App ID dan App Key dari Konsol Manajemen Aplikasi.
Anda telah mengintegrasikan SDK Alibaba Real-Time Communication (ARTC) ke dalam proyek Anda dan menerapkan fitur audio dan video real-time dasar. Untuk informasi lebih lanjut tentang integrasi SDK, lihat Unduh dan Integrasi SDK. Untuk informasi lebih lanjut tentang penerapan fitur audio dan video, lihat Implementasikan Panggilan Audio dan Video.
Implementasi
1. Setel konfigurasi koleksi kamera
ARTC menyediakan metode setCameraCapturerConfiguration untuk mengonfigurasi pengaturan penangkapan kamera, termasuk arah kamera dan laju frame penangkapan.
Anda harus memanggil metode ini sebelum mengaktifkan kamera. Misalnya, Anda dapat memanggilnya sebelum memanggil startPreview untuk memulai pratinjau atau joinChannel untuk bergabung dengan saluran. Bergabung dengan saluran secara otomatis mengaktifkan kamera.
Memanggil
enableLocalVideo(false)untuk menonaktifkan penangkapan kamera melepaskan sumber daya kamera. Anda kemudian dapat mengonfigurasi ulang pengaturannya.
Metode ini didefinisikan sebagai berikut:
/**
* @brief Mengatur preferensi koleksi.
* @param cameraCapturerConfiguration Pengaturan preferensi.
* - preference:
* - {@link AliRtcCaptureOutputPreference#ALIRTC_CAPTURER_OUTPUT_PREFERENCE_PREVIEW} Pratinjau definisi tinggi. Pengumpulan video memprioritaskan kualitas pratinjau video.
* - {@link AliRtcCaptureOutputPreference#ALIRTC_CAPTURER_OUTPUT_PREFERENCE_PERFORMANCE} Resolusi koleksi mendekati resolusi stream ingest. Performa perangkat diprioritaskan.
* - {@link AliRtcCaptureOutputPreference#ALIRTC_CAPTURER_OUTPUT_PREFERENCE_AUTO} Resolusi koleksi disesuaikan secara otomatis.
* - cameraDirection: Mengatur arah koleksi, yang bisa berupa kamera depan atau belakang.
* @return
* - 0: sukses
* - Nilai bukan nol: gagal
* @note Anda harus menyetel parameter ini sebelum Anda mengaktifkan kamera, misalnya, sebelum Anda memanggil {@link #startPreview} atau {@link #joinChannel}.
*/
public abstract int setCameraCapturerConfiguration(AliEngineCameraCapturerConfiguration cameraCapturerConfiguration);Tabel berikut menjelaskan parameter.
Parameter | Tipe | Deskripsi |
preference | Preferensi koleksi.
| |
cameraDirection | Arah kamera (depan atau belakang). | |
fps | int | Laju frame koleksi. Nilai default adalah -1, yang menunjukkan bahwa laju frame yang ditentukan dalam konfigurasi encoding digunakan. Nilai default dalam SDK adalah 15. |
cameraCaptureProfile | Resolusi yang ditentukan untuk koleksi video.
| |
textureEncode | int | (Hanya Android) Menentukan apakah akan menggunakan encoding tekstur. |
cameraTextureCapture | int | (Hanya Android) Menentukan apakah akan mengaktifkan koleksi tekstur untuk kamera. |
Kode berikut memberikan contoh cara memanggil metode ini:
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. Setel konfigurasi encoding video
ARTC menyediakan metode setVideoEncoderConfiguration untuk mengonfigurasi pengaturan encoding video. Pengaturan ini mencakup parameter kualitas video, seperti resolusi video, laju frame, bitrate, dan interval keyframe, yang mengontrol bagaimana aliran video ditampilkan di bawah kondisi jaringan yang berbeda.
Anda dapat memanggil setVideoEncoderConfiguration sebelum atau setelah bergabung dengan saluran. Untuk menyetel konfigurasi hanya sekali selama panggilan, kami sarankan Anda menyetelnya sebelum bergabung dengan saluran.
Tabel berikut menjelaskan parameter.
Parameter | Tipe | Deskripsi |
dimensions | Resolusi video. Nilai default adalah 640 × 480. Nilai maksimum adalah 1920 × 1080. | |
frameRate | int | Laju frame encoding video. Nilai default adalah 15. Nilai maksimum adalah 30. |
bitrate | int | Bitrate encoding video dalam Kbps. Nilai default adalah 512. Jika Anda menyetel parameter ini ke 0, SDK menghitung bitrate encoding yang tepat berdasarkan resolusi video dan laju frame. Bitrate harus berada dalam rentang yang wajar yang sesuai dengan resolusi dan laju frame. Jika nilai yang ditentukan berada di luar rentang valid, SDK secara otomatis menyesuaikan bitrate ke nilai yang valid. Untuk informasi lebih lanjut tentang pemetaan antara bitrate, resolusi, dan laju frame, lihat komentar kode. |
keyFrameInterval | int | Interval keyframe dalam milidetik. Nilai default adalah 0, yang menunjukkan bahwa SDK mengontrol interval keyframe. Catatan Parameter ini harus disetel dalam skenario streaming interaktif dan skenario yang memerlukan interoperabilitas dengan program mini. |
forceStrictKeyFrameInterval | boolean | Menentukan apakah memaksa encoder untuk secara ketat menghasilkan keyframe pada interval yang ditentukan. Nilai default adalah false.
|
mirrorMode | Mode gambar untuk video yang di-encode. Parameter ini mengontrol apakah aliran video yang dimasukkan dicerminkan. Catatan Anda dapat memanggil antarmuka | |
orientationMode | Mode rotasi untuk video yang di-encode.
| |
rotationMode | Sudut rotasi video (0, 90, 180, atau 270). | |
codecType | Jenis codec.
| |
encodeCodecType | Format encoding video (default sistem, H.264, atau H.265). | |
seiForceFrontIFrame | int | Memaksa I-frame sebelum mengirim Informasi Peningkatan Tambahan (SEI). -1 menunjukkan bahwa nilai default digunakan. 0 menunjukkan bahwa I-frame tidak dipaksa. 1 menunjukkan bahwa I-frame dipaksa (default). |
Kode berikut memberikan contoh cara memanggil metode ini:
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. Beralih arah kamera
Perangkat Android dan iOS biasanya memiliki kamera depan dan belakang. Secara default, SDK menggunakan kamera depan. Untuk mengubah kamera sebelum diaktifkan, Anda dapat memanggil metode setCameraCaptureConfiguration. Jika kamera sudah diaktifkan, Anda dapat memanggil metode switchCamera untuk beralih antara kamera depan dan belakang.
/**
* @brief Beralih antara kamera depan dan belakang.
* @return
* - 0: sukses
* - Nilai bukan nol: gagal
* @note Antarmuka ini hanya tersedia untuk iOS dan Android.
*/
public abstract int switchCamera();Kode berikut memberikan contoh cara memanggil metode ini:
Android
mSwitchCameraBtn.setOnClickListener(v -> {
if(mAliRtcEngine != null) {
mAliRtcEngine.switchCamera();
}
});iOS
@IBAction func onCameraDirectionChanged(_ sender: UISegmentedControl) {
rtcEngine?.switchCamera()
}4. Aktifkan atau nonaktifkan kamera
Selama panggilan audio dan video, Anda dapat mengaktifkan atau menonaktifkan kamera menggunakan metode muteLocalCamera dan enableLocalVideo yang disediakan oleh ARTC.
Antarmuka | muteLocalCamera | enableLocalVideo |
Prinsip | Mengganti aliran video dengan frame hitam. | Menghentikan perangkat keras kamera menangkap video dan melepaskan sumber daya terkait. |
Masalah penutupan kamera | Pratinjau lokal terus ditampilkan, tetapi pengguna jarak jauh melihat layar hitam. | Pratinjau lokal dan tampilan jarak jauh membeku pada frame terakhir yang ditangkap. |
Fitur |
|
|
4.1. Hentikan atau lanjutkan pengiriman data video
ARTC menyediakan metode muteLocalCamera untuk fitur pembisuan video. Metode ini menjaga saluran penangkapan, encoding, dan transmisi video tetap aktif tetapi mengirim frame video hitam kepada pengguna jarak jauh. Pratinjau lokal tidak terpengaruh. Metode ini didefinisikan sebagai berikut:
/**
* Menghentikan atau melanjutkan pengiriman data video lokal.
* @param mute true: mengirim frame hitam. false: melanjutkan pengiriman normal.
* @param track Hanya {@link AliRtcVideoTrack#AliRtcVideoTrackCamera} yang didukung.
* @return
* - 0: sukses
* - Nilai bukan nol: gagal
* @note Mengirim frame video hitam. Pratinjau lokal normal. Modul penangkapan, encoding, dan pengiriman masih bekerja, tetapi konten video diganti dengan frame hitam.
*/
public abstract int muteLocalCamera(boolean mute, AliRtcVideoTrack track);
/**
* @brief Notifikasi bahwa pengguna jarak jauh mengirim frame video hitam.
* @param uid ID pengguna yang memanggil muteVideo.
* @param isMute
* - true: Frame hitam dimasukkan.
* - false: Stream normal dimasukkan.
* @note Antarmuka ini adalah callback yang dipicu ketika pengguna jarak jauh mengirim frame video hitam.
*/
public void onUserVideoMuted(String uid ,boolean isMute){}Kode berikut memberikan contoh:
Android
Bisukan atau aktifkan kamera lokal:
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;
}Dengarkan callback jarak jauh:
@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
Aktifkan atau nonaktifkan pengumpulan data kamera:
@IBAction func onVideoMuteSwitched(_ sender: UISwitch) {
if sender.isOn {
// Frame hitam
rtcEngine?.muteLocalCamera(false, for: AliRtcVideoTrack.camera)
} else {
rtcEngine?.muteLocalCamera(true, for: AliRtcVideoTrack.camera)
}
}Anda dapat mendengarkan callback pada ujung jarak jauh:
extension VideoBasicUsageVC: AliRtcEngineDelegate {
func onUserVideoMuted(_ uid: String, videoMuted isMute: Bool) {
"onUserVideoMuted: user id \(uid) video muted: \(isMute)".printLog()
}
}4.2. Aktifkan atau nonaktifkan pengumpulan kamera
Metode enableLocalVideo secara global mengontrol perangkat penangkapan video lokal, seperti kamera. Ini secara langsung memengaruhi pembuatan dan transmisi aliran data video.
/**
* @brief Menonaktifkan atau mengaktifkan pengumpulan video lokal.
* @param enabled
* - true: Mengaktifkan pengumpulan video lokal.
* - false: Menonaktifkan pengumpulan video lokal.
* @return
* - 0: sukses
* - < 0: gagal
* @note Secara default, fitur ini diaktifkan. Anda dapat mendengarkan {@link AliRtcEngineNotify#onUserVideoEnabled} untuk mendapatkan status pengumpulan video lokal.
*/
public abstract int enableLocalVideo(boolean enabled);
/**
* @brief Notifikasi bahwa pengguna jarak jauh telah menonaktifkan pengumpulan stream kamera.
* @param uid ID pengguna yang memanggil enableLocalVideo.
* @param isEnable
* - true: Pengumpulan stream kamera diaktifkan.
* - false: Pengumpulan stream kamera dinonaktifkan.
* @note Antarmuka ini adalah callback yang dipicu ketika pengguna jarak jauh menonaktifkan pengumpulan stream kamera.
*/
public void onUserVideoEnabled(String uid, boolean isEnable){}Kode berikut memberikan contoh cara memanggil metode ini:
Android
Aktifkan atau nonaktifkan kamera:
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);
}
}
});Dengarkan callback jarak jauh:
@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
Aktifkan atau nonaktifkan pengumpulan kamera:
@IBAction func onCameraSwitch(_ sender: UISwitch) {
if sender.isOn {
rtcEngine?.enableLocalVideo(true)
} else {
rtcEngine?.enableLocalVideo(false)
}
updateCaptureUIVisibility()
}Dengarkan callback jarak jauh:
extension VideoBasicUsageVC: AliRtcEngineDelegate {
func onUserVideoEnabled(_ uid: String?, videoEnabled isEnable: Bool) {
"onUserVideoEnabled: user id \(uid ?? "invalid uid") video enable: \(isEnable)".printLog()
}
}5. Mulai atau hentikan pratinjau
ARTC menyediakan metode startPreview dan stopPreview untuk memulai dan menghentikan pratinjau lokal.
Catatan berikut:
Sebelum memulai pratinjau, Anda harus memanggil
setLocalViewConfiguntuk menyetel tampilan rendering untuk pratinjau lokal.Secara default, SDK memulai pratinjau saat Anda bergabung dengan saluran. Untuk memulai pratinjau sebelum bergabung dengan saluran, Anda dapat memanggil
startPreview.Setelah memanggil metode untuk menghentikan pratinjau, layar pratinjau lokal membeku pada frame terakhir yang ditangkap.
Bagan alir berikut menunjukkan proses memulai pratinjau.
Kode berikut memberikan contoh:
Android
Mulai pratinjau:
private void startPreview() {
if (mAliRtcEngine != null) {
ViewGroup.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
// Setel tampilan lokal.
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(); // Tangani potensi pengecualian
}
}
}
// Mulai pratinjau.
mAliRtcEngine.startPreview();
}
}Hentikan pratinjau:
mAliRtcEngine.stopPreview();
mAliRtcEngine.setLocalViewConfig(null, AliRtcVideoTrackCamera);
mAliRtcEngine.leaveChannel();
mAliRtcEngine.destroy();
mAliRtcEngine = null;iOS
Mulai pratinjau:
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()
}Hentikan pratinjau:
self.rtcEngine?.stopPreview()
self.rtcEngine?.leaveChannel()
AliRtcEngine.destroy()
self.rtcEngine = nil6. Setel mode gambar
ARTC menyediakan metode setVideoMirrorMode untuk mengontrol pencerminan pratinjau video lokal dan stream yang diterbitkan. Anda dapat menyesuaikan mode secara dinamis selama runtime. Metode ini cocok untuk skenario seperti panggilan audio dan video serta streaming interaktif.
/**
* @brief Menyetel kemampuan gambar untuk pratinjau dan stream ingest.
* @param mirrorMode Mode gambar.
* @return
* - 0: Penyetelan berhasil.
* - <0: Penyetelan gagal.
* - AliRtcErrInner: Terjadi kesalahan status internal SDK. Periksa apakah instance SDK berhasil dibuat.
*
* @note
* - Antarmuka ini dapat disetel secara dinamis sebelum dan setelah bergabung dengan saluran. SDK mencatat status dan melakukan operasi video ketika pratinjau dan encoding dapat dioperasikan.
* - Antarmuka ini memiliki prioritas lebih tinggi daripada setLocalViewConfig dan setVideoEncoderConfiguration.
* - Antarmuka ini tumpang tindih dengan parameter mirror dalam setLocalViewConfiguration dan setVideoEncoderConfiguration. Kami sarankan Anda hanya menggunakan satu metode.
*/
public abstract int setVideoMirrorMode(AliRtcVideoPipelineMirrorMode mirrorMode);Tabel berikut menjelaskan mode gambar.
Nilai enumerasi | Deskripsi |
AliRtcVideoPipelineMirrorModeNoMirror | Gambar dinonaktifkan baik untuk pratinjau maupun pengodean. |
AliRtcVideoPipelineMirrorModeBothMirror | Image diaktifkan untuk pratinjau dan pengodean (default). |
AliRtcVideoPipelineMirrorModeOnlyPreviewMirror | Gambar hanya diaktifkan untuk pratinjau. |
AliRtcVideoPipelineMirrorModeOnlyPublishMirror | Gambar diaktifkan hanya untuk aliran yang di-ingest. |
Kode berikut memberikan contoh:
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. Setel tampilan rendering
Sebelum dapat menampilkan pratinjau lokal atau video pengguna jarak jauh, Anda harus memanggil metode setLocalViewConfig atau setRemoteViewConfig untuk menyetel tampilan rendering yang sesuai.
// Menyetel tampilan pratinjau lokal.
public abstract int setLocalViewConfig(AliRtcVideoCanvas viewConfig, AliRtcVideoTrack track);
// Menyetel tampilan untuk pengguna jarak jauh.
public abstract int setRemoteViewConfig(AliRtcVideoCanvas canvas, String uid, AliRtcVideoTrack track);Tabel berikut menjelaskan konfigurasi umum untuk AliRtcVideoCanvas.
Parameter | Tipe | Deskripsi |
view | View | Tampilan yang ditampilkan (wajib). |
renderMode | AliRtcRenderMode | Mode rendering.
|
mirrorMode | AliRtcRenderMirrorMode | Mode gambar.
|
rotationMode | AliRtcRotationMode | Mode rotasi (0, 90, 180, atau 270). |
backgroundColor | int | Warna latar belakang dalam format RGB heksadesimal, seperti 0x000000. |
textureId | int | (Hanya Android) Mendukung tampilan tekstur OpenGL ES pihak ketiga. ID tekstur. |
textureWidth | int | (Hanya Android) Mendukung tampilan tekstur OpenGL ES pihak ketiga. Lebar tekstur. |
textureHeight | int | (Hanya Android) Mendukung tampilan tekstur OpenGL ES pihak ketiga. Tinggi tekstur. |
sharedContext | long | (Hanya Android) Mendukung tampilan tekstur OpenGL ES pihak ketiga. Konteks tekstur bersama. |
Kode berikut memberikan contoh:
7.1. Setel tampilan rendering lokal
Android
mLocalVideoCanvas = new AliRtcEngine.AliRtcVideoCanvas();
// Dapatkan dan setel 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;
// Setel tampilan pratinjau lokal.
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;
/* Handle jendela Windows */
canvas.view = mHWnd;
mAliRtcEngine.setLocalViewConfig(canvas, AliEngineVideoTrackCamera);7.2. Setel tampilan rendering jarak jauh
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()
// Status stream pengguna jarak jauh.
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);
}
}