すべてのプロダクト
Search
ドキュメントセンター

ApsaraVideo Live:SEI メッセージの送受信

最終更新日:Nov 05, 2025

リアルタイム音声・映像 (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

パラメーター:

  • message: メディア拡張メッセージ。最大長は 4,096 バイトです。JSON または純粋な文字列を使用することをお勧めします。

  • repeatCount: 繰り返し回数。このパラメーターはメッセージの冗長性を表し、ネットワークパケットの損失によるメッセージの損失を防ぐために使用されます。値 -1 は無制限の送信を示します。

  • delay: ミリ秒単位の遅延。このパラメーターは、API 操作が呼び出された後、拡張メッセージが送信されるまでに経過する必要がある最小時間を指定します。

  • isKeyFrame: 拡張メッセージをキーフレームにのみアタッチするかどうかを指定します。値 true は、拡張メッセージがキーフレームにのみアタッチされることを示します。

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 メッセージを受信するためのコールバック。

パラメーター:

  • uid: メッセージを送信したユーザーの ID。

  • payloadType: 送信時の SEI メッセージのタイプ。sendMediaExtensionMsg 操作は 5 を返します。sendMediaExtensionMsgEx 操作は特定のタイプを返します。

  • message: 受信した 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: 必要に応じて処理ロジックを記述します。 */
}