リアルタイム音声・映像 (ARTC) SDK は、Supplemental Enhancement Information (SEI) メッセージの送受信をサポートしています。この機能を使用して、ARTC システムから Alibaba Cloud CDN ライブストリーミングまたはサードパーティのライブストリーミングプラットフォームにカスタムメッセージを送信できます。
機能紹介
ビデオエンコーディングにおいて、SEI は H.264/AVC や H.265/HEVC などのビデオエンコーディング標準の一部です。SEI は、ビデオコンテンツに関連する追加情報を送信するために使用されます。この情報は、アクセシビリティ、同期、エラー回復など、受信側のための機能を提供します。SEI は、正確なビデオレイアウト、リモート歌詞同期、ライブクイズなどの一般的なシナリオで使用できます。
SEI を使用してカスタムメッセージを送信することをお勧めします。カスタムメッセージはビデオデータストリームにアタッチされ、ビデオデータとともにチャンネル内の他のユーザーに送信されます。
長所:
高いリアルタイム性能。テキストメッセージはメディアストリームと同期されます。
受信側の数に制限はありません。ストリームをプルする人なら誰でもメッセージを受信できます。
短所:
ビデオストリームの伝送に影響を与えないように、各メッセージは最大 4 KB のデータしか送信できません。
サンプルコード
ARTC は、ご参考のためにオープンソースのデモプロジェクトを提供しています。プロジェクトをダウンロードするか、ソースコードを表示できます。サンプルコードの詳細については、以下のリンクをご参照ください。
Android で SEI メッセージを送受信する: Android/ARTCExample/BasicUsage/src/main/java/com/aliyun/artc/api/basicusage/SEIUsage/SEIActivity.java。
iOS で SEI メッセージを送受信する: iOS/ARTCExample/BasicUsage/SEIUsage/SEIUsageVC.swift。
前提条件
SEI 機能を実装する前に、次の要件が満たされていることを確認してください。
有効な Alibaba Cloud アカウントを持っており、リアルタイム音声・映像アプリケーションを作成済みであること。詳細については、「アプリケーションの作成」をご参照ください。[管理コンソール] で App ID と App Key を取得します。
ARTC SDK をプロジェクトに統合し、基本的なリアルタイムの音声・映像機能を実装済みであること。SDK を統合するには、「SDK のダウンロード/統合」をご参照ください。オーディオおよびビデオ機能を実装するには、「音声・映像通話の実装」をご参照ください。
手順
SEI メッセージの送信
ユーザーがアップストリーミングを開始した後、sendMediaExtensionMsg 操作を呼び出して SEI データを送信できます。
API 情報
ARTC SDK は、SEI メッセージを送信するための 2 つの操作を提供します。
API 操作 | 説明 |
sendMediaExtensionMsg | パラメーター:
|
sendMediaExtensionMsgEx | sendMediaExtensionMsg と比較して、この操作は追加の payloadType パラメーターを提供して SEI メッセージのタイプを設定します。値は 5 または [100, 254] の範囲の値にすることができます。payloadType を 5 に設定した場合、この操作は sendMediaExtensionMsg 操作と同じです。 |
一度に送信できるメディア拡張メッセージは 1 つだけです。sendMediaExtensionMsg を複数回呼び出すと、最新の呼び出しのデータが前の呼び出しのデータを上書きします。
呼び出し例
次の例は、sendMediaExtensionMsgEx 操作を呼び出して文字列メッセージを SEI メッセージとして送信する方法を示しています。
Android
// 前提条件: チャンネルに参加し、アップストリーミングを開始していること (デフォルトでは自動アップストリーミング)。
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
// 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
/* 必要に応じて次のパラメーターを指定します。 */
char * data = "xxxxx";
int length = strlen(data);
mAliRtcEngine->SendMediaExtensionMsg(data, length, 1,0,true);SEI メッセージの受信
ユーザーがチャンネル内のビデオストリームをサブスクライブした後、SEI データを受信するためのコールバックが登録されていれば、チャンネルから SEI データを受信できます。
API 情報
コールバック操作 | 説明 |
onMediaExtensionMsgReceived | SEI メッセージを受信するためのコールバック。 パラメーター:
|
呼び出し例
Android
@Override
public void onMediaExtensionMsgReceived(String uid, int payloadType, byte[]message) {
super.onMediaExtensionMsgReceived(uid,payloadType, message);
handler.post(new Runnable() {
@Override
public void run() {
// メッセージを処理します。
String receivedMsg = new String(message);
ToastHelper.showToast(SEIActivity.this, receivedMsg, Toast.LENGTH_SHORT);
}
});
}iOS
extension SEIUsageMainVC: AliRtcEngineDelegate {
// SEI メッセージを受信するためのコールバック。
// SEI メッセージを受信
func onMediaExtensionMsgReceived(_ uid: String, payloadType: Int32, message data: Data) {
// メッセージを処理します。
guard let message = String(data: data, encoding: .utf8) else {
print("Failed to parse the message")
return
}
self.showToast(message: "Received SEI: \(message), from uid: \(uid), payloadType: \(payloadType)")
}
// その他のコールバック...
}Windows
public:
virtual void OnMediaExtensionMsgReceived(const char* uid, const int8_t * message, uint32_t size) override {
/* TODO: 必要に応じて処理ロジックを記述します。 */
}