拉流

更新时间:2021-05-26

功能简介

在多人通话和互动直播等场景中,如果想要看到推流方推送的音视频,需要进行拉流操作并且设置视频对应的渲染画面才能听到声音和看到画面。

步骤

加入房间拉流

如果已经有一个开播的房间, 新的用户 加入房间时会获取到房间内所有推流成员的数据。方法具体介绍,可参考 登录房间 介绍

/*
 * 加入音视频房间(音视频会议)
 * @param userId 用户 ID
 * @param roomId 房间 ID
 * @param isHost 是否是主持人
 * @param isOnlyAudio 是否以音频模式加入,以音频模式加入,则没有视频流
 * @param delegate 房间回调代理
 */
- (void)loginRoom:(NSString *)userId
       roomId:(NSString *)roomId
       isHost:(bool)isHost
       isOnlyAudio:(bool)isOnlyAudio
       delegate:(id<LVRTCEngineDelegate>)delegate;

加入房间回调

当调用 loginRoom 加入房间后,会自动回调 OnEnterRoomComplete 方法,把房间内的所有用户都通过 users 数组回调出来。

/*
 * 加入房间成功的回调
 * @param code 加入房间是否成功错误码
 * @param users 包含房间内的用户列表,如果房间中有用户存在,该列表会自动生效
 */
-(void) OnEnterRoomComplete:(LVErrorCode)code users:(nullable NSArray<LVUser*>*)users

加入房间回调处理 - 播放拉下来的流

通过 startPlayingStream 播放指定用户的流。

/*
 * 开始播放一路音视频流,播放状态的变更通过 OnPlayStateUpdate:userId: 回调
 * @param userId 要播放的音视频流用户 ID
 */
[[LVRTCEngine sharedInstance] startPlayingStream:user.userId];

停止播放流

stopPlayingStream 停止指定用户的流。

/*
 * 停止播放一路音视频流
 * @param userId 要停止播放的音视频流用户 ID
 */
[[LVRTCEngine sharedInstance] stopPlayingStream:uid];

拉流在具体业务场景中处理

业务场景中的处理抽象步骤可参考

  • 开播端

    1. startCapture 开启摄像头采集

    2. addDisplayView 添加绑定渲染视图

    3. loginRoom 登录房间,在 OnEnterRoomComplete 中进行处理。

    4. startPublishing 开始推流

  • 加入端 - 拉流

    1. loginRoom 登录房间,拉取房间所有流,在OnEnterRoomComplete 中进行处理。

    2. addDisplayView 添加绑定渲染视图,指定视图 uid。

    3. startPlayingStream 开始拉流

其他 API

设置拉流时数据信息回调频率

  • 拉流状态的变更通过 OnPlayQualityUpate 方法回调。
  • 通过设置拉流信息回调频率,在 OnPlayQualityUpate 拿到相关质量信息。
/* 设置拉流时数据统计信息回调的频率(必须在登录房间之前设置) */
[LVRTCEngine setPlayQualityMonitorCycle:1];

/*
 * 播放质量变化的通知,SDK 内部会定时统计拉流质量信息,APP 可以实现该方法获取拉流的视频质量信息统计,回调的频率可以通过 +setPlayQualityMonitorCycle 进行设置
 * @param quality 质量信息
 * @param userId 用户 ID
 */
- (void)OnPlayQualityUpate:(LVVideoStatistic *)quality userId:(NSString*)userId;

LVVideoStatistic 数据信息回调类

  • 此类包含拉流的相关信息,包含帧率、分辨率、码率等。
/* 视频编码帧数量 */
@property (nonatomic, assign) int videoEncodeFrames;

/* 视频总发送包数量 */
@property (nonatomic, assign) int videoSentPackets;

/* 视频总发送字节数 */
@property (nonatomic, assign) long long videosentKbytes;

/* 视频输入帧率 */
@property (nonatomic, assign) int videoFps;

/* 视频丢包总数 */
@property (nonatomic, assign) int videoLostPackets;

/* 音频丢包总数 */
@property (nonatomic, assign) int audioLostPackets;

/* 当前可用的发送带宽 */
@property (nonatomic, assign) int availableSendBandwidth;

/* 视频码率 */
@property (nonatomic, assign) int videobitratebps;

/* 音频码率 */
@property (nonatomic, assign) int audiobitratebps;

/* 视频编码耗时,单位 ms,仅对视频发送方有效 */
@property (nonatomic, assign) int videoAvgEncodeCostMs;

/* 音频包 RTT,单位 ms */
@property (nonatomic, assign) int audioRtt;

/* 视频包 RTT,单位 ms */
@property (nonatomic, assign) int videoRtt;

/* 累计视频丢包百分比 */
@property (nonatomic, assign) int videoLostPercent;

/* 累计音频丢包百分比 */
@property (nonatomic, assign) int audioLostPercent;

/* 推流:编码视频宽,拉流:输入视频宽 */
@property (nonatomic, assign) int frameWidth;

/* 推流:编码视频高,拉流:输入视频高 */
@property (nonatomic, assign) int frameHeight;