全部产品
Search
文档中心

ApsaraVideo Live:Operasi dan konfigurasi video umum

更新时间:Nov 05, 2025

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.

Catatan
  • 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

AliRtcCaptureOutputPreference

Preferensi koleksi.

  • CAPTURER_OUTPUT_PREFERENCE_AUTO: SDK secara otomatis menyesuaikan pengaturan.

  • CAPTURER_OUTPUT_PREFERENCE_PERFORMANCE: Performa diprioritaskan. SDK memilih konfigurasi yang paling mendekati parameter encoding.

  • CAPTURER_OUTPUT_PREFERENCE_PREVIEW: Pratinjau diprioritaskan. SDK memilih parameter input kamera yang lebih tinggi.

cameraDirection

AliRtcCameraDirection

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

AliRtcCameraCaptureProfile

Resolusi yang ditentukan untuk koleksi video.

  • Default. Pengaturan encoder digunakan.

  • 1080p.

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.

Catatan

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

AliRtcVideoDimensions

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.

  • false: Encoder merespons permintaan keyframe, seperti saat pengguna lain bergabung dengan saluran. Interval keyframe tidak sepenuhnya sesuai dengan nilai yang ditentukan.

  • true: Encoder tidak merespons permintaan keyframe lainnya dan secara ketat menghasilkan keyframe pada interval yang ditentukan. Ini dapat meningkatkan latensi untuk frame pertama bagi subscriber.

mirrorMode

AliRtcVideoEncoderMirrorMode

Mode gambar untuk video yang di-encode. Parameter ini mengontrol apakah aliran video yang dimasukkan dicerminkan.

Catatan

Anda dapat memanggil antarmuka setVideoMirrorMode untuk menyetel mode gambar.

orientationMode

AliRtcVideoEncoderOrientationMode

Mode rotasi untuk video yang di-encode.

  • Adaptive: Sesuai dengan video yang ditangkap.

  • FixedLandscape: Video dalam mode lanskap tetap.

  • FixedPortrait: Video dalam mode potret tetap.

rotationMode

AliRtcRotationMode

Sudut rotasi video (0, 90, 180, atau 270).

codecType

AliRtcVideoCodecType

Jenis codec.

  • default: Pengaturan perangkat default digunakan.

  • software: Encoding perangkat lunak.

  • hardware: Mengaktifkan decoding perangkat keras.

  • hardwareTexture: Encoding tekstur perangkat keras.

encodeCodecType

AliRtcVideoEncodeCodecType

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

  • Mempertahankan koneksi aliran video. Penerima tidak menyadari gangguan video.

  • Beralih cepat. Karena metode ini tidak sering memulai dan menghentikan perangkat keras kamera, ia memiliki latensi respons rendah. Metode ini cocok untuk skenario yang memerlukan Anda untuk secara dinamis mengaktifkan dan menonaktifkan kamera.

  • Melepaskan sumber daya kamera.

  • Beralih lambat. Karena metode ini mengaktifkan atau menonaktifkan perangkat keras kamera, ia memiliki latensi respons yang lebih tinggi. Metode ini cocok untuk skenario di mana kamera dinonaktifkan untuk periode panjang, seperti dalam mode hanya audio.

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 setLocalViewConfig untuk 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 = nil

6. 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.

  • Auto: Mode otomatis.

  • Stretch: Mode regangkan-untuk-mengisi. Jika rasio aspek video input berbeda dari rasio aspek yang ditetapkan untuk stream ingest, video input diregangkan ke rasio yang ditentukan, yang dapat menyebabkan distorsi.

  • Fill: Mode sesuaikan-dengan-bilah-hitam. Jika rasio aspek video input berbeda dari rasio aspek yang ditetapkan untuk stream ingest, bilah hitam ditambahkan di bagian atas dan bawah atau kiri dan kanan video input.

  • Clip: Mode potong. Jika rasio aspek video input berbeda dari rasio aspek yang ditetapkan untuk stream ingest, lebar atau tinggi video input dipotong, yang dapat mengakibatkan hilangnya konten.

mirrorMode

AliRtcRenderMirrorMode

Mode gambar.

  • Pencerminan diaktifkan hanya untuk kamera depan.

  • Gambar diaktifkan untuk semua pengguna.

  • Gambar dinonaktifkan untuk semua pengguna.

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);
    }
}