@protocol ByteRtcEngineDelegate <NSObject>
ByteRtcEngineDelegate 协议包含了SDK提供的回调方法,SDK通过代理向应用程序上报一些运行时事件
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine didOccurWarning:(ByteRtcWarningCode)Code;
发生警告回调。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | 当前 RTCEngine 对象 |
| Code | ByteRtcWarningCode | 警告代码,详情定义见: ByteRtcWarningCode |
注意
该回调方法表示SDK运行时出现了(网络或媒体相关的)警告。通常情况下,SDK上报的警告信息App可以忽略,SDK会自动恢复。
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine didOccurError:(ByteRtcErrorCode)errorCode;
发生错误回调。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | 当前 RTCEngine 对象 |
| errorCode | ByteRtcErrorCode | 错误代码,详情定义见: ByteRtcErrorCode |
注意
表示SDK运行时出现了(网络或媒体相关的)错误。通常情况下,SDK上报的错误意味着SDK无法自动恢复,需要App干预或提示用户。
- (void) rtcEngine:(ByteRtcEngineKit * _Nonnull)engine networkTypeChangedToType:(ByteRtcNetworkType)type;
SDK 当前网络连接类型改变回调。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit 对象 |
| type | ByteRtcNetworkType | SDK 当前的网络连接类型,详见:ByteRtcNetworkType |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine didJoinChannel:(NSString * _Nonnull)channel withUid:(nonnull NSString*)uid elapsed:(NSInteger) elapsed;
加入房间回调。 该回调方法表示该用户成功加入了指定的房间。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit 对象 |
| channel | NSString* | 房间 ID |
| uid | NSString* | 用户 ID |
| elapsed | NSInteger | 从调用 joinChannelByKey:channelName:info:uid: 方法到加入房间成功所经历的时间间隔(毫秒) |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine didRejoinChannel:(NSString * _Nonnull)channel withUid:(nonnull NSString*)uid elapsed:(NSInteger) elapsed;
重新加入房间成功。 该回调方法表示该用户成功重连入指定的房间。有时候由于网络状况异常,SDK 可能会失去和服务器的连接,此时 SDK 会自动重试 连接,重连成功后会通过此回调方法通知用户。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit 对象 |
| channel | NSString* | 房间 ID |
| uid | NSString* | 用户 ID |
| elapsed | NSInteger | 从连接断开到重连成功所经历的时间间隔(毫秒) |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine didJoinedOfUid:(nonnull NSString*)uid elapsed:(NSInteger)elapsed;
远端用户加入当前房间回调。 1.频道模式为通信模式。如果本端用户已经在房间中,有新的远端用户加入时,SDK 通过此回调方法通知房间中有新用户加入;如果 用户加入房间前,房间中已有其他用户,新加入的用户也会收到这些已有用户的加入房间回调。 2.频道模式为直播、游戏或云游戏模式。则只会回调用户角色为主播或观众加入房间。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit 对象 |
| uid | NSString* | 新加入的远端用户 ID |
| elapsed | NSInteger | 从本端用户调用 joinChannelByKey:channelName:info:uid: 加入房间到收到该事件经历的时间(毫秒) |
注意
此回调会被触发的时机如下:1.通信模式下的用户或其他模式下用户角色为主播、观众的用户调用 joinChannelByKey:channelName:info:uid: 方法加入房间。 2.通信模式下的用户或其他模式下用户角色为主播、观众的用户在断网后重连入房间。 3.直播、游戏或云游戏模式下用户角色为静默观众的用户调用 setClientRole:withKey: 方法将用户角色切换至主播或观众。
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine didOfflineOfUid:(NSString* _Nonnull )uid reason:(ByteRtcUserOfflineReason)reason;
远端用户离开当前房间回调。 提示本端用户有远端用户离开了房间。用户离开房间的原因有两个,即用户主动调用 leaveChannel: 方法离开 房间和超时掉线。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit 对象 |
| uid | NSString* | 离开的远端用户 ID |
| reason | ByteRtcUserOfflineReason | 用户离开的原因,详见枚举类型 ByteRtcUserOfflineReason |
注意
此回调会被触发的时机如下:1.通信模式下的用户或其他模式下用户角色为主播、观众的用户调用 leaveChannel: 方法离开房间。 2.直播、游戏或云游戏模式下用户角色为主播或观众的用户调用 setClientRole:withKey: 方法将用户角色切换s至静默观众。 3.远端用户断网且一直未恢复。
- (void)rtcEngine:(ByteRtcEngineKit *_Nonnull)engine didStreamRemoved:(ByteRtcByteStream *_Nonnull)stream reason:(RtcStreamRemoveReason)reason;
房间内远端流移除回调。 房间内的远端用户停止发布音视频流时,本端用户会收到此回调通知。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit 对象 |
| stream | ByteRtcByteStream* | 流的属性,详见数据结构 ByteRtcByteStream |
| reason | RtcStreamRemoveReason | 远端流移除原因,详见枚举类型 RtcStreamRemoveReason |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine didStreamAdded:(ByteRtcByteStream* _Nonnull)stream;
房间内新流发布回调。 房间内的远端用户发布新的音视频流时,本端用户会收到此回调通知。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit 对象 |
| stream | ByteRtcByteStream* | 流的属性,详见数据结构 ByteRtcByteStream |
-(void)rtcEngine:(ByteRtcEngineKit *_Nonnull)engine didStreamSizeChange:(NSString* _Nonnull)uid width:(int)width height:(int)height rotation:(int)rotation;
视频size变化回调。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit对象 |
| uid | NSString* | 用户ID |
| width | int | 视频宽度 |
| height | int | 视频高度 |
| rotation | int | 视频旋转信息,详见类型ByteVideoRotation |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine firstLocalVideoFrameWithSize:(CGSize)size elapsed:(NSInteger)elapsed;
本地首帧视频数据渲染事件回调。调用 joinChannelByKey:channelName:info:uid:后,渲染本地首帧视频数据前的事件。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit对象 |
| size | CGSize | 视频的宽高尺寸 |
| elapsed | NSInteger | 从调用 joinChannelByKey:channelName:info:uid:到渲染本地首帧视频数据前的总耗时(ms) |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine firstRemoteVideoFrameOfUid:(NSString* _Nonnull )uid size:(CGSize)size elapsed:(NSInteger)elapsed;
远端首帧视频数据渲染事件回调。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit对象 |
| uid | NSString* | 发送当前帧的远端用户的用户ID |
| size | CGSize | 视频的宽高尺寸 |
| elapsed | NSInteger | 从开始订阅远端流到开始渲染远端首帧视频数据事件的总耗时(ms) |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine firstLocalScreenFrameWithSize:(CGSize)size elapsed:(NSInteger)elapsed;
本地首帧屏幕数据渲染事件回调。调用 joinChannelByKey:channelName:info:uid: 后,渲染本地首帧屏幕数据前的事件。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | RtcEngine 实例,参考: ByteRtcEngineKit |
| size | CGSize | 视频的宽高尺寸 |
| elapsed | NSInteger | 从调用 joinChannelByKey:channelName:info:uid: 到渲染本地首帧屏幕数据前的总耗时 (ms) |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine firstRemoteScreenFrameOfUid:(NSString* _Nonnull )uid size:(CGSize)size elapsed:(NSInteger)elapsed;
远端首帧屏幕数据渲染事件回调。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | RtcEngine 实例,参考: ByteRtcEngineKit |
| uid | NSString* | 发送当前帧的远端用户的用户 id |
| size | CGSize | 视频的宽高尺寸 |
| elapsed | NSInteger | 从开始订阅远端流到开始渲染远端首帧屏幕数据事件的总耗时 (ms) |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine didVideoMuted:(BOOL)muted byUid:(NSString * _Nonnull)uid;
远端用户暂停/重新发送视频回调。房间中远端用户调用muteLocalVideoStream:YES或muteLocalVideoStream:NO时,本地用户将会收到该回调。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit对象 |
| muted | BOOL | YES:远端用户恢复发送视频流;NO:远端用户暂停发送视频流 |
| uid | NSString* | 调用muteLocalVideoStream接口的远端用户ID |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine didVideoEnabled:(BOOL)enabled byUid:(NSString * _Nonnull)uid;
远端用户启用/关闭视频回调。房间中远端用户调用enableVideo/disableVideo时,本地用户将会收到该回调。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit对象 |
| enabled | BOOL | YES:远端用户启动了视频功能;NO:远端用户关闭了视频功能 |
| uid | NSString* | 调用enableVideo接口的远端用户ID |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine didLocalVideoEnabled:(BOOL)enabled byUid:(NSString * _Nonnull)uid;
远端用户启用/关闭本地视频回调。房间中远端用户调用enableLocalVideo时,本地用户将会收到该回调。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit对象 |
| enabled | BOOL | YES:远端用户启动了本地视频;NO:远端用户关闭了本地视频 |
| uid | NSString* | 调用enableLocalVideo接口的远端用户ID |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine firstRemoteVideoDecodedOfUid:( NSString* _Nonnull )uid size:(CGSize)size elapsed:(NSInteger)elapsed;
远端首帧视频数据解码事件回调。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit对象 |
| uid | NSString* | 发送当前帧的远端用户的用户ID |
| size | CGSize | 视频的宽高尺寸 |
| elapsed | NSInteger | 从开始订阅远端流到远端视频首帧解码事件的总耗时(ms) |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine firstLocalAudioFrame:(NSInteger)elapsed;
当收到本地第一帧音频的时候上报该事件
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit 对象 |
| elapsed | NSInteger | 从开始发布音频流到收到该事件经历的时间(毫秒单位) |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine firstRemoteAudioFrameOfUid:(NSString * _Nonnull)uid elapsed:(NSInteger)elapsed;
当收到远端流的第一帧音频的时候上报该事件
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit 对象 |
| uid | NSString* | 远端用户ID |
| elapsed | NSInteger | 从开始订阅音频流到收到该事件经历的时间(毫秒单位) |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine didAudioMuted:(BOOL)muted byUid:(NSString * _Nonnull)uid;
远端用户音频静音回调。 提示有远端用户已将其本地音频流静音(或取消静音),该回调由远端用户调用 muteLocalAudioStreammuteLocalAudioStream:,本地用户将会收到该回调。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit对象 |
| muted | BOOL | YES: 该用户已将其本地音频流静音;NO: 该用户已将其本地音频流取消了静音 |
| uid | NSString* | 远端用户 ID |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine didAudioEnabled:(BOOL)enabled byUid:(NSString * _Nonnull)uid;
远端用户启用/关闭音频回调。房间中远端用户调用enableAudio/disableAudio时,本地用户将会收到该回调。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit对象 |
| enabled | BOOL | YES:远端用户启动了音频功能;NO:远端用户关闭了音频功能 |
| uid | NSString* | 调用enableAudio接口的远端用户ID |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine didLocalAudioEnabled:(BOOL)enabled byUid:(NSString * _Nonnull)uid;
远端用户开启/关闭音频设备采集回调 提示有远端用户已开启/关闭音频设备采集,该回调由远端用户调用 enableLocalAudioenableLocalAudio: 方法触发
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit对象 |
| enabled | BOOL | YES: 该用户开启了音频设备采集;NO: 该用户关闭了音频设备采集 |
| uid | NSString* | 远端用户 ID |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine reportAudioVolumeIndicationOfSpeakers:(NSArray<ByteRtcAudioVolumeInfo *> * _Nonnull)speakers totalVolume:(NSInteger)totalVolume;
通话音量提示的回调。回调当前房间内每个用户的音量、总音量。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | RtcEngine 实例 |
| speakers | NSArray |
房间内用户的音量信息的数组,每个用户音量信息详见类型 ByteRtcAudioVolumeInfo,包括发送流与接收流 |
| totalVolume | NSInteger | 房间内的总音量大小,只包括接收流 |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine reportRtcStats:(ByteRtcStats * _Nonnull)stats;
当前通话数据统计回调。该回调在通话或直播中每两秒触发一次。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | RtcEngine 实例 |
| stats | ByteRtcStats* | 频道的统计数据,详见类型ByteRtcStats |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine reportSysStats:(const ByteRtcSysStats * _Nonnull)stats;
周期性回调,报告当前cpu与memory使用率
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit 对象。 |
| stats | const ByteRtcSysStats* | cpu和memory使用率信息,详见 ByteRtcSysStats 数据类型。 |
- (void)rtcEngine:(ByteRtcEngineKit *_Nonnull)engine networkQuality:(NSString*_Nonnull)uid txQuality:(ByteNetworkQuality)txQuality rxQuality:(ByteNetworkQuality)rxQuality;
通话中用户的媒体流网络上下行质量报告回调。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit 对象 |
| uid | NSString* | 回调的网络质量报告所属用户的用户 ID |
| txQuality | ByteNetworkQuality | uid 所属用户的媒体流上行网络质量 |
| rxQuality | ByteNetworkQuality | uid 所属用户的媒体流下行网络质量 |
注意
1.加入房间成功后,每隔 2 秒会有一次回调,通知房间内用户与媒体服务器之间数据交互的网络质量; 2.当 uid 为本地用户 ID 时,txQuality 为该用户的上行网络质量,rxQuality 为该用户的下行网络质量; 3.当 uid 为远端用户 ID 时,目前仅支持获取该用户的上行网络质量 txQuality ,下行网络质量 rxQuality 为 ByteRtcNetworkQualityUnknown; 4.ByteNetworkQuality 的定义详见:ByteNetworkQuality。
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine localVideoStats:(ByteRtcLocalVideoStats * _Nonnull)stats;
发布视频流数据统计回调。
本地用户发布视频流成功后,SDK 会周期性(2s)的通过此回调事件通知用户发布的视频流在此次统计周期内的质量统计信息。统计信息通过 ByteRtcLocalVideoStats 类型的回调参数传递给用户,其中包括发送视频比特率、发送帧率、编码帧率等。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit 对象。 |
| stats | ByteRtcLocalVideoStats* | 发布视频流质量统计数据,详见 ByteRtcLocalVideoStats 数据类型。 |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine remoteVideoStats:(ByteRtcRemoteVideoStats * _Nonnull)stats;
订阅视频流数据统计回调。
本地用户订阅视频流成功后,SDK 会周期性(2s)的通过此回调事件通知用户订阅的视频流在此次统计周期内的质量统计信息。统计信息通过 ByteRtcRemoteVideoStats 类型的回调参数传递给用户,其中包括视频宽高、接收带宽、帧率及卡顿等信息。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | ByteRtcEngineKit 对象。 |
| stats | ByteRtcRemoteVideoStats* | 订阅视频流质量统计数据,详见 ByteRtcRemoteVideoStats 数据类型。 |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine localAudioStats:(ByteRtcLocalAudioStats * _Nonnull)stats;
通话中订阅音频流质量报告回调。包括发送音频比特率,音频丢包率等
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | RtcEngine 实例 |
| stats | ByteRtcLocalAudioStats* | 发布音频流质量,参见 ByteRtcLocalAudioStats |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine remoteAudioStats:(ByteRtcRemoteAudioStats * _Nonnull)stats;
通话中订阅音频流质量报告回调。包括订阅音频流的发布者的 uid、接收音频比特率、音频丢包率及卡顿信息。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | RtcEngine 实例 |
| stats | ByteRtcRemoteAudioStats* | 订阅音频流质量,参见 ByteRtcRemoteAudioStats |
- (void)rtcEngine:(ByteRtcEngineKit * _Nonnull)engine audioQualityOfUid:(NSString* _Nonnull )uid quality:(ByteNetworkQuality)quality delay:(NSUInteger)delay lost:(NSUInteger)lost;
用户的音频质量回调。每两秒钟更新一次。
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| engine | ByteRtcEngineKit* | RtcEngine 实例 |
| uid | NSString* | 用户 id |
| quality | ByteNetworkQuality | 音频质量,参见 ByteNetworkQuality |
| delay | NSUInteger | 远端用户的延迟 |
| lost | NSUInteger | 丢失数据包的百分比 |
@protocol ByteRtcEngineMediaMetadataObserver <NSObject>
metadata 观察者,可以接收媒体流中的 metadata, 或者向媒体流中添加 metadata
| 返回 | 名称 |
|---|---|
| NSData* | videoFrameMediaMetaDataAtTime: |
| void | receiveVideoFrameFromUID:withExtendedData:atTimestamp: |
- (NSData *_Nullable)videoFrameMediaMetaDataAtTime:(NSTimeInterval)timestamp;
当SDK准备发送一个视频帧时,会回调该接口,向你询问是否需要在该视频帧中添加 metadata
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| timestamp | NSTimeInterval | 待添加 metadata 视频帧的时间戳, 单位微秒 |
返回值
待发送的数据,大小不能超过1024bytes
注意
1、返回 null 代表不需要添加 metadata2、回调中不能做长时间逻辑处理,以免影响视频卡顿
- (void)receiveVideoFrameFromUID:(NSString * _Nonnull)uid withExtendedData:(NSData* _Nullable)extendedData atTimestamp:(NSTimeInterval)timestamp;
当SDK收到的视频帧包含 medatada 时,会回调该接口
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| uid | NSString* | 当前帧所属的用户ID |
| extendedData | NSData* | metadata |
| timestamp | NSTimeInterval | 包含 metadata 视频帧的时间戳,单位为微秒 |
注意
回调中不能做长时间逻辑处理,以免影响视频卡顿
@protocol ByteEncryptHandler <NSObject>
自定义加密接口
| 返回 | 名称 |
|---|---|
| NSData* | ByteEngineEncryptRawData: |
| NSData* | ByteEngineDecryptRawData: |
- (NSData * _Nonnull)ByteEngineEncryptRawData:(NSData * _Nonnull)rawData;
自定义加密的方法接口,通过继承并实现该方法,可以扩展传输过程中的加密方法, 详见 setCustomizeEncryptHandler:
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| rawData | NSData* | 原始音视频桢数据 |
返回值
加密后的数据,可以为空,表示丢弃该桢
注意
返回的数据大小应控制在原始数据的90%~120%范围以内,不然将被丢弃
- (NSData * _Nonnull)ByteEngineDecryptRawData:(NSData * _Nonnull)rawData;
自定义解密的方法接口,通过继承并实现该方法,可以扩展传输过程中的解密方法, 详见 setCustomizeEncryptHandler:
传入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| rawData | NSData* | 原始音视频桢数据 |
返回值
解密后的数据,可以为空,表示丢弃该桢
注意
返回的数据大小应控制在原始数据的90%~120%范围以内,不然将被丢弃