全部产品
Search
文档中心

ApsaraVideo Live:Pengambilan video khusus

更新时间:Nov 05, 2025

Ikhtisar

Alibaba Real-Time Communication (ARTC) Software Development Kit (SDK) menyediakan fitur pengambilan video khusus yang fleksibel. Fitur ini memungkinkan Anda mengelola perangkat pengambilan video sesuai dengan kebutuhan bisnis Anda.

Gunakan terlebih dahulu fitur pengambilan internal dari ARTC SDK. Jika fitur tersebut tidak memenuhi persyaratan Anda terkait kualitas video, kompatibilitas perangkat, atau proses pengambilan, Anda dapat beralih ke fitur pengambilan video khusus untuk mendapatkan kemampuan ekstensibilitas dan penyesuaian yang lebih besar.

Kode contoh

Pengambilan video khusus untuk Android: Android/ARTCExample/AdvancedUsage/src/main/java/com/aliyun/artc/api/advancedusage/CustomVideoCaptureAndRender/CustomVideoCaptureActivity.java.

Pengambilan video khusus untuk iOS: iOS/ARTCExample/AdvancedUsage/CustomVideoCapture/CustomVideoCpatureVC.swift.

Prasyarat

Sebelum mengonfigurasi pengaturan video, pastikan prasyarat berikut telah dipenuhi:

Implementasi

1. Nonaktifkan pengambilan internal SDK

Anda dapat memanggil metode enableLocalVideo untuk menonaktifkan pengambilan video internal SDK.

Android

/* Nonaktifkan pengambilan internal. */
mAliRtcEngine.enableLocalVideo(false);

/* Aktifkan pengambilan internal. Pengambilan internal diaktifkan secara default. Anda tidak perlu memanggil metode ini kecuali Anda perlu mengontrol fitur ini. */
mAliRtcEngine.enableLocalVideo(true);

iOS

/* Nonaktifkan pengambilan internal. */
[_engine enableLocalVideo:NO];

/* Aktifkan pengambilan internal. Pengambilan internal diaktifkan secara default. Anda tidak perlu memanggil metode ini kecuali Anda perlu mengontrol fitur ini. */
[_engine enableLocalVideo:YES];

2. Atur sumber video pengambilan khusus

Anda dapat memanggil setExternalVideoSource untuk mengatur sumber video eksternal. Parameter utama adalah sebagai berikut:

  • enable: Menentukan apakah akan mengaktifkan fitur ini.

  • useTexture: Menentukan apakah akan menggunakan tekstur sebagai input.

  • streamType: Menentukan aliran yang diganti oleh SDK. Ini bisa berupa aliran kamera atau aliran berbagi layar.

  • renderMode: Mode pemrosesan yang digunakan ketika rasio aspek sumber video eksternal berbeda dari profil pengambilan aliran.

Android

Input YUV:

/* Input data dalam format YUV. */
/* Aktifkan pengambilan eksternal. Contoh ini menggunakan aliran kamera. Tentukan tipe sumber dan mode rendering sesuai kebutuhan. */
mAliRtcEngine.setExternalVideoSource(true,false, AliRtcVideoTrackCamera,AliRtcRenderModeAuto );

/* Nonaktifkan pengambilan eksternal. Contoh ini menggunakan aliran kamera. Tentukan tipe sumber sesuai kebutuhan. */
mAliRtcEngine.setExternalVideoSource(false,false, AliRtcVideoTrackCamera,AliRtcRenderModeAuto );

Input Texture:

/* Input data sebagai tekstur. */
/* Aktifkan pengambilan eksternal. Contoh ini menggunakan aliran kamera. Tentukan tipe sumber dan mode rendering sesuai kebutuhan. */
mAliRtcEngine.setExternalVideoSource(true,true, AliRtcVideoTrackCamera,AliRtcRenderModeAuto );

/* Nonaktifkan pengambilan eksternal. Contoh ini menggunakan aliran kamera. Tentukan tipe sumber sesuai kebutuhan. */
mAliRtcEngine.setExternalVideoSource(false,true, AliRtcVideoTrackCamera,AliRtcRenderModeAuto );

iOS

/* Aktifkan pengambilan eksternal. Contoh ini menggunakan aliran kamera. Tentukan tipe sumber dan mode rendering sesuai kebutuhan. */
[_engine setExternalVideoSource:YES sourceType:AliRtcVideosourceCameraType renderMode:AliRtcRenderModeAuto]; 

/* Nonaktifkan pengambilan eksternal. Contoh ini menggunakan aliran kamera. Tentukan tipe sumber sesuai kebutuhan. */
[_engine setExternalVideoSource:NO sourceType:AliRtcVideosourceCameraType renderMode:AliRtcRenderModeAuto]; 

3. Kirim data ke SDK

Setelah merekam video:

Android

Contoh input YUV:

/* Contoh ini menggunakan format YUV (I420). */
int width = 720;
int height = 1280;
AliRtcEngine.AliRtcVideoFormat videoformat = AliRtcEngine.AliRtcVideoFormat.AliRtcVideoFormatI420;
int[] lineSize = {width, width / 2, width / 2, 0};
int frameLength = width * height * 3 / 2;
byte[] buffer = new byte[frameLength];

/* Konstruksi objek data untuk dikirim ke SDK. */
AliRtcEngine.AliRtcRawDataFrame rawDataFrame
        = new AliRtcEngine.AliRtcRawDataFrame(buffer,
                                             videoformat,
                                             width, 
                                             height, 
                                             lineSize, 
                                             0, 
                                             buffer.length);

/* Panggil API untuk mengirim objek data. */
int ret = mAliRtcEngine.pushExternalVideoFrame(rawDataFrame, AliRtcVideoTrackCamera);
if (ret != 0) {
    /* Cetak pesan kesalahan. */
}

Contoh input tekstur:

/* Contoh ini menggunakan format tekstur. */
/* Konstruksi lingkungan OpenGL. */
private static EglBase14 createEglBase14(EGLContext shareEglContext) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        EglBase14.Context eglBase14Context = shareEglContext == null ? null : new EglBase14.Context(shareEglContext);
        EglBase14 eglBase14 = new EglBase14(eglBase14Context, EglBase.CONFIG_PIXEL_BUFFER);
        try {
            eglBase14.createDummyPbufferSurface();
            eglBase14.makeCurrent();
        } catch (RuntimeException e) {
            eglBase14.release();
            Log.e(TAG, "CreateEGLBase14Context, failed, " + e.getMessage());
        }
        return eglBase14;
    }
    return null;
}

/* Konstruksi konteks data input. */
float[] transformMatrix = {
  1, 0, 0, 0,
  0, 1, 0, 0,
  0, 0, 1, 0,
  0, 0, 0, 1
};
int frameWidth = 720; /* Lebar gambar. */
int frameHeight = 1280; /* Tinggi gambar. */
int textureID = xxx; /* ID tekstur Anda. */

AliRtcEngine.AliRtcRawDataFrame aliRawDataFrame 
  = new AliRtcEngine.AliRtcRawDataFrame(textureID,
                                        AliRtcVideoFormatTexture2D,
                                        frameWidth, 
                                        frameHeight, 
                                        transformMatrix, 
                                        0, 
                                        0, 
                                        frameWidth, 
                                        frameHeight, 
                                        mEglBase14.getEglContext());

/* Panggil API untuk mengirim objek data. */
int ret = mAliRtcEngine.pushExternalVideoFrame(aliRawDataFrame, AliRtcVideoTrackCamera);
if (ret != 0) {
    /* Cetak pesan kesalahan. */
}

iOS

/* Tentukan parameter berikut berdasarkan format data Anda. Contoh ini menggunakan format I420. */
AliRtcVideoDataSample *dataSample = [[AliRtcVideoDataSample alloc] init];
dataSample.dataPtr = (long)yuv_read_data;
dataSample.format = AliRtcVideoFormat_I420;
dataSample.type = AliRtcBufferType_Raw_Data;
dataSample.width = width;
dataSample.height = height;
dataSample.strideY = width;
dataSample.strideU = width/2;
dataSample.strideV = width/2;
dataSample.dataLength = dataSample.strideY * dataSample.height * 3/2;

/* Panggil API untuk mengirim objek data. */
int ret = [self.engine pushExternalVideoFrame:dataSample sourceType:AliRtcVideosourceCameraType];
if (ret != 0) {
    /* Cetak pesan kesalahan. */
}