产品百科 |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 不支持发送和接收。


「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。

image.png

相关文章
|
16天前
|
文字识别 算法 API
视觉智能开放平台产品使用合集之支持的离线SDK有哪些
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
视觉智能开放平台产品使用合集之支持的离线SDK有哪些
|
20天前
|
Java 开发工具
【Azure Developer】示例: 在中国区调用MSGraph SDK通过User principal name获取到User信息,如Object ID
【Azure Developer】示例: 在中国区调用MSGraph SDK通过User principal name获取到User信息,如Object ID
|
27天前
|
SQL Java 关系型数据库
实时数仓 Hologres产品使用合集之如何安装和使用Java SDK
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
|
26天前
|
运维 分布式计算 DataWorks
DataWorks产品使用合集之sdk的下载地址在哪里
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
16天前
|
存储 监控 API
视觉智能开放平台产品使用合集之人脸识别服务端的离线SDK是什么
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
8 0
|
20天前
|
机器学习/深度学习 开发工具 Python
【Azure 应用服务】使用Python Azure SDK 来获取 App Service的访问限制信息(Access Restrictions)
【Azure 应用服务】使用Python Azure SDK 来获取 App Service的访问限制信息(Access Restrictions)
|
21天前
|
开发工具 数据安全/隐私保护 Python
【Azure 环境】通过Python SDK收集所有订阅简略信息,例如订阅id 名称, 资源组及组内资源信息等,如何给Python应用赋予相应的权限才能获取到信息呢?
【Azure 环境】通过Python SDK收集所有订阅简略信息,例如订阅id 名称, 资源组及组内资源信息等,如何给Python应用赋予相应的权限才能获取到信息呢?
|
2月前
|
消息中间件 分布式计算 DataWorks
DataWorks产品使用合集之如何使用Python和阿里云SDK读取OSS中的文件
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
2月前
|
SQL 分布式计算 大数据
MaxCompute产品使用合集之如何使用SDK获取ODPS上的资源文件
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
1月前
|
缓存 JavaScript 前端开发
微信 JS-SDK Demo “分享信息设置” API 及数字签名生成方法(NodeJS版本)
微信 JS-SDK Demo “分享信息设置” API 及数字签名生成方法(NodeJS版本)更新时间(2020-10-29)

热门文章

最新文章