产品百科 |RTC Android SDK 手动推流和手动订阅的实现步骤

简介: 通过本章节,您可以了解手动推流和手动订阅的实现步骤。

音视频通信 RTC(Real-Time Communication)是阿里云覆盖全球的实时音视频开发平台,依托核心音视频编解码、信道传输、网络调度技术,提供高可用、高品质、超低延时的音视频通信服务,让用户快速搭建多端实时应用,适用于在线教育、视频会议、互动娱乐、音视频社交等场景。


产品链接:https://www.aliyun.com/product/rtc


通过本章节,您可以了解手动推流和手动订阅的实现步骤。

背景信息

RTC SDK 提供了 setAutoPublish 接口,支持设置自动推流或自动订阅,设置自动推流时 SDK 会在加入频道后自动推流,设置自动订阅时 SDK 会在频道中有其他用户推流时自动进行订阅拉流,无需 App 进行操作。

如果您需要根据具体业务场景,按需进行推流或者拉流,可以使用手动推流或手动订阅方式。

手动推流

  1. 创建引擎实例后,在加入频道前,设置关闭自动推流和自动订阅。
// 创建引擎实例
AliRtcEngine mAliRtcEngine = AliRtcEngine.getInstance(getApplicationContext());
 mAliRtcEngine.setRtcEngineEventListener(new AliRtcEngineEventListener() {
                @Override
                public void onPublishResult(int result, String publishId) {
                    //异步推流的回调
                }
               @Override
                public void onUnpublishResult(int result) {
                  //异步取消推流的回调
                }
});
// 关闭自动推流和自动订阅
mAliRtcEngine.setAutoPublish(false, false);
  1. 配置后加入频道,并根据业务需要启动推流(音频 / 摄像头 / 屏幕分享),并通过回调确认推流是否成功,如果推流失败需要进行重试或用户提示。
// 配置开启推送音频流
mAliRtcEngine.configLocalAudioPublish(true);
// 配置开启推送摄像头流
mAliRtcEngine.configLocalCameraPublish(true);
// 配置开启推送屏幕分享流
mAliRtcEngine.configLocalScreenPublish(true);
// 启动推流
mAliRtcEngine.publish();

  1. 说明 publish 接口是异步接口,您在调用之后需要收到 onPublishResult 回调且 result 0 表示推流成功,接口及对应回调请参见 setRtcEngineEventListener
  2. 当业务场景需要停止推流时,您需要关闭步骤 2 配置的媒体流并执行停止推流。
// 配置停止推送音频流
mAliRtcEngine.configLocalAudioPublish(false);
// 配置停止推送摄像头流
mAliRtcEngine.configLocalCameraPublish(false);
// 配置停止推送屏幕分享流
mAliRtcEngine.configLocalScreenPublish(false);
// 停止推流
mAliRtcEngine.publish();

手动订阅

  1. 创建引擎实例后,在加入频道前,设置关闭自动订阅。
// 创建引擎实例
AliRtcEngine mAliRtcEngine = AliRtcEngine.getInstance(getApplicationContext());
 mAliRtcEngine.setRtcEngineEventListener(new AliRtcEngineEventListener() {
                @Override
                public void onSubscribeResult(String uid, int result, AliRtcEngine.AliRtcVideoTrack vt,
                                      AliRtcEngine.AliRtcAudioTrack at) {
                   //异步订阅成功或者失败的回调
                }
                @Override
              public void onUnsubscribeResult(int result, String userId) {
                  Log.d(TAG, "onUnsubscribeResult result : " + result);
                  //取消订阅成功或者失败的回调
              }
             @Override
            public void onRemoteTrackAvailableNotify(String uid, AliRtcEngine.AliRtcAudioTrack audioTrack,
                                                           AliRtcEngine.AliRtcVideoTrack videoTrack) {
                  //远端用户推流发生变化时回调
             }
});
// 关闭自动推流和自动订阅
mAliRtcEngine.setAutoPublish(false, false);
  1. 配置后并成功加入频道,当频道中有用户推流发送变化时,SDK 会收到 onRemoteTrackAvailableNotify 回调进行通知,回调中指明了推流用户及推送的媒体流。onRemoteTrackAvailableNotify 回调中指明了推流用户 ID,以及该用户发生状态变更的媒体流,您需要记录该用户已推送媒体流:
  • audioTrack 为 AliRtcAudioTrackMic 时,表示该远端用户推送了音频流。
  • videoTrack 为 AliRtcVideoTrackCamera 或 AliRtcVideoTrackBoth 时,表示该远端用户推送了摄像头视频流。
  • videoTrack 为 AliRtcVideoTrackScreen 或 AliRtcVideoTrackBoth 时,表示该远端用户推送了屏幕分享视频流。
  • audioTrack 为 AliRtcAudioTrackNo 并且 videoTrack 为 AliRtcVideoTrackNo 时,表示该远端用户已停止推流。
// 接收到其他用户推流变化通知
@Override
public void onRemoteTrackAvailableNotify(String uid, AliRtcEngine.AliRtcAudioTrack audioTrack,
                                                 AliRtcEngine.AliRtcVideoTrack videoTrack) {
}
  1. 说明 必须在加入频道成功后,您才会接收到频道中其他用户推流的 onRemoteTrackAvailableNotify 回调,您需要查看加入频道结果是否成功,加入频道回调请参见 onJoinChannelResult
  2. 接收到推流回调后,可根据业务需要对用户实际推送的媒体流进行配置,然后启动订阅。
// 配置是否订阅指定用户音频流,可根据需要设置开启/关闭
mAliRtcEngine.configRemoteAudio(userId, true|false);
// 配置是否订阅指定用户摄像头流,可根据需要设置开启/关闭
mAliRtcEngine.configRemoteCameraTrack(userId, false, true|false);
// 配置是否订阅指定用户屏幕分享流,可根据需要设置开启/关闭
mAliRtcEngine.configRemoteScreenTrack(userId, true|false);
// 启动订阅
mAliRtcEngine.subscribe(userId);
  1. 说明 subscribe 接口是异步接口,需要收到 onSubscribeResult 回调,详情请参见onSubscribeResult
  • 必须在接收到频道内用户的推流回调之后,才能对该用户进行订阅拉流,否则订阅失败;如果频道内用户状态已变为停止推流,订阅无法成功。
  • 您需要关注回调中远端用户实际推送的媒体流,对于没有推送的媒体流,订阅无法成功。
  • 如果用户状态已变为停止推流后,不能在对该用户执行订阅操作,直到再次接收到回调(该用户重新开始推送媒体流)。
  1. 订阅成功后,当业务场景需要取消订阅指定用户媒体流,或远端用户已停止推流(参考步骤 2 中远端停止推流状态)时,配置并取消订阅对应用户。
// 配置是否订阅指定用户音频流,可根据需要设置关闭
mAliRtcEngine.configRemoteAudio(userId, false);
// 配置是否订阅指定用户摄像头流,可根据需要设置关闭
mAliRtcEngine.configRemoteCameraTrack(userId, false, false);
// 配置是否订阅指定用户屏幕分享流,可根据需要设置关闭
mAliRtcEngine.configRemoteScreenTrack(userId, false);
// 取消订阅
mAliRtcEngine.subscribe(userId);


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

image.png


相关文章
|
7月前
|
JavaScript 前端开发 Android开发
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
203 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
7月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
416 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
API 开发工具 Android开发
视觉智能开放平台产品使用合集之人脸活体检测能力是否支持Android端或者iOS端直接调用
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
126 1
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
365 0
|
11月前
|
程序员 开发工具 Android开发
Android|使用阿里云推流 SDK 实现双路推流不同画面
本文记录了一种使用没有原生支持多路推流的阿里云推流 Android SDK,实现同时推送两路不同画面的流的方法。
201 7
|
10月前
|
Java Linux API
Android SDK
【10月更文挑战第21天】
270 1
|
Android开发 芯片 Linux
Android编译系统产品线(基于友善之臂tin4412 android5.0系统)
1.Android源码中的产品线解析 通常产品厂商在拿到Android源码后会在Android源码基础上进行定制修改,以匹配适应自己的产品。这就引入了产品线的概念。Android系统源码中,产品相关的文件通常保存在 device/company/product目录下其目录的组织结构为 在tiny4412 android 5.
1612 0
|
2月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
144 11
|
6月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
1198 77
|
3月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
167 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡