互动直播
音视频互动直播是指两个或两个以上人通过连麦方式进行超低延迟的互动,并将互动的音视频数据传递其他的不同观众。音视频互动直播通常是连麦互动场景。通过连麦可以让主播和连麦观众进行超低延迟的音视频通话,然后由主播将互动数据分发给直播观众。
互动直播分为两个部分: 1、连麦加入同一个房间内进行超低延迟音视频互动。 2、将连麦房间内的音视频数据进行直播分发。 我们提供两种形式: a) 服务端混流并分发直播:由RTC的服务端进行音视频混流,同时将混流后的数据推送给LSS直播服务器,LSS直播服务器直接下发直播流。 i. 优点:网络消耗更少,CPU和GPU压力小,能够适配低端机型。 ii. 缺点:RTC内部为了实时性会动态压缩画面质量,直播出去的清晰度可能不足;由普通推流直播和互动直播服务端转推切换时,观众端播放器需要进行重连拉流,造成卡顿。 b) 本地混流并分发直播:由RTC互动模块产出音视频数据,并由直播推流模块进行推流直播。 i. 优点:画面质量只与预设值相关,不会动态调整。由普通推流直播和互动直播本地混流切换时,观众端播放器可以流畅过度。 ii. 缺点:网络消耗更多,CPU和GPU压力答,需要高端机型适配。
1.1 互动通道基本配置
互动通道基本配置包括互动模块鉴权信息(appId、token)、用户标识(userId、userName)及互动通道信息(roomName、mediaServer)等必选设置。
鉴权信息appID 实时音视频通讯appId和token的获取:https://cloud.baidu.com/doc/RTC/s/Qjxbh7jpu
鉴权信息token 实时音视频通讯appId和token的获取:https://cloud.baidu.com/doc/RTC/s/Qjxbh7jpu
互动房间内自己的信息userId 为了区分互动房间内的不同人,我们使用userId来区别房间内的不同用户。 注意:同一个房间(roomName)内,一定不能使用两个相同的userId。
互动房间内自己的信息userName 房间内不同的虽然不允许相同的userId,但是允许相同的userName。是为了显示房间内的用户更加的灵活。
房间信息roomName 主播和连麦观众必须加入到同一个互动房间才能进行超低延迟会话。因此roomName两个人必须保持一致。
信令服务地址 mediaServer 互动通道信令服务器地址,用于客户端与媒体服务器的信令交互。 默认信令服务地址:wss://rtc.exp.bcelive.com:8989/janus
互动通道基本配置接口:
// 设置互动通道appid
public final Builder setAppId(String appId)
// 设置互动通道token
public final Builder setTokenStr(String tokenStr)
// 设置用户id
public final Builder setUserId(int userId)
// 设置用户名
public final Builder setUserName(String userName)
// 设置互动通道房间
public final Builder setRoomName(String roomName)
// 设置互动通道信令服务器地址
public final Builder setMediaServer(String mediaServer)
1.2 互动通道媒体参数及转推配置
设置纯音频互动 纯音频互动下,能看到对方画面和听到对方声音。但对方不能看到本端画面,只能听到本端声音。
// 音频互动
public final Builder setAudioOnly(boolean audioOnly)
音频外部采集 互动模块音频外部采集是相对外部直播模块而言,互动模块由部具备独立音频采集功能,同时直播模块也具备打开音频设置采集音频的能力, 由于音频设备的独占性,不能在互动直播时同时开启互动模块及直播模块的音频采集功能,所以在互动直播时需要设置互动模块音频外部采集,即从外部直播模块采集音频传入互动模块。
// 是否开启音频外部采集 默认开启
public final Builder setExternalAudioRecord(boolean enableExternalAudioRecord
)
互动通道音频采集率设置
// 设置互动通道音频采样率
public final Builder setAudioSampleRate(int sampleRate)
注意:当开启音频外部采集,互动通道的音频采集自动与直播音频采集率一致。
互动通道音频通道数设置
// 设置互动通道音频通道数
public final Builder setAudioChannels(int channels)
注意:当开启音频外部采集,互动通道的音频通道自动与直播音频通道一致。
视频分辨率及码率设置
// 设置互动通信视频分辨及码率 格式: WxH-kbps,如:544x960-1000kbps
public final Builder setVideoResolution(String videoResolution)
码率还可以通过如下接口设置,上面方法的码率设置优化级高。
// 设置互动通道视频比特率
public final Builder setVideoBitrate(int videoBitrate)****
互动通道视频帧率设置
// 设置互动通道视频帧率
public final Builder setVideoFramerate(int videoFramerate)
服务转推使能
// 设置服务端转推使能
public final Builder setEnableTransfer(boolean rtcMix)
互动混流模式
public enum FlowMixMode {
FLOW_MIX_NONE,
// 服务端混流
SERVER_FLOW_MIX,
// 本地音频混流
LOCAL_AUDIO_FLOW_MIX,
// 本地音视频混流
LOCAL_AV_FLOW_MIX,
}
// 设置混流模式
public final Builder setFlowMixMode(FlowMixMode mode)
1.3 互动推流器初始化与直播
互动通道参数配置 参考上节互动直播参数配置,主要涉及鉴权信息(appId、token)、用户标识(userId、userName)及互动通道信息(roomName、mediaServer)等基本配置 及 互动媒体通道与转推配置。
互动推流器初始化
/**
* 互动直播推流器构造方法
* @param context 上下文环境
* @param surfaceView 本地预览视窗
* @param liveConfig 推流配置
* @param interactConfig 互动配置
*/
public InteractStreamingPusher(Context context, GLSurfaceView surfaceView, LiveConfig liveConfig, InteractConfig interactConfig)
设置连麦远端视频视窗
/**
* 设置连麦远端视频视窗
* @param remoteDisplay 远端视频显示控件
*/
public void setRemoteDisplay(RTCVideoView remoteDisplay)
直播创建与销毁 直播创建与销毁接口与调用流程与AR直播相同,此处略。 同时,退出互动直播时需要销毁互动通道:
/**
* 销毁互动连麦通道
*/
public void releaseInteractSession()
1.4 互动通道建立与销毁
建立多媒体互动 当主播端接收到连麦互动请求后调用如下接口建立连麦。
//建立连麦互动
public void setupInteractChannel()
注意:若设置为服务转推模式,则需要在建立连麦前,先关闭当前的直播,示例:
// 服务转推模式下先 关闭直播通道
if (mPushMode == Constraints.MODE_LIVE_INTERACT_TRANSFORM) {
mInteractSession.stopStreaming();
mInteractSession.destroyRtmpSession();
mIsLiveConnected = false;
}
// 建立连麦互动通道
mInteractSession.setupInteractChannel();
退出多媒体互动 当主播主动或被动挂断连麦互动时调用如下接口退出互动连接。
// 退出连麦互动
public void destroyInteractChannel()
注意:同样的,若设置为服务转推模式,则需要在退出连麦后,再开启直播,示例:
// 销毁连麦互动通道
mInteractSession.destroyInteractChannel();
// 服务转推模式下恢复直播通道
if (mPushMode == Constraints.MODE_LIVE_INTERACT_TRANSFORM) {
mInteractSession.configRtmpSession(mPushUrl);
}
1.5 其它互动接口
设置本地混流布局模板
/**
* 通用混流布局模板初始化配置
* @param width 视窗宽度
* @param height 视窗高度
* @param positionX 视窗X位标相对比例 [0, 1], 对等布局模式下positionX 无效
* @param positionY 视窗Y位标相对比例 [0, 1]
* Note: 若为画中画{@link MixTemplate#PIC_IN_PIC} 布局,则视窗表示远端视频小窗
* 若为对 等{@link MixTemplate#SIDE_BY_SIDE_H} 布局,则视窗表示本地与远端组合后的视频小窗
*/
public MixStreamingConfig(MixTemplate template, int width, int height, float positionX, loat positionY)
/**
* 混流布局模板初始化配置
* NOTE: 该构造函数主要用于画中画模板, 可直接设置小窗位置到: 左上、右上、左下、右下
* @param width 视窗宽度
* @param height 视窗高度
* @param location 位置 {@link LOCATION} [LEFT_TOP,RIGHT_TOP,LEFT_BOTTOM,RIGHT_BOTTOM]
*/
public MixStreamingConfig(MixTemplate template, int width, int height, LOCATION location)
/**
* 设置本地混流布局模板
* @param mixStreamingConfig 模板配置
*/
public void setMixStreamingConfig(MixStreamingConfig mixStreamingConfig)
设置左上角画中画布局示例:
MixStreamingConfig mixStreamingConfig =
new MixStreamingConfig(MixStreamingConfig.MixTemplate.PIC_IN_PIC, 180, 320, MixStreamingConfig.LOCATION.LEFT_TOP);
mInteractSession.setMixStreamingConfig(mixStreamingConfig);
设置任意垂直位置及视频高度对等布局示例:
MixStreamingConfig mixStreamingConfig =
new MixStreamingConfig(MixStreamingConfig.MixTemplate.SIDE_BY_SIDE_H
, 0, 240, 0.0f, 0.5f);
mInteractSession.setMixStreamingConfig(mixStreamingConfig);
互动连麦本端静音 连麦时本端静音,区别与setMuteAudio(boolean isMute) 推流静音。
/**
* 连麦静音
* @param muted 是否静音
*/
public void interactMute(boolean muted)
预设开启扬声器 连麦时默认开启扬声器, 可通过该接品预设是否开启扬声器输出音频。
/**
* 预设开启扬声器
* @param enable 是否预设扬声器
*/
public void presetLoudSpeaker(boolean enable)
切换互动连麦扬声器
/**
* 预设开启扬声器
* @param enable 是否预设扬声器
*/
public void presetLoudSpeaker(boolean enable)
连麦异常重连
/**
* 连麦异常重连 默认重连间隔3s
*/
public void interactReconnect()
/**
* 连麦异常重连
* @param interval 重连间隔 不小于3s
*/
public void interactReconnect(int interval)
注意:由于涉及互动模块内部及服务端状态的恢复, 重连间隔建议不小于3s.
设置互动直播水印 设置互动直播水印方法与AR直播一样,不同的,互动直播时小主播端视频及观众端视频可同时展示水印。