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