@tencentcloud/sdk-mcp 1.2.7 → 1.2.9

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.
Files changed (32) hide show
  1. package/package.json +1 -1
  2. package/resource/doc/native_live/android/V2TXLiveCode_api_android.md +334 -0
  3. package/resource/doc/native_live/android/V2TXLiveDef_api_android.md +434 -0
  4. package/resource/doc/native_live/android/V2TXLivePlayerObserver_api_android.md +685 -0
  5. package/resource/doc/native_live/android/V2TXLivePlayer_api_android.md +712 -0
  6. package/resource/doc/native_live/android/V2TXLivePremier_api_android.md +284 -0
  7. package/resource/doc/native_live/android/V2TXLivePusherObserver_api_android.md +849 -0
  8. package/resource/doc/native_live/android/V2TXLivePusher_api_android.md +1046 -0
  9. package/resource/doc/native_live/flutter/V2TXLiveCode_api_flutter.md +460 -0
  10. package/resource/doc/native_live/flutter/V2TXLiveDef_api_flutter.md +558 -0
  11. package/resource/doc/native_live/flutter/V2TXLivePlayerObserver_api_flutter.md +879 -0
  12. package/resource/doc/native_live/flutter/V2TXLivePlayer_api_flutter.md +668 -0
  13. package/resource/doc/native_live/flutter/V2TXLivePremier_api_flutter.md +456 -0
  14. package/resource/doc/native_live/flutter/V2TXLivePusherObserver_api_flutter.md +332 -0
  15. package/resource/doc/native_live/flutter/V2TXLivePusher_api_flutter.md +748 -0
  16. package/resource/doc/native_live/iOS/V2TXLiveCode_api_iOS.md +328 -0
  17. package/resource/doc/native_live/iOS/V2TXLiveDef_api_iOS.md +505 -0
  18. package/resource/doc/native_live/iOS/V2TXLivePlayerObserver_api_iOS.md +507 -0
  19. package/resource/doc/native_live/iOS/V2TXLivePlayer_api_iOS.md +676 -0
  20. package/resource/doc/native_live/iOS/V2TXLivePremier_api_iOS.md +284 -0
  21. package/resource/doc/native_live/iOS/V2TXLivePusherObserver_api_iOS.md +820 -0
  22. package/resource/doc/native_live/iOS/V2TXLivePusher_api_iOS.md +1065 -0
  23. package/tools/common/get-faq.js +1 -1
  24. package/tools/common/get-faq.js.map +1 -1
  25. package/tools/definitions/get_native_live_api_def.js +22 -0
  26. package/tools/definitions/get_native_live_api_def.js.map +1 -0
  27. package/tools/index.js +4 -0
  28. package/tools/index.js.map +1 -1
  29. package/tools/native_live/get-native-live-api.js +31 -0
  30. package/tools/native_live/get-native-live-api.js.map +1 -0
  31. package/utils/report-cls-client.js +1 -1
  32. package/utils/report-es-client.js +1 -1
@@ -0,0 +1,1046 @@
1
+ # 腾讯云直播SDK V2TXLivePusher 推流接口文档
2
+
3
+ ## 概述
4
+
5
+ `V2TXLivePusher` 是腾讯云直播SDK的核心推流器接口类,负责将本地的音频和视频画面进行编码,并推送到指定的推流地址,支持任意的推流服务端。
6
+
7
+ **文件路径**: `com/tencent/live2/V2TXLivePusher.java`
8
+ **平台支持**: Android
9
+
10
+ ## 核心功能
11
+
12
+ ### 🎯 主要能力
13
+ - ✅ **多采集源支持**: 摄像头、麦克风、屏幕、图片、自定义采集
14
+ - ✅ **画面控制**: 旋转、填充模式、镜像、水印
15
+ - ✅ **推流控制**: 开始/停止、暂停/恢复、音视频分离
16
+ - ✅ **特效处理**: 美颜、滤镜、贴纸、音效处理
17
+ - ✅ **云端混流**: 多路音视频流混合转码
18
+ - ✅ **本地录制**: 音视频流本地录制功能
19
+ - ✅ **自定义采集**: 支持外部设备和特殊格式采集
20
+
21
+ ### 🔧 技术特性
22
+ - **低延迟**: 优化的编码策略和网络自适应
23
+ - **高兼容**: 支持多种视频编码格式和分辨率
24
+ - **易集成**: 简洁的API设计和完整的回调机制
25
+ - **高性能**: 硬件加速编码和高效的采集管线
26
+
27
+ ### 推流器实例创建
28
+ ```java
29
+ // 创建 RTMP 协议推流实例,startPush 必须传入 RTMP 协议地址
30
+ V2TXLivePusher pusher = new V2TXLivePusherImpl(context, V2TXLiveDef.V2TXLiveMode.TXLiveMode_RTMP);
31
+
32
+ // 创建 RTC 协议推流实例,startPush 必须传入 RTC 协议地址
33
+ V2TXLivePusher pusher = new V2TXLivePusherImpl(context, V2TXLiveDef.V2TXLiveMode.TXLiveMode_RTC);
34
+ ```
35
+
36
+ **协议选择建议**:
37
+ - **RTMP协议**: 适合CDN直播分发场景,延迟较高(2-3秒)
38
+ - **RTC协议**: 适合实时互动场景,延迟较低(400ms以内)
39
+
40
+ ## 接口详解
41
+
42
+ ### 1. 基础设置接口
43
+
44
+ #### setObserver() - 设置推流器回调
45
+ ```java
46
+ public abstract void setObserver(V2TXLivePusherObserver observer);
47
+ ```
48
+
49
+ **参数**:
50
+ - `observer`: 推流器回调目标对象,需实现 `V2TXLivePusherObserver` 协议
51
+
52
+ **使用时机**: 推流器初始化后立即设置
53
+
54
+ **说明**: 通过设置回调,可以监听推流器状态、音量回调、统计数据、警告和错误信息等
55
+
56
+ **示例**:
57
+ ```java
58
+ pusher.setObserver(new V2TXLivePusherObserver(){
59
+ // ...
60
+ });
61
+ ```
62
+
63
+ #### setRenderView() - 设置本地摄像头预览View
64
+ ```java
65
+ public abstract int setRenderView(TXCloudVideoView view);
66
+ public abstract int setRenderView(TextureView view);
67
+ public abstract int setRenderView(SurfaceView view);
68
+ ```
69
+
70
+ **参数**:
71
+ - `view`: 本地摄像头预览View,支持三种类型
72
+
73
+ **返回值**: `V2TXLiveCode`
74
+ - `V2TXLIVE_OK`: 成功
75
+
76
+ **使用时机**: 必须在开始推流前设置预览视图
77
+
78
+ **说明**: 本地摄像头采集到的画面,经过美颜、脸型调整、滤镜等多种效果叠加之后,最终会显示View上
79
+
80
+ **示例**:
81
+ ```java
82
+ pusher.setRenderView(videoView);
83
+ ```
84
+
85
+ #### setRenderMirror() - 设置本地摄像头预览镜像
86
+ ```java
87
+ public abstract int setRenderMirror(V2TXLiveMirrorType mirrorType);
88
+ ```
89
+
90
+ **参数**:
91
+ - `mirrorType`: 摄像头镜像类型 `V2TXLiveDef#V2TXLiveMirrorType`
92
+ - `V2TXLiveMirrorTypeAuto`【默认值】: 前置摄像头镜像,后置摄像头不镜像
93
+ - `V2TXLiveMirrorTypeEnable`: 前置和后置摄像头都镜像
94
+ - `V2TXLiveMirrorTypeDisable`: 前置和后置摄像头都不镜像
95
+
96
+ **返回值**: `V2TXLiveCode`
97
+ - `V2TXLIVE_OK`: 成功
98
+
99
+ **使用时机**: 无限制
100
+
101
+ **示例**:
102
+ ```java
103
+ // 前置摄像头镜像,后置摄像头不镜像
104
+ pusher.setRenderMirror(V2TXLiveDef.V2TXLiveMirrorType.V2TXLiveMirrorTypeAuto);
105
+ // 所有摄像头都镜像
106
+ pusher.setRenderMirror(V2TXLiveDef.V2TXLiveMirrorType.V2TXLiveMirrorTypeEnable);
107
+ // 所有摄像头都不镜像
108
+ pusher.setRenderMirror(V2TXLiveDef.V2TXLiveMirrorType.V2TXLiveMirrorTypeDisable);
109
+ ```
110
+
111
+ #### setEncoderMirror() - 设置视频编码镜像
112
+ ```java
113
+ public abstract int setEncoderMirror(boolean mirror);
114
+ ```
115
+
116
+ **参数**:
117
+ - `mirror`: 是否镜像【默认值】:false
118
+
119
+ **返回值**: `V2TXLiveCode`
120
+ - `V2TXLIVE_OK`: 成功
121
+
122
+ **说明**: 编码镜像只影响观众端看到的视频效果
123
+
124
+ **使用时机**: 无限制
125
+
126
+ **示例**:
127
+ ```java
128
+ // 观众端看到镜像画面
129
+ pusher.setEncoderMirror(true);
130
+ // 观众端看到非镜像画面
131
+ pusher.setEncoderMirror(false);
132
+ ```
133
+
134
+ #### setRenderRotation() - 设置本地摄像头预览画面的旋转角度
135
+ ```java
136
+ public abstract int setRenderRotation(V2TXLiveRotation rotation);
137
+ ```
138
+
139
+ **参数**:
140
+ - `rotation`: 预览画面的旋转角度 `V2TXLiveDef#V2TXLiveRotation`
141
+ - `V2TXLiveRotation0`【默认值】: 0度,不旋转
142
+ - `V2TXLiveRotation90`: 顺时针旋转90度
143
+ - `V2TXLiveRotation180`: 顺时针旋转180度
144
+ - `V2TXLiveRotation270`: 顺时针旋转270度
145
+
146
+ **返回值**: `V2TXLiveCode`
147
+ - `V2TXLIVE_OK`: 成功
148
+
149
+ **说明**: 只旋转本地预览画面,不影响推流出去的画面
150
+
151
+ **使用时机**: 无限制
152
+
153
+ **示例**:
154
+ ```java
155
+ // 设置预览画面旋转0度
156
+ pusher.setRenderRotation(V2TXLiveDef.V2TXLiveRotation.V2TXLiveRotation0);
157
+ // 设置预览画面旋转90度
158
+ pusher.setRenderRotation(V2TXLiveDef.V2TXLiveRotation.V2TXLiveRotation90);
159
+ // 设置预览画面旋转180度
160
+ pusher.setRenderRotation(V2TXLiveDef.V2TXLiveRotation.V2TXLiveRotation180);
161
+ // 设置预览画面旋转270度
162
+ pusher.setRenderRotation(V2TXLiveDef.V2TXLiveRotation.V2TXLiveRotation270);
163
+ ```
164
+
165
+ #### setRenderFillMode() - 设置本地摄像头预览画面的填充模式
166
+ ```java
167
+ public abstract int setRenderFillMode(V2TXLiveFillMode mode);
168
+ ```
169
+
170
+ **参数**:
171
+ - `mode`: 画面填充模式 `V2TXLiveDef#V2TXLiveFillMode`
172
+ - `V2TXLiveFillModeFill`【默认值】: 图像铺满屏幕,不留黑边,部分画面内容可能被裁剪
173
+ - `V2TXLiveFillModeFit`: 图像适应屏幕,保持画面完整,可能有黑边
174
+ - `V2TXLiveFillModeScaleFill`: 图像拉伸铺满,长度和宽度可能不会按比例变化
175
+
176
+ **返回值**: `V2TXLiveCode`
177
+ - `V2TXLIVE_OK`: 成功
178
+
179
+ **使用时机**: 无限制
180
+
181
+ **示例**:
182
+ ```java
183
+ // 图像铺满屏幕
184
+ pusher.setRenderFillMode(V2TXLiveDef.V2TXLiveFillMode.V2TXLiveFillModeFill);
185
+ // 图像适应屏幕
186
+ pusher.setRenderFillMode(V2TXLiveDef.V2TXLiveFillMode.V2TXLiveFillModeFit);
187
+ // 图像拉伸铺满
188
+ pusher.setRenderFillMode(V2TXLiveDef.V2TXLiveFillMode.V2TXLiveFillModeScaleFill);
189
+ ```
190
+
191
+ ### 2. 采集控制接口
192
+
193
+ #### startCamera() / stopCamera() - 打开/关闭本地摄像头
194
+ ```java
195
+ public abstract int startCamera(boolean frontCamera);
196
+ public abstract int stopCamera();
197
+ ```
198
+
199
+ **参数**:
200
+ - `frontCamera`: 指定摄像头方向是否为前置【默认值】:true
201
+
202
+ **返回值**: `V2TXLiveCode`
203
+ - `V2TXLIVE_OK`: 成功
204
+
205
+ **重要说明**:
206
+ - **推流前必须开启至少一个采集源**,否则推流将失败
207
+ - `startVirtualCamera`, `startCamera`, `startScreenCapture`在同一Pusher实例下,仅有一个采集源可以上行
208
+ - 不同采集源之间切换,请先关闭前一采集源,再开启后一采集源
209
+
210
+ **使用时机**: 必须推流前调用
211
+
212
+ **示例**:
213
+ ```java
214
+ // 开启前置摄像头
215
+ pusher.startCamera(true);
216
+ // 开启后置摄像头
217
+ pusher.startCamera(false);
218
+ // 停止摄像头采集
219
+ pusher.stopCamera();
220
+ ```
221
+
222
+ #### startMicrophone() / stopMicrophone() - 打开/关闭麦克风
223
+ ```java
224
+ public abstract int startMicrophone();
225
+ public abstract int stopMicrophone();
226
+ ```
227
+
228
+ **返回值**: `V2TXLiveCode`
229
+ - `V2TXLIVE_OK`: 成功
230
+
231
+ **使用场景**:
232
+ - **音视频直播**: 配合摄像头采集提供音频
233
+ - **纯音频直播**: 单独使用麦克风进行音频推流
234
+ - **屏幕分享**: 配合屏幕采集提供系统声音和麦克风声音
235
+
236
+ **注意事项**:
237
+ - **推流前必须调用此方法开启麦克风采集**,否则推流将只有视频没有音频
238
+ - 纯音频推流场景下,可以单独使用麦克风采集
239
+ - 推流过程中可以动态开启/关闭麦克风采集
240
+
241
+ **使用时机**: 推流前必须调用
242
+
243
+ **示例**:
244
+ ```java
245
+ // 开启麦克风采集
246
+ pusher.startMicrophone();
247
+ // 停止麦克风采集
248
+ pusher.stopMicrophone();
249
+ ```
250
+
251
+ #### startVirtualCamera() / stopVirtualCamera() - 开启/关闭图片推流
252
+ ```java
253
+ public abstract int startVirtualCamera(Bitmap image);
254
+ public abstract int stopVirtualCamera();
255
+ ```
256
+
257
+ **参数**:
258
+ - `image`: 推流的图片
259
+
260
+ **返回值**: `V2TXLiveCode`
261
+ - `V2TXLIVE_OK`: 成功
262
+
263
+ **使用场景**:
264
+ - **图片直播**: 将静态图片作为视频源进行推流
265
+ - **维护页面**: 系统维护时显示维护页面
266
+ - **广告展示**: 展示广告图片
267
+
268
+ **注意事项**:
269
+ - **推流前必须调用此方法开启图片推流**,否则推流将失败
270
+ - 图片会被编码为视频流进行推送,消耗带宽
271
+ - 通常需要配合麦克风采集提供音频
272
+ - 图片推流和摄像头采集不能同时开启
273
+
274
+ **使用时机**: 推流前必须调用
275
+
276
+ **示例**:
277
+ ```java
278
+ // 开启图片推流
279
+ Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.live_image);
280
+ pusher.startVirtualCamera(image);
281
+ // 停止图片推流
282
+ pusher.stopVirtualCamera();
283
+ ```
284
+
285
+ #### startScreenCapture() / stopScreenCapture() - 开启/关闭屏幕采集
286
+ ```java
287
+ public abstract int startScreenCapture();
288
+ public abstract int stopScreenCapture();
289
+ ```
290
+
291
+ **返回值**: `V2TXLiveCode`
292
+ - `V2TXLIVE_OK`: 成功
293
+
294
+ **使用场景**:
295
+ - **屏幕分享**: 分享设备屏幕内容进行直播
296
+ - **远程教学**: 教师分享屏幕进行在线教学
297
+ - **游戏直播**: 分享游戏画面进行游戏直播
298
+ - **应用演示**: 演示App操作流程
299
+
300
+ **注意事项**:
301
+ - **推流前必须调用此方法开启屏幕采集**,否则推流将失败
302
+ - Android系统需要申请屏幕录制权限
303
+ - 可以配合`startSystemAudioLoopback()`采集系统声音
304
+ - 屏幕采集和摄像头采集不能同时开启
305
+
306
+ **使用时机**: 推流前必须调用
307
+
308
+ **示例**:
309
+ ```java
310
+ // 开启屏幕采集
311
+ pusher.startScreenCapture();
312
+ // 停止屏幕采集
313
+ pusher.stopScreenCapture();
314
+ ```
315
+
316
+ ### 3. 推流控制接口
317
+
318
+ #### startPush() - 开始音视频数据推流
319
+ ```java
320
+ public abstract int startPush(String url);
321
+ ```
322
+
323
+ **参数**:
324
+ - `url`: 推流的目标地址,支持任意推流服务端
325
+
326
+ **返回值**: `V2TXLiveCode`
327
+ - `V2TXLIVE_OK`: 操作成功,开始连接推流目标地址
328
+ - `V2TXLIVE_ERROR_INVALID_PARAMETER`: 操作失败,url不合法
329
+ - `V2TXLIVE_ERROR_INVALID_LICENSE`: 操作失败,license不合法,鉴权失败
330
+ - `V2TXLIVE_ERROR_REFUSED`: 操作失败,RTC不支持同一设备上同时推拉同一个StreamId
331
+
332
+ **重要注意事项**:
333
+ - **必须在调用startPush()之前开启至少一个采集源**,否则推流将失败
334
+ - 支持的采集源类型:摄像头采集、麦克风采集、屏幕采集、图片推流、自定义采集
335
+ - 推流过程中可以切换采集源,但需要先关闭当前采集源再开启新采集源
336
+
337
+ **使用时机**: 采集源开启后
338
+
339
+ **示例**:
340
+ ```java
341
+ int result = pusher.startPush("rtmp://example.com/live/stream");
342
+ if (result == V2TXLiveCode.V2TXLIVE_OK) {
343
+ Log.i(TAG, "开始推流成功");
344
+ } else if (result == V2TXLiveCode.V2TXLIVE_ERROR_INVALID_PARAMETER) {
345
+ Log.w(TAG, "推流地址不合法");
346
+ } else if (result == V2TXLiveCode.V2TXLIVE_ERROR_INVALID_LICENSE) {
347
+ Log.w(TAG, "Licence不合法,请检查Licence");
348
+ } else if (result == V2TXLiveCode.V2TXLIVE_ERROR_REFUSED) {
349
+ Log.w(TAG, "调用被拒绝");
350
+ }
351
+ ```
352
+
353
+ #### stopPush() - 停止音视频数据推流
354
+ ```java
355
+ public abstract int stopPush();
356
+ ```
357
+
358
+ **返回值**: `V2TXLiveCode`
359
+ - `V2TXLIVE_OK`: 成功
360
+
361
+ **使用时机**: 开始推流后
362
+
363
+ **示例**:
364
+ ```java
365
+ pusher.stopPush();
366
+ ```
367
+
368
+ #### isPushing() - 检查当前推流器是否正在推流中
369
+ ```java
370
+ public abstract int isPushing();
371
+ ```
372
+
373
+ **返回值**:
374
+ - `1`: 正在推流中
375
+ - `0`: 已经停止推流
376
+
377
+ **使用时机**: 无限制
378
+
379
+ **示例**:
380
+ ```java
381
+ int isPushing = pusher.isPushing();
382
+ if (isPushing == 1) {
383
+ Log.i(TAG, "正在推流中");
384
+ } else {
385
+ Log.i(TAG, "推流停止");
386
+ }
387
+ ```
388
+
389
+ ### 4. 音视频控制接口
390
+
391
+ #### pauseAudio() / resumeAudio() - 暂停/恢复推流器的音频流
392
+ ```java
393
+ public abstract int pauseAudio();
394
+ public abstract int resumeAudio();
395
+ ```
396
+
397
+ **返回值**: `V2TXLiveCode`
398
+ - `V2TXLIVE_OK`: 成功
399
+
400
+ **使用时机**: 无限制
401
+
402
+ **示例**:
403
+ ```java
404
+ // 暂停音频流
405
+ pusher.pauseAudio();
406
+ // 恢复音频流
407
+ pusher.resumeAudio();
408
+ ```
409
+
410
+ #### pauseVideo() / resumeVideo() - 暂停/恢复推流器的视频流
411
+ ```java
412
+ public abstract int pauseVideo();
413
+ public abstract int resumeVideo();
414
+ ```
415
+
416
+ **返回值**: `V2TXLiveCode`
417
+ - `V2TXLIVE_OK`: 成功
418
+
419
+ **使用时机**: 无限制
420
+
421
+ **示例**:
422
+ ```java
423
+ // 暂停视频流
424
+ pusher.pauseVideo();
425
+ // 恢复视频流
426
+ pusher.resumeVideo();
427
+ ```
428
+
429
+ #### setAudioQuality() - 设置推流音频质量
430
+ ```java
431
+ public abstract int setAudioQuality(V2TXLiveAudioQuality quality);
432
+ ```
433
+
434
+ **参数**:
435
+ - `quality`: 音频质量 `V2TXLiveDef#V2TXLiveAudioQuality`
436
+ - `V2TXLiveAudioQualityDefault`【默认值】: 通用音质
437
+ - `V2TXLiveAudioQualitySpeech`: 语音音质
438
+ - `V2TXLiveAudioQualityMusic`: 音乐音质
439
+
440
+ **返回值**: `V2TXLiveCode`
441
+ - `V2TXLIVE_OK`: 成功
442
+ - `V2TXLIVE_ERROR_REFUSED`: 推流过程中,不允许调整音质
443
+
444
+ **使用时机**: 推流开始前
445
+
446
+ **示例**:
447
+ ```java
448
+ // 设置通用音质
449
+ pusher.setAudioQuality(V2TXLiveDef.V2TXLiveAudioQuality.V2TXLiveAudioQualityDefault);
450
+ // 设置语音音质
451
+ pusher.setAudioQuality(V2TXLiveDef.V2TXLiveAudioQuality.V2TXLiveAudioQualitySpeech);
452
+ // 设置音乐音质
453
+ pusher.setAudioQuality(V2TXLiveDef.V2TXLiveAudioQuality.V2TXLiveAudioQualityMusic);
454
+ ```
455
+
456
+ #### setVideoQuality() - 设置推流视频编码参数
457
+ ```java
458
+ public abstract int setVideoQuality(V2TXLiveVideoEncoderParam param);
459
+ ```
460
+
461
+ **参数**:
462
+ - `param`: 视频编码参数
463
+
464
+ **返回值**: `V2TXLiveCode`
465
+ - `V2TXLIVE_OK`: 成功
466
+
467
+ **使用时机**: 推流开始前
468
+
469
+ **示例**:
470
+ ```java
471
+ V2TXLiveVideoEncoderParam param = new V2TXLiveVideoEncoderParam();
472
+ param.videoResolution = V2TXLiveVideoResolution.V2TXLiveVideoResolution1280x720;
473
+ param.videoFps = 15;
474
+ param.videoBitrate = 1200;
475
+ pusher.setVideoQuality(param);
476
+ ```
477
+
478
+ ### 5. 特效管理接口
479
+
480
+ #### getAudioEffectManager() - 获取音效管理对象
481
+ ```java
482
+ public abstract TXAudioEffectManager getAudioEffectManager();
483
+ ```
484
+
485
+ **功能说明**:
486
+ - 调整麦克风收集的人声音量
487
+ - 设置混响和变声效果
488
+ - 开启耳返,设置耳返音量
489
+ - 添加背景音乐,调整背景音乐的播放效果
490
+
491
+ **返回值**: `TXAudioEffectManager` 音效管理对象
492
+
493
+ **使用时机**: 无限制
494
+
495
+ **示例**:
496
+ ```java
497
+ TXAudioEffectManager audioEffectManager = pusher.getAudioEffectManager();
498
+ // 设置人声音量
499
+ audioEffectManager.setVoiceVolume(100);
500
+ // 设置背景音乐音量
501
+ audioEffectManager.setAllMusicVolume(50);
502
+ ```
503
+
504
+ #### getBeautyManager() - 获取美颜管理对象
505
+ ```java
506
+ public abstract TXBeautyManager getBeautyManager();
507
+ ```
508
+
509
+ **功能说明**:
510
+ - 设置"美颜风格"、美白、红润、大眼、瘦脸等美容效果
511
+ - 调整发际线、眼间距、眼角、嘴形等面部特征
512
+ - 设置人脸挂件等动态效果
513
+ - 添加美妆
514
+ - 进行手势识别
515
+
516
+ **返回值**: `TXBeautyManager` 美颜管理对象
517
+
518
+ **使用时机**: 无限制
519
+
520
+ **示例**:
521
+ ```java
522
+ TXBeautyManager beautyManager = pusher.getBeautyManager();
523
+ // 设置美颜风格
524
+ beautyManager.setBeautyStyle(TXBeautyManager.TXBeautyStyleNature);
525
+ // 设置美白级别
526
+ beautyManager.setWhitenessLevel(5);
527
+ // 设置红润级别
528
+ beautyManager.setRuddyLevel(5);
529
+ ```
530
+
531
+ #### getDeviceManager() - 获取设备管理对象
532
+ ```java
533
+ public abstract TXDeviceManager getDeviceManager();
534
+ ```
535
+
536
+ **功能说明**:
537
+ - 切换前后摄像头
538
+ - 设置自动聚焦
539
+ - 设置摄像头缩放倍数
540
+ - 打开或关闭闪光灯
541
+ - 切换耳机或者扬声器
542
+ - 修改音量类型(媒体音量或者通话音量)
543
+
544
+ **返回值**: `TXDeviceManager` 设备管理对象
545
+
546
+ **使用时机**: 无限制
547
+
548
+ **示例**:
549
+ ```java
550
+ TXDeviceManager deviceManager = pusher.getDeviceManager();
551
+ // 切换摄像头
552
+ deviceManager.switchCamera(true);
553
+ // 设置自动聚焦
554
+ deviceManager.setAutoFocusEnabled(true);
555
+ // 设置闪光灯
556
+ deviceManager.enableTorch(true);
557
+ ```
558
+
559
+ ### 6. 高级功能接口
560
+
561
+ #### snapshot() - 截取推流过程中的本地画面
562
+ ```java
563
+ public abstract int snapshot();
564
+ ```
565
+
566
+ **返回值**: `V2TXLiveCode`
567
+ - `V2TXLIVE_OK`: 成功
568
+ - `V2TXLIVE_ERROR_REFUSED`: 已经停止推流,不允许调用截图操作
569
+
570
+ **使用时机**: 开始推流后
571
+
572
+ **示例**:
573
+ ```java
574
+ pusher.setObserver(new V2TXLivePusherObserver() {
575
+ @Override
576
+ public void onSnapshotComplete(Bitmap image) {
577
+ // 处理截图结果
578
+ }
579
+ });
580
+ pusher.snapshot();
581
+ ```
582
+
583
+ #### setWatermark() - 设置推流器水印
584
+ ```java
585
+ public abstract int setWatermark(Bitmap image, float x, float y, float scale);
586
+ ```
587
+
588
+ **参数**:
589
+ - `image`: 水印图片,如果为null则禁用水印
590
+ - `x`: 水印的横坐标,取值范围为0-1的浮点数
591
+ - `y`: 水印的纵坐标,取值范围为0-1的浮点数
592
+ - `scale`: 水印图片的缩放比例,取值范围为0-1的浮点数
593
+
594
+ **返回值**: `V2TXLiveCode`
595
+ - `V2TXLIVE_OK`: 成功
596
+
597
+ **使用时机**: 无限制
598
+
599
+ **示例**:
600
+ ```java
601
+ Bitmap watermark = BitmapFactory.decodeResource(getResources(), R.drawable.watermark);
602
+ pusher.setWatermark(watermark, 0.1f, 0.1f, 0.2f);
603
+ // 禁用水印
604
+ pusher.setWatermark(null, 0, 0, 0);
605
+ ```
606
+
607
+ #### enableVolumeEvaluation() - 启用采集音量大小提示
608
+ ```java
609
+ public abstract int enableVolumeEvaluation(int intervalMs);
610
+ ```
611
+
612
+ **参数**:
613
+ - `intervalMs`: 回调触发间隔,单位为ms,最小间隔为100ms,如果小于等于0则关闭回调【默认值】:0
614
+
615
+ **返回值**: `V2TXLiveCode`
616
+ - `V2TXLIVE_OK`: 成功
617
+
618
+ **说明**: 开启后可以在`onMicrophoneVolumeUpdate`回调中获取到SDK对音量大小值的评估
619
+
620
+ **使用时机**: 无限制
621
+
622
+ **示例**:
623
+ ```java
624
+ pusher.setObserver(new V2TXLivePusherObserver() {
625
+ @Override
626
+ public void onMicrophoneVolumeUpdate(int volume) {
627
+ // 处理音量更新
628
+ }
629
+ });
630
+ pusher.enableVolumeEvaluation(300);
631
+ ```
632
+
633
+ #### enableCustomVideoProcess() - 开启/关闭自定义视频处理
634
+ ```java
635
+ public abstract int enableCustomVideoProcess(boolean enable, V2TXLivePixelFormat pixelFormat, V2TXLiveBufferType bufferType);
636
+ ```
637
+
638
+ **参数**:
639
+ - `enable`: true开启,false关闭【默认值: false】
640
+ - `pixelFormat`: 像素格式 `V2TXLiveDef#V2TXLivePixelFormat`
641
+ - `bufferType`: 缓冲区类型 `V2TXLiveDef#V2TXLiveBufferType`
642
+
643
+ **返回值**: `V2TXLiveCode`
644
+ - `V2TXLIVE_OK`: 成功
645
+ - `V2TXLIVE_ERROR_NOT_SUPPORTED`: 不支持的格式
646
+
647
+ **支持的格式组合**:
648
+ - `V2TXLivePixelFormatTexture2D + V2TXLiveBufferTypeTexture`
649
+ - `V2TXLivePixelFormatI420 + V2TXLiveBufferTypeByteBuffer`
650
+
651
+ **使用时机**: 推流开始前
652
+
653
+ **示例**:
654
+ ```java
655
+ pusher.enableCustomVideoProcess(true,
656
+ V2TXLiveDef.V2TXLivePixelFormat.V2TXLivePixelFormatTexture2D,
657
+ V2TXLiveDef.V2TXLiveBufferType.V2TXLiveBufferTypeTexture);
658
+ ```
659
+
660
+ #### enableCustomVideoCapture() - 开启/关闭自定义视频采集
661
+ ```java
662
+ public abstract int enableCustomVideoCapture(boolean enable);
663
+ ```
664
+
665
+ **参数**:
666
+ - `enable`: true开启自定义采集,false关闭【默认值: false】
667
+
668
+ **返回值**: `V2TXLiveCode`
669
+ - `V2TXLIVE_OK`: 成功
670
+
671
+ **使用场景**:
672
+ - **外部设备采集**: 连接外部摄像头、采集卡等设备
673
+ - **视频处理**: 对视频进行特殊处理后再推流
674
+ - **多路合成**: 将多路视频源合成为一路推流
675
+ - **特殊格式**: 支持特殊视频格式的推流
676
+
677
+ **注意事项**:
678
+ - **推流前必须调用此方法开启自定义采集**,否则推流将失败
679
+ - 必须在`startPush`之前调用才会生效
680
+ - 自定义采集模式下,SDK只负责编码和发送,不进行实际采集
681
+
682
+ **使用时机**: 推流开始前
683
+
684
+ **示例**:
685
+ ```java
686
+ // 开启自定义视频采集
687
+ pusher.enableCustomVideoCapture(true);
688
+ pusher.startPush(url);
689
+
690
+ // 发送自定义视频帧
691
+ V2TXLiveVideoFrame videoFrame = new V2TXLiveVideoFrame();
692
+ videoFrame.width = 1920;
693
+ videoFrame.height = 1080;
694
+ videoFrame.pixelFormat = V2TXLivePixelFormat.V2TXLivePixelFormatI420;
695
+ videoFrame.bufferType = V2TXLiveBufferType.V2TXLiveBufferTypeByteBuffer;
696
+ pusher.sendCustomVideoFrame(videoFrame);
697
+ ```
698
+
699
+ #### enableCustomAudioCapture() - 开启/关闭自定义音频采集
700
+ ```java
701
+ public abstract int enableCustomAudioCapture(boolean enable);
702
+ ```
703
+
704
+ **参数**:
705
+ - `enable`: true开启自定义采集,false关闭【默认值: false】
706
+
707
+ **返回值**: `V2TXLiveCode`
708
+ - `V2TXLIVE_OK`: 成功
709
+
710
+ **使用场景**:
711
+ - **外部音频设备**: 连接外部麦克风、音频接口等设备
712
+ - **音频处理**: 对音频进行特殊处理后再推流
713
+ - **多路音频**: 将多路音频源合成为一路推流
714
+
715
+ **注意事项**:
716
+ - **推流前必须调用此方法开启自定义采集**,否则推流将失败
717
+ - 必须在`startPush`之前调用才会生效
718
+ - 自定义采集模式下,SDK只负责编码和发送,不进行实际采集
719
+
720
+ **使用时机**: 推流开始前
721
+
722
+ **示例**:
723
+ ```java
724
+ // 开启自定义音频采集
725
+ pusher.enableCustomAudioCapture(true);
726
+ pusher.startPush(url);
727
+
728
+ // 发送自定义音频帧
729
+ V2TXLiveAudioFrame audioFrame = new V2TXLiveAudioFrame();
730
+ audioFrame.data = audioData; // PCM音频数据
731
+ audioFrame.sampleRate = 44100; // 采样率
732
+ audioFrame.channel = 1; // 声道数
733
+ pusher.sendCustomAudioFrame(audioFrame);
734
+ ```
735
+
736
+ #### sendSeiMessage() - 发送SEI消息
737
+ ```java
738
+ public abstract int sendSeiMessage(int payloadType, byte[] data);
739
+ ```
740
+
741
+ **参数**:
742
+ - `payloadType`: 数据类型,支持5、242,推荐填242
743
+ - `data`: 待发送的数据
744
+
745
+ **返回值**: `V2TXLiveCode`
746
+ - `V2TXLIVE_OK`: 成功
747
+
748
+ **说明**: 播放端通过`onReceiveSeiMessage`回调来接收该消息
749
+
750
+ **使用时机**: 推流过程中
751
+
752
+ **示例**:
753
+ ```java
754
+ byte[] seiData = "Hello SEI".getBytes();
755
+ pusher.sendSeiMessage(242, seiData);
756
+ ```
757
+
758
+ #### startSystemAudioLoopback() / stopSystemAudioLoopback() - 打开/关闭系统声音采集
759
+ ```java
760
+ public abstract int startSystemAudioLoopback();
761
+ public abstract int stopSystemAudioLoopback();
762
+ ```
763
+
764
+ **返回值**: `V2TXLiveCode`
765
+ - `V2TXLIVE_OK`: 成功
766
+
767
+ **说明**:
768
+ - 开启后可以采集整个操作系统的播放声音,并将其混入到当前麦克风采集的声音中一起发送到云端
769
+ - 只在Android API 29及以上的版本生效
770
+ - 需要先使用该接口来开启系统声音采集,当使用屏幕分享接口开启屏幕分享时才会真正生效
771
+ - 需要添加前台服务确保系统声音采集不被静默
772
+
773
+ **使用时机**: 推流开始前
774
+
775
+ **示例**:
776
+ ```java
777
+ // 开启系统声音采集
778
+ pusher.startSystemAudioLoopback();
779
+ // 停止系统声音采集
780
+ pusher.stopSystemAudioLoopback();
781
+ ```
782
+
783
+ #### setMixTranscodingConfig() - 设置云端的混流转码参数
784
+ ```java
785
+ public abstract int setMixTranscodingConfig(V2TXLiveTranscodingConfig config);
786
+ ```
787
+
788
+ **参数**:
789
+ - `config`: 混流转码配置,传入null则取消云端混流转码
790
+
791
+ **返回值**: `V2TXLiveCode`
792
+ - `V2TXLIVE_OK`: 成功
793
+ - `V2TXLIVE_ERROR_REFUSED`: 未开启推流时,不允许设置混流转码参数
794
+
795
+ **混流原理**:
796
+ ```
797
+ 【画面1】=> 解码 ====> \
798
+ \
799
+ 【画面2】=> 解码 => 画面混合 => 编码 => 【混合后的画面】
800
+ /
801
+ 【画面3】=> 解码 ====> /
802
+
803
+ 【声音1】=> 解码 ====> \
804
+ \
805
+ 【声音2】=> 解码 => 声音混合 => 编码 => 【混合后的声音】
806
+ /
807
+ 【声音3】=> 解码 ====> /
808
+ ```
809
+
810
+ **注意事项**:
811
+ - **仅支持RTC协议混流**:该接口只能在RTC协议下使用,不支持RTMP等其他推流协议
812
+ - 云端转码会引入1-2秒的CDN观看延时
813
+ - 及时传入null取消混流,避免不必要的计费损失
814
+
815
+ **使用时机**: 推流过程中
816
+
817
+ **示例**:
818
+ ```java
819
+ V2TXLiveTranscodingConfig config = new V2TXLiveTranscodingConfig();
820
+ config.videoWidth = 1280;
821
+ config.videoHeight = 720;
822
+ config.videoBitrate = 1500;
823
+ config.videoFps = 15;
824
+ pusher.setMixTranscodingConfig(config);
825
+
826
+ // 取消混流
827
+ pusher.setMixTranscodingConfig(null);
828
+ ```
829
+
830
+ #### startLocalRecording() / stopLocalRecording() - 开始/停止录制音视频流
831
+ ```java
832
+ public abstract int startLocalRecording(V2TXLiveLocalRecordingParams params);
833
+ public abstract void stopLocalRecording();
834
+ ```
835
+
836
+ **参数**:
837
+ - `params`: 本地录制参数
838
+
839
+ **返回值**: `V2TXLiveCode`
840
+ - `V2TXLIVE_OK`: 成功
841
+ - `V2TXLIVE_ERROR_INVALID_PARAMETER`: 参数不合法
842
+ - `V2TXLIVE_ERROR_REFUSED`: API被拒绝,推流尚未开始
843
+
844
+ **说明**: 推流开启后才能开始录制,非推流状态下开启录制无效
845
+
846
+ **使用时机**: 推流过程中
847
+
848
+ **示例**:
849
+ ```java
850
+ pusher.setObserver(new V2TXLivePusherObserver() {
851
+ @Override
852
+ public void onLocalRecordBegin(int code, String storagePath) {
853
+ Log.i(TAG, "开始录制");
854
+ }
855
+
856
+ @Override
857
+ public void onLocalRecording(long durationMs, String storagePath) {
858
+ Log.i(TAG, "录制中..., durationMs: " + durationMs);
859
+ }
860
+
861
+ @Override
862
+ public void onLocalRecordComplete(int code, String storagePath) {
863
+ Log.i(TAG, "录制完成");
864
+ }
865
+ });
866
+
867
+ V2TXLiveLocalRecordingParams params = new V2TXLiveLocalRecordingParams();
868
+ params.filePath = "filepath";
869
+ params.interval = 2000;
870
+ int code = pusher.startLocalRecording(params);
871
+ if (code == V2TXLIVE_OK) {
872
+ Log.i(TAG, "录制开启成功");
873
+ } else if (code == V2TXLIVE_ERROR_INVALID_PARAMETER) {
874
+ Log.i(TAG, "录制参数不合法");
875
+ } else if (code == V2TXLIVE_ERROR_REFUSED) {
876
+ Log.i(TAG, "录制调用被拒绝");
877
+ }
878
+ ```
879
+
880
+ #### showDebugView() - 显示仪表盘
881
+ ```java
882
+ public abstract void showDebugView(boolean isShow);
883
+ ```
884
+
885
+ **参数**:
886
+ - `isShow`: 是否显示【默认值: false】
887
+
888
+ **使用时机**: 无限制
889
+
890
+ **示例**:
891
+ ```java
892
+ // 显示调试视图
893
+ pusher.showDebugView(true);
894
+ // 隐藏调试视图
895
+ pusher.showDebugView(false);
896
+ ```
897
+
898
+ #### setProperty() - 调用V2TXLivePusher的高级API接口
899
+ ```java
900
+ public abstract int setProperty(String key, Object value);
901
+ ```
902
+
903
+ **参数**:
904
+ - `key`: 高级API对应的key,详情参考`V2TXLiveProperty`定义
905
+ - `value`: 调用key所对应的高级API时需要的参数
906
+
907
+ **返回值**: `V2TXLiveCode`
908
+ - `V2TXLIVE_OK`: 成功
909
+ - `V2TXLIVE_ERROR_INVALID_PARAMETER`: 操作失败,key不允许为空
910
+
911
+ **说明**: 该接口用于调用一些高级功能,有特殊需求,请于商务或架构师联系
912
+
913
+ **使用时机**: 无限制
914
+
915
+ **示例**:
916
+ ```java
917
+ pusher.setProperty("key", "value");
918
+ ```
919
+
920
+ ## 使用示例
921
+
922
+ ### 基础推流示例(摄像头+麦克风)
923
+ ```java
924
+ // 创建推流器实例
925
+ V2TXLivePusher pusher = new V2TXLivePusherImpl(context);
926
+
927
+ // 设置回调
928
+ pusher.setObserver(new V2TXLivePusherObserver() {
929
+ @Override
930
+ public void onPushStatusUpdate(V2TXLiveDef.V2TXLivePushStatus status, String msg, Bundle extraInfo) {
931
+ // 处理推流状态变化
932
+ }
933
+ });
934
+
935
+ // 设置预览视图
936
+ pusher.setRenderView(textureView);
937
+
938
+ // 重要:推流前必须开启至少一个采集源
939
+ // 1. 开启摄像头采集(前置摄像头)
940
+ pusher.startCamera(true);
941
+
942
+ // 2. 开启麦克风采集
943
+ pusher.startMicrophone();
944
+
945
+ // 3. 开始推流(必须在采集源开启后调用)
946
+ pusher.startPush("rtmp://your-stream-url");
947
+ ```
948
+
949
+ ### 屏幕分享推流示例
950
+ ```java
951
+ // 创建推流器实例
952
+ V2TXLivePusher pusher = new V2TXLivePusherImpl(context);
953
+
954
+ // 设置回调
955
+ pusher.setObserver(new V2TXLivePusherObserver() {
956
+ @Override
957
+ public void onPushStatusUpdate(V2TXLiveDef.V2TXLivePushStatus status, String msg, Bundle extraInfo) {
958
+ // 处理推流状态变化
959
+ }
960
+ });
961
+
962
+ // 重要:推流前必须开启至少一个采集源
963
+ // 1. 开启屏幕采集
964
+ pusher.startScreenCapture();
965
+
966
+ // 2. 开启麦克风采集(可选,如果需要声音)
967
+ pusher.startMicrophone();
968
+
969
+ // 3. 开始推流
970
+ pusher.startPush("rtmp://your-stream-url");
971
+ ```
972
+
973
+ ### 自定义采集示例
974
+ ```java
975
+ // 创建推流器实例
976
+ V2TXLivePusher pusher = new V2TXLivePusherImpl(context);
977
+
978
+ // 设置回调
979
+ pusher.setObserver(new V2TXLivePusherObserver() {
980
+ @Override
981
+ public void onPushStatusUpdate(V2TXLiveDef.V2TXLivePushStatus status, String msg, Bundle extraInfo) {
982
+ // 处理推流状态变化
983
+ }
984
+ });
985
+
986
+ // 重要:推流前必须开启至少一个采集源
987
+ // 1. 开启自定义视频采集(必须在startPush之前调用)
988
+ pusher.enableCustomVideoCapture(true);
989
+
990
+ // 2. 开启自定义音频采集(可选,如果需要音频)
991
+ pusher.enableCustomAudioCapture(true);
992
+
993
+ // 3. 开始推流
994
+ pusher.startPush("rtmp://your-stream-url");
995
+
996
+ // 4. 在自定义采集模式下发送视频帧
997
+ V2TXLiveVideoFrame videoFrame = new V2TXLiveVideoFrame();
998
+ videoFrame.width = 1920;
999
+ videoFrame.height = 1080;
1000
+ videoFrame.pixelFormat = V2TXLivePixelFormat.V2TXLivePixelFormatI420;
1001
+ videoFrame.bufferType = V2TXLiveBufferType.V2TXLiveBufferTypeByteBuffer;
1002
+ pusher.sendCustomVideoFrame(videoFrame);
1003
+ ```
1004
+
1005
+ ## 注意事项
1006
+
1007
+ ### 1. 采集源要求(重要)
1008
+ **推流前必须开启至少一个采集源**,否则推流将失败:
1009
+ - **摄像头采集**:`startCamera()` + `startMicrophone()`
1010
+ - **屏幕采集**:`startScreenCapture()` + `startMicrophone()`
1011
+ - **图片推流**:`startVirtualCamera()` + `startMicrophone()`
1012
+ - **自定义采集**:`enableCustomVideoCapture()` + `enableCustomAudioCapture()`
1013
+ - **纯音频推流**:`startMicrophone()`
1014
+
1015
+ ### 2. 采集源切换规则
1016
+ - 同一Pusher实例下,仅有一个采集源可以上行
1017
+ - 不同采集源之间切换需要成对调用:先关闭当前采集源,再开启新采集源
1018
+
1019
+ ### 3. 调用顺序要求
1020
+ 1. 创建推流器实例
1021
+ 2. 设置回调和预览视图
1022
+ 3. 开启至少一个采集源
1023
+ 4. 调用`startPush()`开始推流
1024
+
1025
+ ### 4. 自定义采集注意事项
1026
+ - 需要在`startPush`之前调用自定义采集相关接口才会生效
1027
+ - 自定义采集模式下,SDK只负责编码和发送,不进行实际采集
1028
+
1029
+ ### 5. 云端混流注意事项
1030
+ - **协议限制**:云端混流功能仅支持RTC协议,不支持RTMP等其他推流协议
1031
+ - 及时取消混流配置,避免不必要的计费损失
1032
+ - 云端转码会引入1-2秒的CDN观看延时
1033
+
1034
+ ### 6. 本地录制注意事项
1035
+ - 推流开启后才能开始录制
1036
+ - 录制过程中不要动态切换分辨率和软/硬编
1037
+
1038
+ ### 7. 系统声音采集要求
1039
+ - 需要Android API 29及以上版本
1040
+ - 需要添加前台服务确保采集不被静默
1041
+ - 只在屏幕分享时真正生效
1042
+
1043
+ ### 8. 性能优化建议
1044
+ - 根据场景选择合适的音视频质量参数
1045
+ - 及时释放不使用的推流器实例
1046
+ - 合理使用暂停/恢复功能节省带宽