SDK ApsaraVideo Real-time Communication (ARTC) mendukung pengiriman dan penerimaan pesan Supplemental Enhancement Information (SEI). Anda dapat menggunakan fitur ini untuk mentransmisikan pesan kustom dari sistem ARTC ke live streaming Alibaba Cloud CDN atau platform live streaming pihak ketiga.
Pengenalan fitur
Dalam pengkodean video, SEI adalah bagian dari standar pengkodean video seperti H.264/AVC dan H.265/HEVC. SEI digunakan untuk mentransmisikan informasi tambahan yang terkait dengan konten video. Informasi ini memberikan fitur bagi penerima, seperti aksesibilitas, sinkronisasi, dan pemulihan kesalahan. SEI dapat digunakan dalam skenario umum seperti tata letak video yang presisi, sinkronisasi lirik jarak jauh, dan kuis langsung.
Kami merekomendasikan Anda menggunakan SEI untuk mengirim pesan kustom. Pesan kustom tersebut disambungkan ke aliran data video dan ditransmisikan bersama data video kepada pengguna lain di saluran.
Kelebihan:
Kinerja real-time yang tinggi. Pesan teks disinkronkan dengan aliran media.
Tidak ada batasan jumlah penerima. Siapa pun yang menarik aliran dapat menerima pesan.
Kekurangan:
Untuk menghindari mempengaruhi transmisi aliran video, setiap pesan dapat mentransmisikan maksimal 4 KB data.
Contoh kode
ARTC menyediakan proyek demo open-source sebagai referensi. Anda dapat mengunduh proyek atau melihat kode sumbernya. Untuk informasi lebih lanjut tentang kode contoh, lihat tautan berikut:
Kirim dan Terima Pesan SEI di Android: Android/ARTCExample/BasicUsage/src/main/java/com/aliyun/artc/api/basicusage/SEIUsage/SEIActivity.java.
Kirim dan Terima Pesan SEI di iOS: iOS/ARTCExample/BasicUsage/SEIUsage/SEIUsageVC.swift.
Prasyarat
Sebelum mengimplementasikan fitur SEI, pastikan persyaratan berikut telah terpenuhi:
Anda memiliki Akun Alibaba Cloud yang valid dan telah membuat aplikasi ApsaraVideo Real-time Communication. Untuk informasi lebih lanjut, lihat Buat Aplikasi. Dapatkan App ID dan App Key di Management Console.
Anda telah mengintegrasikan SDK ARTC ke dalam proyek Anda dan mengimplementasikan fitur audio dan video real-time dasar. Untuk mengintegrasikan SDK, lihat Unduh/Integrasi SDK. Untuk mengimplementasikan fitur audio dan video, lihat Implementasikan Panggilan Audio dan Video.
Prosedur
Kirim pesan SEI
Setelah pengguna memulai pengambilan aliran, mereka dapat memanggil operasi sendMediaExtensionMsg untuk mengirim data SEI.
Informasi API
SDK ARTC menyediakan dua operasi untuk mengirim pesan SEI.
Operasi API | Deskripsi |
sendMediaExtensionMsg | Parameter:
|
sendMediaExtensionMsgEx | Dibandingkan dengan sendMediaExtensionMsg, operasi ini menyediakan parameter payloadType tambahan untuk menyetel jenis pesan SEI. Nilainya bisa 5 atau nilai dalam rentang [100, 254]. Jika Anda menyetel payloadType ke 5, operasi ini setara dengan operasi sendMediaExtensionMsg. |
Hanya satu pesan ekstensi media yang dapat ditransmisikan pada satu waktu. Jika Anda memanggil sendMediaExtensionMsg beberapa kali, data dari pemanggilan terbaru akan menimpa data dari pemanggilan sebelumnya.
Contoh panggilan
Contoh berikut menunjukkan cara memanggil operasi sendMediaExtensionMsgEx untuk mengirim pesan string sebagai pesan SEI.
Android
// Prasyarat: Anda telah bergabung dengan saluran dan memulai pengambilan aliran (pengambilan otomatis 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
}Windows
/* Tentukan parameter berikut sesuai kebutuhan. */
char * data = "xxxxx";
int length = strlen(data);
mAliRtcEngine->SendMediaExtensionMsg(data, length, 1,0,true);Terima pesan SEI
Setelah pengguna berlangganan aliran video di saluran, mereka dapat menerima data SEI dari saluran jika callback untuk menerima data SEI telah didaftarkan.
Informasi API
Operasi Callback | Deskripsi |
onMediaExtensionMsgReceived | Callback untuk menerima pesan SEI. Parameter:
|
Contoh panggilan
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.
// terima 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: "Menerima SEI: \(message), dari uid: \(uid), payloadType: \(payloadType)")
}
// Callback lainnya...
}Windows
public:
virtual void OnMediaExtensionMsgReceived(const char* uid, const int8_t * message, uint32_t size) override {
/* TODO: Tulis logika pemrosesan sesuai kebutuhan. */
}