@tencentcloud/sdk-mcp 1.2.8 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/resource/doc/chatuikit/faq/common/server.md +54 -0
- package/resource/doc/chatuikit/faq/web_sdk/faq.md +60 -0
- package/resource/doc/livekit/vue/components/co-guest-panel.md +5 -5
- package/resource/doc/livekit/vue/components/live-view.md +16 -49
- package/resource/doc/livekit/vue/{components/live-list.md → live-list-integration.md} +13 -44
- package/resource/doc/livekit/vue/live-player-desk-integration.md +293 -0
- package/resource/doc/livekit/vue/{components/live-player.md → live-player-h5-integration.md} +118 -110
- package/resource/doc/livekit/vue/{components/broadcast.md → live-pusher-integration.md} +77 -82
- package/resource/doc/livekit/vue/workflow.md +219 -0
- package/resource/doc/native_live/android/V2TXLiveCode_api_android.md +334 -0
- package/resource/doc/native_live/android/V2TXLiveDef_api_android.md +434 -0
- package/resource/doc/native_live/android/V2TXLivePlayerObserver_api_android.md +685 -0
- package/resource/doc/native_live/android/V2TXLivePlayer_api_android.md +712 -0
- package/resource/doc/native_live/android/V2TXLivePremier_api_android.md +284 -0
- package/resource/doc/native_live/android/V2TXLivePusherObserver_api_android.md +849 -0
- package/resource/doc/native_live/android/V2TXLivePusher_api_android.md +1046 -0
- package/resource/doc/native_live/flutter/V2TXLiveCode_api_flutter.md +460 -0
- package/resource/doc/native_live/flutter/V2TXLiveDef_api_flutter.md +558 -0
- package/resource/doc/native_live/flutter/V2TXLivePlayerObserver_api_flutter.md +879 -0
- package/resource/doc/native_live/flutter/V2TXLivePlayer_api_flutter.md +668 -0
- package/resource/doc/native_live/flutter/V2TXLivePremier_api_flutter.md +456 -0
- package/resource/doc/native_live/flutter/V2TXLivePusherObserver_api_flutter.md +332 -0
- package/resource/doc/native_live/flutter/V2TXLivePusher_api_flutter.md +748 -0
- package/resource/doc/native_live/iOS/V2TXLiveCode_api_iOS.md +328 -0
- package/resource/doc/native_live/iOS/V2TXLiveDef_api_iOS.md +505 -0
- package/resource/doc/native_live/iOS/V2TXLivePlayerObserver_api_iOS.md +507 -0
- package/resource/doc/native_live/iOS/V2TXLivePlayer_api_iOS.md +676 -0
- package/resource/doc/native_live/iOS/V2TXLivePremier_api_iOS.md +284 -0
- package/resource/doc/native_live/iOS/V2TXLivePusherObserver_api_iOS.md +820 -0
- package/resource/doc/native_live/iOS/V2TXLivePusher_api_iOS.md +1065 -0
- package/resource/doc/trtc/C++/ITRTCCloud.md +4131 -0
- package/resource/doc/trtc/C++/ITRTCStatistics.md +326 -0
- package/resource/doc/trtc/C++/ITXAudioEffectManager.md +1306 -0
- package/resource/doc/trtc/C++/ITXDeviceManager.md +1029 -0
- package/resource/doc/trtc/C++/TRTCCloudCallback.md +2743 -0
- package/resource/doc/trtc/C++/TRTCTypeDef.md +3703 -0
- package/resource/doc/trtc/C++/TXLiteAVCode.md +930 -0
- package/resource/doc/trtc/android/TRTCCloud.md +3832 -0
- package/resource/doc/trtc/android/TRTCCloudDef.md +3945 -0
- package/resource/doc/trtc/android/TRTCCloudListener.md +2480 -0
- package/resource/doc/trtc/android/TRTCStatistics.md +296 -0
- package/resource/doc/trtc/android/TXAudioEffectManager.md +1344 -0
- package/resource/doc/trtc/android/TXBeautyManager.md +980 -0
- package/resource/doc/trtc/android/TXDeviceManager.md +441 -0
- package/resource/doc/trtc/android/TXLiteAVCode.md +914 -0
- package/resource/doc/trtc/iOS/TRTCCloud.md +4256 -0
- package/resource/doc/trtc/iOS/TRTCCloudDelegate.md +2580 -0
- package/resource/doc/trtc/iOS/TRTCStatistics.md +296 -0
- package/resource/doc/trtc/iOS/TXAudioEffectManager.md +1117 -0
- package/resource/doc/trtc/iOS/TXBeautyManager.md +986 -0
- package/resource/doc/trtc/iOS/TXDeviceManager.md +1025 -0
- package/resource/doc/trtc/iOS/TXLiteAVCode.md +929 -0
- package/resource/doc/trtc/iOS/TXLiveSDKTypeDef.md +3798 -0
- package/tools/definitions/get_faq_def.js +4 -0
- package/tools/definitions/get_faq_def.js.map +1 -1
- package/tools/definitions/get_native_live_api_def.js +22 -0
- package/tools/definitions/get_native_live_api_def.js.map +1 -0
- package/tools/definitions/get_trtc_native_api_def.js +17 -0
- package/tools/definitions/get_trtc_native_api_def.js.map +1 -0
- package/tools/definitions/get_web_live_uikit_component_detail_def.js +9 -3
- package/tools/definitions/get_web_live_uikit_component_detail_def.js.map +1 -1
- package/tools/definitions/get_web_live_uikit_integration_def.js +32 -0
- package/tools/definitions/get_web_live_uikit_integration_def.js.map +1 -0
- package/tools/index.js +8 -0
- package/tools/index.js.map +1 -1
- package/tools/live/get-web-live-uikit-integration.js +52 -0
- package/tools/live/get-web-live-uikit-integration.js.map +1 -0
- package/tools/native_live/get-native-live-api.js +31 -0
- package/tools/native_live/get-native-live-api.js.map +1 -0
- package/tools/trtc/get-trtc-native-api.js +31 -0
- package/tools/trtc/get-trtc-native-api.js.map +1 -0
- package/utils/generate-structured-result.js +34 -0
- package/utils/generate-structured-result.js.map +1 -0
- package/utils/handle-component-name.js +0 -8
- package/utils/handle-component-name.js.map +1 -1
- package/utils/report-cls-client.js +1 -1
- package/utils/report-es-client.js +1 -1
|
@@ -0,0 +1,820 @@
|
|
|
1
|
+
# 腾讯云直播SDK V2TXLivePusherObserver 直播推流器回调接口
|
|
2
|
+
|
|
3
|
+
## 概述
|
|
4
|
+
|
|
5
|
+
`V2TXLivePusherObserver.h` 是腾讯云直播SDK iOS/macOS平台的推流器回调接口定义文件,用于接收推流过程中的各种状态通知、统计数据、错误信息和事件回调。
|
|
6
|
+
|
|
7
|
+
**平台支持**: iOS, macOS
|
|
8
|
+
**协议类型**: Objective-C Protocol
|
|
9
|
+
**回调总数**: 15个核心回调方法
|
|
10
|
+
|
|
11
|
+
## 📋 目录结构
|
|
12
|
+
|
|
13
|
+
### 1. [核心功能特性](#核心功能特性)
|
|
14
|
+
### 2. [错误与警告回调](#错误与警告回调)
|
|
15
|
+
### 3. [首帧采集回调](#首帧采集回调)
|
|
16
|
+
### 4. [推流状态回调](#推流状态回调)
|
|
17
|
+
### 5. [统计数据回调](#统计数据回调)
|
|
18
|
+
### 6. [音视频处理回调](#音视频处理回调)
|
|
19
|
+
### 7. [屏幕分享回调](#屏幕分享回调)
|
|
20
|
+
### 8. [本地录制回调](#本地录制回调)
|
|
21
|
+
### 9. [高级功能回调](#高级功能回调)
|
|
22
|
+
### 10. [使用示例](#使用示例)
|
|
23
|
+
|
|
24
|
+
## 1. 核心功能特性
|
|
25
|
+
|
|
26
|
+
### 🎯 回调分类
|
|
27
|
+
|
|
28
|
+
| 类别 | 回调数量 | 主要功能 |
|
|
29
|
+
|------|----------|----------|
|
|
30
|
+
| 错误警告 | 2个 | 推流器错误和警告通知 |
|
|
31
|
+
| 首帧采集 | 2个 | 音视频首帧采集完成通知 |
|
|
32
|
+
| 推流状态 | 1个 | 连接状态变化通知 |
|
|
33
|
+
| 统计数据 | 1个 | 实时推流数据统计 |
|
|
34
|
+
| 音视频处理 | 3个 | 自定义音视频处理回调 |
|
|
35
|
+
| 屏幕分享 | 2个 | 屏幕采集开始/停止通知 |
|
|
36
|
+
| 本地录制 | 3个 | 录制任务状态回调 |
|
|
37
|
+
| 高级功能 | 1个 | 人声检测状态更新 |
|
|
38
|
+
|
|
39
|
+
### 🔧 技术特点
|
|
40
|
+
|
|
41
|
+
- **实时性**: 所有回调均在主线程执行
|
|
42
|
+
- **完整性**: 覆盖推流全生命周期的关键事件
|
|
43
|
+
- **可扩展性**: 支持自定义音视频处理
|
|
44
|
+
- **调试友好**: 提供详细的错误信息和统计数据
|
|
45
|
+
|
|
46
|
+
## 2. 错误与警告回调
|
|
47
|
+
|
|
48
|
+
### ⚠️ onError - 错误通知回调
|
|
49
|
+
|
|
50
|
+
```objc
|
|
51
|
+
- (void)onError:(V2TXLiveCode)code message:(NSString *)msg extraInfo:(NSDictionary *)extraInfo;
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**功能**: 推流器出现错误时的回调通知
|
|
55
|
+
|
|
56
|
+
**参数说明**:
|
|
57
|
+
- `code`: 错误码,参考 `V2TXLiveCode` 枚举
|
|
58
|
+
- `msg`: 错误描述信息
|
|
59
|
+
- `extraInfo`: 扩展信息字典
|
|
60
|
+
|
|
61
|
+
**触发时机**:
|
|
62
|
+
- 网络连接失败
|
|
63
|
+
- 推流地址无效
|
|
64
|
+
- 硬件设备异常
|
|
65
|
+
- 编码器初始化失败
|
|
66
|
+
|
|
67
|
+
**处理建议**:
|
|
68
|
+
```objc
|
|
69
|
+
- (void)onError:(V2TXLiveCode)code message:(NSString *)msg extraInfo:(NSDictionary *)extraInfo {
|
|
70
|
+
NSLog(@"推流错误: %ld - %@", (long)code, msg);
|
|
71
|
+
|
|
72
|
+
switch (code) {
|
|
73
|
+
case V2TXLIVE_ERROR_NET_DISCONNECT:
|
|
74
|
+
// 网络断开,尝试重连
|
|
75
|
+
[self reconnect];
|
|
76
|
+
break;
|
|
77
|
+
case V2TXLIVE_ERROR_INVALID_LICENSE:
|
|
78
|
+
// License无效,检查配置
|
|
79
|
+
[self checkLicense];
|
|
80
|
+
break;
|
|
81
|
+
default:
|
|
82
|
+
// 其他错误处理
|
|
83
|
+
[self handleError:code];
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### ⚠️ onWarning - 警告通知回调
|
|
90
|
+
|
|
91
|
+
```objc
|
|
92
|
+
- (void)onWarning:(V2TXLiveCode)code message:(NSString *)msg extraInfo:(NSDictionary *)extraInfo;
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**功能**: 推流器出现警告时的回调通知
|
|
96
|
+
|
|
97
|
+
**参数说明**:
|
|
98
|
+
- `code`: 警告码,参考 `V2TXLiveCode` 枚举
|
|
99
|
+
- `msg`: 警告描述信息
|
|
100
|
+
- `extraInfo`: 扩展信息字典
|
|
101
|
+
|
|
102
|
+
**常见警告场景**:
|
|
103
|
+
- 网络状况不佳
|
|
104
|
+
- 编码参数不匹配
|
|
105
|
+
- 设备资源紧张
|
|
106
|
+
- 音视频采集异常
|
|
107
|
+
|
|
108
|
+
**处理建议**:
|
|
109
|
+
```objc
|
|
110
|
+
- (void)onWarning:(V2TXLiveCode)code message:(NSString *)msg extraInfo:(NSDictionary *)extraInfo {
|
|
111
|
+
NSLog(@"推流警告: %ld - %@", (long)code, msg);
|
|
112
|
+
|
|
113
|
+
// 根据警告码进行相应处理
|
|
114
|
+
if (code == V2TXLIVE_WARNING_NETWORK_BUSY) {
|
|
115
|
+
// 网络繁忙,提示用户或降低码率
|
|
116
|
+
[self adjustBitrate];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## 3. 首帧采集回调
|
|
122
|
+
|
|
123
|
+
### 🎵 onCaptureFirstAudioFrame - 音频首帧采集
|
|
124
|
+
|
|
125
|
+
```objc
|
|
126
|
+
- (void)onCaptureFirstAudioFrame;
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**功能**: 首帧音频采集完成的回调通知
|
|
130
|
+
|
|
131
|
+
**触发时机**: 麦克风成功采集到第一帧音频数据
|
|
132
|
+
|
|
133
|
+
**使用场景**:
|
|
134
|
+
- 音频采集状态监控
|
|
135
|
+
- 推流启动时间统计
|
|
136
|
+
- 音频设备检测
|
|
137
|
+
|
|
138
|
+
**示例代码**:
|
|
139
|
+
```objc
|
|
140
|
+
- (void)onCaptureFirstAudioFrame {
|
|
141
|
+
NSLog(@"音频首帧采集完成");
|
|
142
|
+
[self updateUIWithAudioStatus:YES];
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### 🎥 onCaptureFirstVideoFrame - 视频首帧采集
|
|
147
|
+
|
|
148
|
+
```objc
|
|
149
|
+
- (void)onCaptureFirstVideoFrame;
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**功能**: 首帧视频采集完成的回调通知
|
|
153
|
+
|
|
154
|
+
**触发时机**: 摄像头成功采集到第一帧视频数据
|
|
155
|
+
|
|
156
|
+
**使用场景**:
|
|
157
|
+
- 视频采集状态监控
|
|
158
|
+
- 预览画面显示时机
|
|
159
|
+
- 摄像头设备检测
|
|
160
|
+
|
|
161
|
+
**示例代码**:
|
|
162
|
+
```objc
|
|
163
|
+
- (void)onCaptureFirstVideoFrame {
|
|
164
|
+
NSLog(@"视频首帧采集完成");
|
|
165
|
+
[self updateUIWithVideoStatus:YES];
|
|
166
|
+
|
|
167
|
+
// 可以开始显示预览画面
|
|
168
|
+
[self showPreviewAnimation];
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## 4. 推流状态回调
|
|
173
|
+
|
|
174
|
+
### 🔄 onPushStatusUpdate - 推流状态更新
|
|
175
|
+
|
|
176
|
+
```objc
|
|
177
|
+
- (void)onPushStatusUpdate:(V2TXLivePushStatus)status message:(NSString *)msg extraInfo:(NSDictionary *)extraInfo;
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**功能**: 推流器连接状态变化的回调通知
|
|
181
|
+
|
|
182
|
+
**参数说明**:
|
|
183
|
+
- `status`: 推流状态,参考 `V2TXLivePushStatus` 枚举
|
|
184
|
+
- `msg`: 状态描述信息
|
|
185
|
+
- `extraInfo`: 扩展信息字典
|
|
186
|
+
|
|
187
|
+
**状态枚举说明**:
|
|
188
|
+
```objc
|
|
189
|
+
typedef NS_ENUM(NSInteger, V2TXLivePushStatus) {
|
|
190
|
+
V2TXLivePushStatusDisconnected = 0, // 断开连接
|
|
191
|
+
V2TXLivePushStatusConnecting, // 正在连接
|
|
192
|
+
V2TXLivePushStatusConnectSuccess, // 连接成功
|
|
193
|
+
V2TXLivePushStatusReconnecting, // 重连中
|
|
194
|
+
};
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**状态流转示例**:
|
|
198
|
+
```objc
|
|
199
|
+
- (void)onPushStatusUpdate:(V2TXLivePushStatus)status message:(NSString *)msg extraInfo:(NSDictionary *)extraInfo {
|
|
200
|
+
switch (status) {
|
|
201
|
+
case V2TXLivePushStatusConnecting:
|
|
202
|
+
NSLog(@"正在连接推流服务器...");
|
|
203
|
+
[self updateStatus:@"连接中"];
|
|
204
|
+
break;
|
|
205
|
+
|
|
206
|
+
case V2TXLivePushStatusConnectSuccess:
|
|
207
|
+
NSLog(@"推流连接成功");
|
|
208
|
+
[self updateStatus:@"推流中"];
|
|
209
|
+
[self startPushTimer];
|
|
210
|
+
break;
|
|
211
|
+
|
|
212
|
+
case V2TXLivePushStatusReconnecting:
|
|
213
|
+
NSLog(@"网络异常,正在重连...");
|
|
214
|
+
[self updateStatus:@"重连中"];
|
|
215
|
+
break;
|
|
216
|
+
|
|
217
|
+
case V2TXLivePushStatusDisconnected:
|
|
218
|
+
NSLog(@"推流连接断开");
|
|
219
|
+
[self updateStatus:@"已断开"];
|
|
220
|
+
[self stopPushTimer];
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## 5. 统计数据回调
|
|
227
|
+
|
|
228
|
+
### 📊 onStatisticsUpdate - 统计数据更新
|
|
229
|
+
|
|
230
|
+
```objc
|
|
231
|
+
- (void)onStatisticsUpdate:(V2TXLivePusherStatistics *)statistics;
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**功能**: 推流器实时统计数据的回调通知
|
|
235
|
+
|
|
236
|
+
**参数说明**:
|
|
237
|
+
- `statistics`: 推流统计数据对象,包含详细的性能指标
|
|
238
|
+
|
|
239
|
+
**统计数据结构**:
|
|
240
|
+
```objc
|
|
241
|
+
@interface V2TXLivePusherStatistics : NSObject
|
|
242
|
+
|
|
243
|
+
/** 当前 App 的 CPU 使用率 (%) */
|
|
244
|
+
@property (nonatomic, assign) int appCpu;
|
|
245
|
+
|
|
246
|
+
/** 当前系统的 CPU 使用率 (%) */
|
|
247
|
+
@property (nonatomic, assign) int systemCpu;
|
|
248
|
+
|
|
249
|
+
/** 视频宽度 */
|
|
250
|
+
@property (nonatomic, assign) int width;
|
|
251
|
+
|
|
252
|
+
/** 视频高度 */
|
|
253
|
+
@property (nonatomic, assign) int height;
|
|
254
|
+
|
|
255
|
+
/** 帧率 (fps) */
|
|
256
|
+
@property (nonatomic, assign) int fps;
|
|
257
|
+
|
|
258
|
+
/** 视频码率 (kbps) */
|
|
259
|
+
@property (nonatomic, assign) int videoBitrate;
|
|
260
|
+
|
|
261
|
+
/** 音频码率 (kbps) */
|
|
262
|
+
@property (nonatomic, assign) int audioBitrate;
|
|
263
|
+
|
|
264
|
+
/** 网络延迟 (ms) */
|
|
265
|
+
@property (nonatomic, assign) int delay;
|
|
266
|
+
|
|
267
|
+
/** 网络抖动 (ms) */
|
|
268
|
+
@property (nonatomic, assign) int jitter;
|
|
269
|
+
|
|
270
|
+
/** 音频采样率 (Hz) */
|
|
271
|
+
@property (nonatomic, assign) int audioSampleRate;
|
|
272
|
+
|
|
273
|
+
/** 音频声道数 */
|
|
274
|
+
@property (nonatomic, assign) int audioChannels;
|
|
275
|
+
|
|
276
|
+
@end
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
**使用示例**:
|
|
280
|
+
```objc
|
|
281
|
+
- (void)onStatisticsUpdate:(V2TXLivePusherStatistics *)statistics {
|
|
282
|
+
// 更新UI显示
|
|
283
|
+
self.statsLabel.text = [NSString stringWithFormat:@"帧率:%dfps 码率:%dkbps 延迟:%dms",
|
|
284
|
+
statistics.fps, statistics.videoBitrate, statistics.delay];
|
|
285
|
+
|
|
286
|
+
// 性能监控
|
|
287
|
+
if (statistics.appCpu > 80) {
|
|
288
|
+
[self adjustPerformance];
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// 网络质量监控
|
|
292
|
+
if (statistics.delay > 1000) {
|
|
293
|
+
[self adjustBitrateForNetwork];
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
## 6. 音视频处理回调
|
|
299
|
+
|
|
300
|
+
### 🔊 onMicrophoneVolumeUpdate - 麦克风音量更新
|
|
301
|
+
|
|
302
|
+
```objc
|
|
303
|
+
- (void)onMicrophoneVolumeUpdate:(NSInteger)volume;
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
**功能**: 麦克风采集音量值的回调通知
|
|
307
|
+
|
|
308
|
+
**前提条件**: 需要调用 `enableVolumeEvaluation` 开启音量评估
|
|
309
|
+
|
|
310
|
+
**参数说明**:
|
|
311
|
+
- `volume`: 音量大小,范围通常为0-100
|
|
312
|
+
|
|
313
|
+
**使用场景**:
|
|
314
|
+
- 实时音量显示
|
|
315
|
+
- 静音检测
|
|
316
|
+
- 音频质量监控
|
|
317
|
+
|
|
318
|
+
**示例代码**:
|
|
319
|
+
```objc
|
|
320
|
+
- (void)onMicrophoneVolumeUpdate:(NSInteger)volume {
|
|
321
|
+
// 更新音量条显示
|
|
322
|
+
[self.volumeView setVolume:volume];
|
|
323
|
+
|
|
324
|
+
// 静音检测
|
|
325
|
+
if (volume < 5) {
|
|
326
|
+
[self showMuteIndicator];
|
|
327
|
+
} else {
|
|
328
|
+
[self hideMuteIndicator];
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
### 🎵 onProcessAudioFrame - 音频处理回调
|
|
334
|
+
|
|
335
|
+
```objc
|
|
336
|
+
- (void)onProcessAudioFrame:(V2TXLiveAudioFrame *)frame;
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
**功能**: 本地采集并经过音频模块前处理、音效处理和混BGM后的音频数据回调
|
|
340
|
+
|
|
341
|
+
**技术规格**:
|
|
342
|
+
- **时间帧长**: 固定0.02秒
|
|
343
|
+
- **数据格式**: PCM格式
|
|
344
|
+
- **字节计算**: `采样率 × 时间帧长 × 声道数 × 采样点位宽`
|
|
345
|
+
|
|
346
|
+
**默认配置示例**:
|
|
347
|
+
```
|
|
348
|
+
48000Hz × 0.02s × 1声道 × 16bit = 15360bit = 1920字节
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
**重要注意事项**:
|
|
352
|
+
1. **禁止耗时操作**: 回调函数中不要做任何耗时操作
|
|
353
|
+
2. **处理时间限制**: 处理时间必须小于20ms
|
|
354
|
+
3. **数据可读写**: 可以同步修改音频数据
|
|
355
|
+
|
|
356
|
+
**使用示例**:
|
|
357
|
+
```objc
|
|
358
|
+
- (void)onProcessAudioFrame:(V2TXLiveAudioFrame *)frame {
|
|
359
|
+
// 实时音频处理示例
|
|
360
|
+
|
|
361
|
+
// 1. 简单的音量增强
|
|
362
|
+
[self enhanceAudioVolume:frame];
|
|
363
|
+
|
|
364
|
+
// 2. 实时音频分析
|
|
365
|
+
[self analyzeAudioSpectrum:frame];
|
|
366
|
+
|
|
367
|
+
// 3. 自定义音效处理
|
|
368
|
+
[self applyCustomAudioEffect:frame];
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
- (void)enhanceAudioVolume:(V2TXLiveAudioFrame *)frame {
|
|
372
|
+
// 简单的音量增强算法
|
|
373
|
+
int16_t *audioData = (int16_t *)frame.data;
|
|
374
|
+
NSUInteger sampleCount = frame.data.length / sizeof(int16_t);
|
|
375
|
+
|
|
376
|
+
for (NSUInteger i = 0; i < sampleCount; i++) {
|
|
377
|
+
audioData[i] = (int16_t)(audioData[i] * 1.2); // 增加20%音量
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### 🎥 onProcessVideoFrame - 视频处理回调
|
|
383
|
+
|
|
384
|
+
```objc
|
|
385
|
+
- (void)onProcessVideoFrame:(V2TXLiveVideoFrame *_Nonnull)srcFrame dstFrame:(V2TXLiveVideoFrame *_Nonnull)dstFrame;
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
**功能**: 自定义视频处理回调,支持美颜、滤镜等视频特效
|
|
389
|
+
|
|
390
|
+
**前提条件**: 需要调用 `enableCustomVideoProcess` 开启自定义视频处理
|
|
391
|
+
|
|
392
|
+
**参数说明**:
|
|
393
|
+
- `srcFrame`: 原始视频帧(只读)
|
|
394
|
+
- `dstFrame`: 处理后的视频帧(可写)
|
|
395
|
+
|
|
396
|
+
**使用场景**:
|
|
397
|
+
|
|
398
|
+
#### 情况一:美颜组件产生新纹理
|
|
399
|
+
```objc
|
|
400
|
+
- (void)onProcessVideoFrame:(V2TXLiveVideoFrame *)srcFrame dstFrame:(V2TXLiveVideoFrame *)dstFrame {
|
|
401
|
+
// 美颜处理,生成新纹理
|
|
402
|
+
GLuint dstTextureId = [self.beautyProcessor processTexture:srcFrame.textureId
|
|
403
|
+
width:srcFrame.width
|
|
404
|
+
height:srcFrame.height];
|
|
405
|
+
|
|
406
|
+
// 设置处理后的纹理
|
|
407
|
+
dstFrame.textureId = dstTextureId;
|
|
408
|
+
}
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
#### 情况二:美颜组件不产生新纹理
|
|
412
|
+
```objc
|
|
413
|
+
- (void)onProcessVideoFrame:(V2TXLiveVideoFrame *)srcFrame dstFrame:(V2TXLiveVideoFrame *)dstFrame {
|
|
414
|
+
// 第三方美颜处理,使用现有纹理
|
|
415
|
+
[self.thirdPartyBeauty processInputTexture:srcFrame.textureId
|
|
416
|
+
outputTexture:dstFrame.textureId
|
|
417
|
+
width:srcFrame.width
|
|
418
|
+
height:srcFrame.height];
|
|
419
|
+
}
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
### 🔧 onGLContextDestroyed - OpenGL环境销毁
|
|
423
|
+
|
|
424
|
+
```objc
|
|
425
|
+
- (void)onGLContextDestroyed;
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
**功能**: SDK内部OpenGL环境销毁的通知
|
|
429
|
+
|
|
430
|
+
**触发时机**:
|
|
431
|
+
- 应用进入后台
|
|
432
|
+
- 推流器被释放
|
|
433
|
+
- OpenGL上下文丢失
|
|
434
|
+
|
|
435
|
+
**处理建议**:
|
|
436
|
+
```objc
|
|
437
|
+
- (void)onGLContextDestroyed {
|
|
438
|
+
NSLog(@"OpenGL环境已销毁");
|
|
439
|
+
|
|
440
|
+
// 清理自定义的OpenGL资源
|
|
441
|
+
[self cleanupGLResources];
|
|
442
|
+
|
|
443
|
+
// 重新初始化OpenGL相关组件
|
|
444
|
+
[self reinitializeGLComponents];
|
|
445
|
+
}
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
## 7. 屏幕分享回调
|
|
449
|
+
|
|
450
|
+
### 🖥️ onScreenCaptureStarted - 屏幕分享开始
|
|
451
|
+
|
|
452
|
+
```objc
|
|
453
|
+
- (void)onScreenCaptureStarted;
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
**功能**: 屏幕分享开始时的回调通知
|
|
457
|
+
|
|
458
|
+
**触发时机**: 屏幕分享成功启动
|
|
459
|
+
|
|
460
|
+
**使用场景**:
|
|
461
|
+
```objc
|
|
462
|
+
- (void)onScreenCaptureStarted {
|
|
463
|
+
NSLog(@"屏幕分享已开始");
|
|
464
|
+
|
|
465
|
+
// 更新UI状态
|
|
466
|
+
[self updateScreenShareStatus:YES];
|
|
467
|
+
|
|
468
|
+
// 显示屏幕分享提示
|
|
469
|
+
[self showScreenShareIndicator];
|
|
470
|
+
}
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
### 🖥️ onScreenCaptureStopped - 屏幕分享停止
|
|
474
|
+
|
|
475
|
+
```objc
|
|
476
|
+
- (void)onScreenCaptureStopped:(int)reason;
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
**功能**: 屏幕分享停止时的回调通知
|
|
480
|
+
|
|
481
|
+
**参数说明**:
|
|
482
|
+
- `reason`: 停止原因
|
|
483
|
+
- `0`: 用户主动停止
|
|
484
|
+
- `1`: iOS-录屏被系统中断;Mac/Windows-屏幕分享窗口被关闭
|
|
485
|
+
- `2`: Windows-显示屏状态变更;其他平台不抛出
|
|
486
|
+
|
|
487
|
+
**处理示例**:
|
|
488
|
+
```objc
|
|
489
|
+
- (void)onScreenCaptureStopped:(int)reason {
|
|
490
|
+
NSLog(@"屏幕分享已停止,原因: %d", reason);
|
|
491
|
+
|
|
492
|
+
switch (reason) {
|
|
493
|
+
case 0: // 用户主动停止
|
|
494
|
+
[self showToast:@"屏幕分享已结束"];
|
|
495
|
+
break;
|
|
496
|
+
|
|
497
|
+
case 1: // 系统中断
|
|
498
|
+
[self showToast:@"屏幕分享被系统中断"];
|
|
499
|
+
break;
|
|
500
|
+
|
|
501
|
+
case 2: // 设备状态变更(仅Windows)
|
|
502
|
+
[self showToast:@"显示设备状态变更"];
|
|
503
|
+
break;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
[self updateScreenShareStatus:NO];
|
|
507
|
+
}
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
## 8. 本地录制回调
|
|
511
|
+
|
|
512
|
+
### 📹 onLocalRecordBegin - 录制开始
|
|
513
|
+
|
|
514
|
+
```objc
|
|
515
|
+
- (void)onLocalRecordBegin:(NSInteger)errCode storagePath:(NSString *)storagePath;
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
**功能**: 录制任务开始的事件回调
|
|
519
|
+
|
|
520
|
+
**参数说明**:
|
|
521
|
+
- `errCode`: 状态码
|
|
522
|
+
- `0`: 录制任务启动成功
|
|
523
|
+
- `-1`: 内部错误导致录制失败
|
|
524
|
+
- `-2`: 文件后缀名有误(不支持的录制格式)
|
|
525
|
+
- `-6`: 录制已经启动,需要先停止录制
|
|
526
|
+
- `-7`: 录制文件已存在,需要先删除文件
|
|
527
|
+
- `-8`: 录制目录无写入权限
|
|
528
|
+
- `storagePath`: 录制的文件地址
|
|
529
|
+
|
|
530
|
+
**使用示例**:
|
|
531
|
+
```objc
|
|
532
|
+
- (void)onLocalRecordBegin:(NSInteger)errCode storagePath:(NSString *)storagePath {
|
|
533
|
+
if (errCode == 0) {
|
|
534
|
+
NSLog(@"本地录制开始成功,文件路径: %@", storagePath);
|
|
535
|
+
[self updateRecordStatus:YES];
|
|
536
|
+
} else {
|
|
537
|
+
NSLog(@"本地录制开始失败,错误码: %ld", (long)errCode);
|
|
538
|
+
[self handleRecordError:errCode];
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
### 📹 onLocalRecording - 录制进行中
|
|
544
|
+
|
|
545
|
+
```objc
|
|
546
|
+
- (void)onLocalRecording:(NSInteger)durationMs storagePath:(NSString *)storagePath;
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
**功能**: 录制任务进行中的进展事件回调
|
|
550
|
+
|
|
551
|
+
**参数说明**:
|
|
552
|
+
- `durationMs`: 录制时长(毫秒)
|
|
553
|
+
- `storagePath`: 录制的文件地址
|
|
554
|
+
|
|
555
|
+
**配置说明**:
|
|
556
|
+
- 默认不抛出此回调
|
|
557
|
+
- 需要在 `startLocalRecording` 时设置回调间隔参数
|
|
558
|
+
|
|
559
|
+
**使用示例**:
|
|
560
|
+
```objc
|
|
561
|
+
- (void)onLocalRecording:(NSInteger)durationMs storagePath:(NSString *)storagePath {
|
|
562
|
+
// 更新录制时长显示
|
|
563
|
+
NSInteger seconds = durationMs / 1000;
|
|
564
|
+
self.recordTimeLabel.text = [NSString stringWithFormat:@"录制中: %02ld:%02ld",
|
|
565
|
+
seconds / 60, seconds % 60];
|
|
566
|
+
|
|
567
|
+
// 录制进度监控
|
|
568
|
+
if (seconds > 3600) { // 超过1小时
|
|
569
|
+
[self showLongRecordingWarning];
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
### 📹 onLocalRecordComplete - 录制完成
|
|
575
|
+
|
|
576
|
+
```objc
|
|
577
|
+
- (void)onLocalRecordComplete:(NSInteger)errCode storagePath:(NSString *)storagePath;
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
**功能**: 录制任务结束的事件回调
|
|
581
|
+
|
|
582
|
+
**参数说明**:
|
|
583
|
+
- `errCode`: 状态码
|
|
584
|
+
- `0`: 结束录制任务成功
|
|
585
|
+
- `-1`: 录制失败
|
|
586
|
+
- `-2`: 切换分辨率或横竖屏导致录制结束
|
|
587
|
+
- `-3`: 录制时间太短,或未采集到音视频数据
|
|
588
|
+
- `storagePath`: 录制的文件地址
|
|
589
|
+
|
|
590
|
+
**处理示例**:
|
|
591
|
+
```objc
|
|
592
|
+
- (void)onLocalRecordComplete:(NSInteger)errCode storagePath:(NSString *)storagePath {
|
|
593
|
+
if (errCode == 0) {
|
|
594
|
+
NSLog(@"本地录制完成,文件路径: %@", storagePath);
|
|
595
|
+
[self showRecordSuccessAlert:storagePath];
|
|
596
|
+
} else {
|
|
597
|
+
NSLog(@"本地录制失败,错误码: %ld", (long)errCode);
|
|
598
|
+
[self handleRecordCompleteError:errCode];
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
[self updateRecordStatus:NO];
|
|
602
|
+
}
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
## 9. 高级功能回调
|
|
606
|
+
|
|
607
|
+
### 🌐 onSetMixTranscodingConfig - 云端混流配置
|
|
608
|
+
|
|
609
|
+
```objc
|
|
610
|
+
- (void)onSetMixTranscodingConfig:(V2TXLiveCode)code message:(NSString *)msg;
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
**功能**: 设置云端混流转码参数的回调
|
|
614
|
+
|
|
615
|
+
**参数说明**:
|
|
616
|
+
- `code`: 操作结果码
|
|
617
|
+
- `msg`: 具体错误原因
|
|
618
|
+
|
|
619
|
+
**使用示例**:
|
|
620
|
+
```objc
|
|
621
|
+
- (void)onSetMixTranscodingConfig:(V2TXLiveCode)code message:(NSString *)msg {
|
|
622
|
+
if (code == V2TXLIVE_OK) {
|
|
623
|
+
NSLog(@"云端混流配置成功");
|
|
624
|
+
} else {
|
|
625
|
+
NSLog(@"云端混流配置失败: %@", msg);
|
|
626
|
+
[self retryMixTranscodingConfig];
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
### 📸 onSnapshotComplete - 截图完成
|
|
632
|
+
|
|
633
|
+
```objc
|
|
634
|
+
- (void)onSnapshotComplete:(nullable TXImage *)image;
|
|
635
|
+
```
|
|
636
|
+
|
|
637
|
+
**功能**: 截图操作完成后的回调通知
|
|
638
|
+
|
|
639
|
+
**前提条件**: 调用 `snapshot` 方法后触发
|
|
640
|
+
|
|
641
|
+
**参数说明**:
|
|
642
|
+
- `image`: 截取的视频画面图片(可能为nil)
|
|
643
|
+
|
|
644
|
+
**使用示例**:
|
|
645
|
+
```objc
|
|
646
|
+
- (void)onSnapshotComplete:(TXImage *)image {
|
|
647
|
+
if (image) {
|
|
648
|
+
// 保存截图到相册
|
|
649
|
+
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
|
|
650
|
+
|
|
651
|
+
// 显示截图预览
|
|
652
|
+
[self showSnapshotPreview:image];
|
|
653
|
+
} else {
|
|
654
|
+
NSLog(@"截图失败");
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
### 🎙️ onVoiceActivityDetectionUpdate - 人声检测更新
|
|
660
|
+
|
|
661
|
+
```objc
|
|
662
|
+
- (void)onVoiceActivityDetectionUpdate:(BOOL)active;
|
|
663
|
+
```
|
|
664
|
+
|
|
665
|
+
**功能**: 人声检测状态更新的回调通知
|
|
666
|
+
|
|
667
|
+
**前提条件**: 调用 `enableVoiceActivityDetection` 开启人声检测
|
|
668
|
+
|
|
669
|
+
**参数说明**:
|
|
670
|
+
- `active`: 人声活动状态(YES-开始说话,NO-停止说话)
|
|
671
|
+
|
|
672
|
+
**使用场景**:
|
|
673
|
+
```objc
|
|
674
|
+
- (void)onVoiceActivityDetectionUpdate:(BOOL)active {
|
|
675
|
+
if (active) {
|
|
676
|
+
NSLog(@"检测到主播开始说话");
|
|
677
|
+
[self showSpeakingIndicator];
|
|
678
|
+
} else {
|
|
679
|
+
NSLog(@"检测到主播停止说话");
|
|
680
|
+
[self hideSpeakingIndicator];
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
```
|
|
684
|
+
|
|
685
|
+
## 10. 使用示例
|
|
686
|
+
|
|
687
|
+
### 🔧 完整的推流器回调实现
|
|
688
|
+
|
|
689
|
+
```objc
|
|
690
|
+
#import "V2TXLivePusherObserver.h"
|
|
691
|
+
|
|
692
|
+
@interface MyPusherObserver () <V2TXLivePusherObserver>
|
|
693
|
+
@end
|
|
694
|
+
|
|
695
|
+
@implementation MyPusherObserver
|
|
696
|
+
|
|
697
|
+
#pragma mark - 错误和警告处理
|
|
698
|
+
|
|
699
|
+
- (void)onError:(V2TXLiveCode)code message:(NSString *)msg extraInfo:(NSDictionary *)extraInfo {
|
|
700
|
+
NSLog(@"推流错误: %ld - %@", (long)code, msg);
|
|
701
|
+
|
|
702
|
+
// 根据错误码进行相应处理
|
|
703
|
+
[self handlePushError:code message:msg];
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
- (void)onWarning:(V2TXLiveCode)code message:(NSString *)msg extraInfo:(NSDictionary *)extraInfo {
|
|
707
|
+
NSLog(@"推流警告: %ld - %@", (long)code, msg);
|
|
708
|
+
|
|
709
|
+
// 警告信息提示用户
|
|
710
|
+
[self showWarningToast:msg];
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
#pragma mark - 推流状态监控
|
|
714
|
+
|
|
715
|
+
- (void)onPushStatusUpdate:(V2TXLivePushStatus)status message:(NSString *)msg extraInfo:(NSDictionary *)extraInfo {
|
|
716
|
+
// 更新UI状态
|
|
717
|
+
[self updatePushStatus:status];
|
|
718
|
+
|
|
719
|
+
// 记录推流日志
|
|
720
|
+
[self logPushStatus:status message:msg];
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
- (void)onStatisticsUpdate:(V2TXLivePusherStatistics *)statistics {
|
|
724
|
+
// 实时更新统计数据
|
|
725
|
+
[self updateStatsDisplay:statistics];
|
|
726
|
+
|
|
727
|
+
// 性能监控和自动调整
|
|
728
|
+
[self autoAdjustBasedOnStats:statistics];
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
#pragma mark - 音视频处理
|
|
732
|
+
|
|
733
|
+
- (void)onProcessAudioFrame:(V2TXLiveAudioFrame *)frame {
|
|
734
|
+
// 实时音频处理
|
|
735
|
+
[self.audioProcessor processFrame:frame];
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
- (void)onProcessVideoFrame:(V2TXLiveVideoFrame *)srcFrame dstFrame:(V2TXLiveVideoFrame *)dstFrame {
|
|
739
|
+
// 实时视频美颜处理
|
|
740
|
+
[self.beautyProcessor processFrame:srcFrame to:dstFrame];
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
#pragma mark - 录制功能
|
|
744
|
+
|
|
745
|
+
- (void)onLocalRecordBegin:(NSInteger)errCode storagePath:(NSString *)storagePath {
|
|
746
|
+
if (errCode == 0) {
|
|
747
|
+
self.currentRecordPath = storagePath;
|
|
748
|
+
[self startRecordTimer];
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
- (void)onLocalRecording:(NSInteger)durationMs storagePath:(NSString *)storagePath {
|
|
753
|
+
[self updateRecordTime:durationMs];
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
- (void)onLocalRecordComplete:(NSInteger)errCode storagePath:(NSString *)storagePath {
|
|
757
|
+
[self stopRecordTimer];
|
|
758
|
+
[self handleRecordCompletion:errCode path:storagePath];
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
@end
|
|
762
|
+
```
|
|
763
|
+
|
|
764
|
+
### 🎯 最佳实践建议
|
|
765
|
+
|
|
766
|
+
**1. 线程安全处理**
|
|
767
|
+
```objc
|
|
768
|
+
- (void)onStatisticsUpdate:(V2TXLivePusherStatistics *)statistics {
|
|
769
|
+
// 确保UI更新在主线程执行
|
|
770
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
771
|
+
[self updateStatsUI:statistics];
|
|
772
|
+
});
|
|
773
|
+
}
|
|
774
|
+
```
|
|
775
|
+
|
|
776
|
+
**2. 性能优化**
|
|
777
|
+
```objc
|
|
778
|
+
- (void)onProcessAudioFrame:(V2TXLiveAudioFrame *)frame {
|
|
779
|
+
// 避免在回调中进行复杂计算
|
|
780
|
+
@autoreleasepool {
|
|
781
|
+
[self.lightweightProcessor process:frame];
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
```
|
|
785
|
+
|
|
786
|
+
**3. 错误恢复机制**
|
|
787
|
+
```objc
|
|
788
|
+
- (void)onError:(V2TXLiveCode)code message:(NSString *)msg extraInfo:(NSDictionary *)extraInfo {
|
|
789
|
+
if ([self isRecoverableError:code]) {
|
|
790
|
+
[self scheduleReconnect];
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
```
|
|
794
|
+
|
|
795
|
+
## 11. 回调时序图
|
|
796
|
+
|
|
797
|
+
### 📊 推流生命周期回调时序
|
|
798
|
+
|
|
799
|
+
```
|
|
800
|
+
开始推流流程:
|
|
801
|
+
1. onPushStatusUpdate(V2TXLivePushStatusConnecting)
|
|
802
|
+
2. onCaptureFirstVideoFrame (如果开启视频)
|
|
803
|
+
3. onCaptureFirstAudioFrame (如果开启音频)
|
|
804
|
+
4. onPushStatusUpdate(V2TXLivePushStatusConnectSuccess)
|
|
805
|
+
5. onStatisticsUpdate (周期性回调)
|
|
806
|
+
|
|
807
|
+
停止推流流程:
|
|
808
|
+
1. onPushStatusUpdate(V2TXLivePushStatusDisconnected)
|
|
809
|
+
2. onGLContextDestroyed (如果使用OpenGL)
|
|
810
|
+
```
|
|
811
|
+
|
|
812
|
+
### 🔄 状态流转图
|
|
813
|
+
|
|
814
|
+
```
|
|
815
|
+
初始化 → 连接中 → 连接成功 → 推流中
|
|
816
|
+
↓
|
|
817
|
+
重连中 → 连接成功
|
|
818
|
+
↓
|
|
819
|
+
断开连接
|
|
820
|
+
```
|