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.
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:
Anda memiliki Akun Alibaba Cloud aktif dan telah membuat aplikasi ARTC. Untuk petunjuknya, lihat Buat aplikasi ARTC. Anda akan memerlukan AppID dan AppKey, yang tersedia di Konsol ApsaraVideo Live.
Anda telah mengintegrasikan ARTC SDK ke dalam proyek Anda dan mengimplementasikan panggilan audio dan video dasar. Untuk informasi lebih lanjut, lihat Integrasikan ARTC SDK dan implementasikan fitur panggilan audio dan video dasar.
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 |
| Parameter:
|
| API ini memperluas |
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 |
| SDK memicu callback ini saat menerima pesan SEI. Parameter:
|
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. */
}