All Products
Search
Document Center

ApsaraVideo Live:Kirim dan terima pesan SEI

Last Updated:Mar 26, 2026

ARTC SDK mendukung pengiriman dan penerimaan pesan supplemental enhancement information (SEI). Fitur ini memungkinkan Anda mengirimkan pesan kustom dari sistem RTC ke layanan live streaming Alibaba Cloud CDN atau platform live streaming pihak ketiga.

Ikhtisar

Dalam pengkodean video, supplemental enhancement information (SEI) merupakan bagian dari standar pengkodean video seperti H.264/AVC dan H.265/HEVC, yang digunakan untuk mengirimkan informasi tambahan terkait konten video. Informasi ini memungkinkan fungsi bantu di sisi penerima, seperti sinkronisasi konten dan pemulihan error. Kasus penggunaan umum mencakup tata letak video presisi, lirik tersinkronisasi, dan kuis interaktif langsung.

image

SEI merupakan metode yang direkomendasikan untuk mengirimkan pesan kustom karena menyematkan pesan ke dalam aliran video dan mengirimkannya bersama data video kepada pengguna lain dalam channel.

  • Manfaat:

    • Sinkronisasi real-time: Pesan disinkronkan dengan aliran video.

    • Penerima tanpa batas: Setiap pengguna yang berlangganan aliran tersebut dapat menerima pesan.

  • Batasan:

    • Untuk menghindari dampak pada aliran video, ukuran maksimum setiap pesan adalah 4 KB.

Contoh kode

ARTC menyediakan proyek contoh open-source sebagai referensi. Anda dapat mengunduh proyek tersebut atau melihat kodenya di repositori berikut:

Android: Android/ARTCExample/BasicUsage/src/main/java/com/aliyun/artc/api/basicusage/SEIUsage/SEIActivity.java.

iOS: iOS/ARTCExample/BasicUsage/SEIUsage/SEIUsageVC.swift.

Harmony: Harmony/ARTCExample/entry/src/main/ets/pages/basicusage/SEIPage.ets.

Sebelum memulai

Sebelum mengimplementasikan fitur ini, pastikan Anda memenuhi persyaratan berikut:

Implementasi

Kirim pesan SEI

Setelah menerbitkan aliran video, Anda dapat memanggil API sendMediaExtensionMsg untuk mengirim data SEI.

Referensi API

ARTC SDK menyediakan dua API untuk mengirim pesan SEI.

API

Deskripsi

sendMediaExtensionMsg

Parameter:

  • message: Pesan ekstensi media. Ukuran maksimum adalah 4096 byte. Kami menyarankan menggunakan format JSON atau string biasa.

  • repeatCount: Jumlah pengulangan pesan. Ini menambahkan redundansi untuk mencegah kehilangan pesan akibat packet drop jaringan. Nilai -1 mengirim pesan secara terus-menerus.

  • delay: Penundaan dalam milidetik antara pemanggilan API dan pengiriman pesan.

  • isKeyFrame: Menentukan apakah pesan hanya dilampirkan pada keyframe. Jika true, pesan hanya dilampirkan pada keyframe.

sendMediaExtensionMsgEx

API ini memperluas sendMediaExtensionMsg dengan menambahkan parameter payloadType untuk mengatur tipe pesan SEI. Nilai yang valid adalah 5 atau bilangan bulat apa pun dari 100 hingga 254. Menggunakan payloadType=5 setara dengan memanggil API sendMediaExtensionMsg.

Catatan

Hanya satu pesan ekstensi media yang dapat sedang dikirim pada satu waktu. Pemanggilan berikutnya ke sendMediaExtensionMsg akan menimpa pesan sebelumnya.

Contoh

Contoh berikut menunjukkan cara mengirim string sebagai pesan SEI menggunakan API sendMediaExtensionMsg.

Android

// Anda harus sudah bergabung ke channel dan mulai menerbitkan aliran video (diaktifkan secara default).
mSendSEIButton.setOnClickListener(v -> {
    if(mAliRtcEngine == null) {
        return;
    }
    String seiMessage = mEditText.getText().toString();
    if (TextUtils.isEmpty(seiMessage)) {
        return;
    }
    byte[] seiData = seiMessage.getBytes();
    mAliRtcEngine.sendMediaExtensionMsg(seiData,1,0,false);
    // mAliRtcEngine.sendMediaExtensionMsgEx(seiData,1,0,false, 5);
});

iOS

// Kirim pesan SEI.
func sendSEI(seiMessage: String) -> Bool {
    guard let data = seiMessage.data(using: .utf8) else {
        return false
    }
    let repeatCount: Int32 = 1
    let delay: Int32 = 0
    let payloadType: Int32 = 5
    let isKeyFrameOnly = false
    let ret = self.rtcEngine?.sendMediaExtensionMsg(data, repeatCount: repeatCount, delay: delay, isKeyFrame: isKeyFrameOnly)
    // let ret = self.rtcEngine?.sendMediaExtensionMsgEx(data, repeatCount: repeatCount, delay: delay, isKeyFrame: isKeyFrameOnly, payloadType: payloadType)
    debugPrint("sendSEI: \(ret ?? -1)")
    return ret == 0
}

Harmony

const seiData = this.stringToArrayBuffer(this.SendText);
// Kirim pesan SEI.
this.rtcEngine.sendMediaExtensionMsg(seiData, 1, 0, false);

Mac

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
NSDate *datenow = [NSDate date];
NSString *currentTimeString = [formatter stringFromDate:datenow];
NSString *str =@"SEI Test time:" ;

NSString * ExtensionMsg = [str stringByAppendingString:currentTimeString];

NSData *data =[ExtensionMsg dataUsingEncoding:NSUTF8StringEncoding];

int code = [self.engine sendMediaExtensionMsg:data repeatCount:repectCount delay:100 isKeyFrame:true];
NSLog(@"--%d",code);

Windows

/* Tentukan parameter berikut sesuai kebutuhan. */
char * data = "xxxxx";
int length = strlen(data);
mAliRtcEngine->SendMediaExtensionMsg(data, length, 1,0,true);

Terima pesan SEI

Setelah berlangganan aliran video di channel, pengguna dapat menerima data SEI dengan mendaftarkan callback yang sesuai.

Referensi API

Callback

Deskripsi

onMediaExtensionMsgReceived

SDK memicu callback ini saat menerima pesan SEI.

Parameter:

  • uid: ID pengguna yang mengirim pesan.

  • payloadType: Tipe pesan SEI. Nilainya adalah 5 untuk pesan yang dikirim oleh sendMediaExtensionMsg. Untuk pesan yang dikirim oleh sendMediaExtensionMsgEx, nilainya adalah tipe spesifik tersebut.

  • message: Pesan SEI yang diterima.

Contoh

Android

@Override
public void onMediaExtensionMsgReceived(String uid, int payloadType, byte[]message) {
    super.onMediaExtensionMsgReceived(uid,payloadType, message);

    handler.post(new Runnable() {
        @Override
        public void run() {
            // Proses pesan.
            String receivedMsg = new String(message);
            ToastHelper.showToast(SEIActivity.this, receivedMsg, Toast.LENGTH_SHORT);
            
        }
    });
}

iOS

extension SEIUsageMainVC: AliRtcEngineDelegate {
    
    // Callback untuk menerima pesan SEI.
    func onMediaExtensionMsgReceived(_ uid: String, payloadType: Int32, message data: Data) {
        // Proses pesan.
        guard let message = String(data: data, encoding: .utf8) else {
            print("Gagal mengurai pesan")
            return
        }
        self.showToast(message: "Pesan SEI diterima: \(message), dari uid: \(uid), payloadType: \(payloadType)")
    }
    // Callback lainnya...

}

Harmony

// Callback untuk menerima pesan SEI.
listener.onMediaExtensionMsgReceived((uid: string, payloadType: number, message: ArrayBuffer) => {
  console.info(`Pesan SEI diterima: uid=${uid}, payloadType=${payloadType}, message=${message}`);
});

Mac

- (void)onMediaExtensionMsgReceived:(NSString *)uid payloadType:(int)payloadType message:(NSData *)data {
    
    NSString * string_message  = [[NSString alloc] initWithBytes:data.bytes length:data.length encoding:NSUTF8StringEncoding];

    NSLog(@"uid diterima:%@, payloadType: %d, pesan:%@ ukuran:%lu \n\n", uid, payloadType, string_message, (unsigned long)data.length);
    dispatch_async(dispatch_get_main_queue(), ^{
        NSString *showString = [NSString stringWithFormat:@" uid:%@\n payloadtype:%d pesan:%@\n ukuran:%lu\n",
                                uid, payloadType, string_message, (unsigned long)data.length];
        _extendinfoL.stringValue = showString;
    });
    
}

Windows

public:
virtual void OnMediaExtensionMsgReceived(const char* uid, const int8_t * message, uint32_t size) override {
    /* TODO: Tambahkan logika pemrosesan Anda di sini sesuai kebutuhan bisnis. */
}