天天看點

産品百科 |RTC SDK 媒體擴充資訊的使用說明

使用場景

在以下兩種場景下可以使用媒體擴充資訊:

  • 借用媒體鍊路傳遞時間戳,用于自己計算端到端網絡延遲,或者跟自身其他業務做資料同步。
  • 傳遞位控制資訊,目前可以傳遞 8Byte 資料,共 64 位,每一位或者每幾位資料可以表示一些控制資訊,可以用于自身業務上的指令傳輸。

示例代碼

以下代碼均以時間戳為例。

  • iOS
    • 發送:
NSTimeInterval now = [[NSDate dateWithTimeIntervalSinceNow:0] timeIntervalSince1970];
long long lNow = CFSwapInt64BigToHost((long long)(now * 1000));
NSData * timeData = [NSData dataWithBytes:&lNow length:sizeof(lNow)];
[self.engine sendMediaExtensionMsg:timeData repeatCount:5];      
    • 接收:
- (void)onMediaExtensionMsgReceived:(NSString *)uid message:(NSData *)data {
    long long receivedLongLongValue = 0;
    [data getBytes:&receivedLongLongValue length:8];
    long long sentTime = CFSwapInt64BigToHost(receivedLongLongValue);
    NSTimeInterval now = [[NSDate dateWithTimeIntervalSinceNow:0] timeIntervalSince1970];
    long long nowTime = (long long)(now * 1000);
    NSLog(@"%@", [NSString stringWithFormat:@"uid: %@, now: %lld, sent: %lld, 內插補點: %lld", uid, nowTime, sentTime, (nowTime-sentTime)];)}      
  • Mac
NSTimeInterval now = [[NSDate dateWithTimeIntervalSinceNow:0] timeIntervalSince1970];
long long lNow = CFSwapInt64BigToHost((long long)(now * 1000));
NSData * timeData = [NSData dataWithBytes:&lNow length:sizeof(lNow)];
[self.engine sendMediaExtensionMsg:timeData repeatCount:5];      
- (void)onMediaExtensionMsgReceived:(NSString *)uid message:(NSData *)data {
    long long receivedLongLongValue = 0;
    [data getBytes:&receivedLongLongValue length:8];
    long long sentTime = CFSwapInt64BigToHost(receivedLongLongValue);
    NSTimeInterval now = [[NSDate dateWithTimeIntervalSinceNow:0] timeIntervalSince1970];
    long long nowTime = (long long)(now * 1000);
    NSLog(@"%@", [NSString stringWithFormat:@"uid: %@, now: %lld, sent: %lld, 內插補點: %lld", uid, nowTime, sentTime, (nowTime-sentTime)];)      
  • Android
long lNow = System.currentTimeMillis();
byte b[] = new byte[8];
ByteBuffer buf = ByteBuffer.wrap(b);
buf.putLong(l);
buf.flip();
mAliRtcEngine.sendMediaExtensionMsg(buf.array(), 5);      
public void onMediaExtensionMsgReceived(String uid, byte[] message) {
    super.onMediaExtensionMsgReceived(uid, message);
    ByteBuffer buffer = ByteBuffer.allocate(8);
    buffer.put(message, 0, message.length);
    buffer.flip();
    long sentTime = buffer.getLong();
}      
  • Windows
char* long2charArr(long long num)
{
    char* arr = new char[8];
    int x = 56;
    for (int i = 7; i >= 0; i--)
    {
        long long temp = num << x;
        arr[i] = temp >> 56;
        x -= 8;
    }
    return arr;
}
SYSTEMTIME tmSys;
GetLocalTime(&tmSys);
CTime ctmNow(tmSys);
long long lNow = __int64(ctmNow.GetTime()) * 1000 + tmSys.wMilliseconds;
char* cNow = long2charArr(lNow);
mpEngine->sendMediaExtensionMsg((unsigned char*)cNow, 8, 5);
delete cNow;      
long long charArr2long(char* p)
{
    long long value = 0;
    value = (((long long)p[0] << 56 & 0xFF00000000000000L) |
    ((long long)p[1] << 48 & 0xFF000000000000L) |
    ((long long)p[2] << 40 & 0xFF0000000000L) |
    ((long long)p[3] << 32 & 0xFF00000000L) |
    ((long long)p[4] << 24 & 0xFF000000L) |
    ((long long)p[5] << 16 & 0xFF0000L) |
    ((long long)p[6] << 8 & 0xFF00L) |
    ((long long)p[7] & 0xFFL));
    return value;
}
void CTutorialDlg::onMediaExtensionMsgReceived(const AliRtc::String &uid, unsigned char* message, int size)
{
    long long sentTime = charArr2long((char*)message);
}      

各個端使用注意點

因為複用音視訊資料通道,必須控制自定義消息的發送頻率和消息資料長度,使用限制如下:

  • 為了不影響媒體資料的傳輸品質,自定義消息體長度限制為 8Byte,可以用來傳輸時間戳,位控制資訊等。
  • 每秒最多發送 30 條消息。
  • repeatCount 為自定義消息備援度,若大于 1,則會發送多次,防止網絡丢包導緻的消息丢失。
  • 若 repeatCount 大于 1,房間裡的其他人也會收到多次相同的消息,需要去重。
  • 發送的自定義消息,在旁路直播時,房間裡的訂閱者也一樣會收到。
  • 目前 H5 不支援發送和接收。
「視訊雲技術」你最值得關注的音視訊技術公衆号,每周推送來自阿裡雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。
産品百科 |RTC SDK 媒體擴充資訊的使用說明

繼續閱讀