@tencentcloud/sdk-mcp 1.2.8 → 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/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,712 @@
|
|
|
1
|
+
# 腾讯云直播SDK V2TXLivePlayer 播放接口文档
|
|
2
|
+
|
|
3
|
+
## 概述
|
|
4
|
+
|
|
5
|
+
`V2TXLivePlayer` 是腾讯云直播播放器的核心接口类,负责从指定的直播流地址拉取音视频数据,并进行解码和本地渲染播放。
|
|
6
|
+
|
|
7
|
+
**文件路径**: `com/tencent/live2/V2TXLivePlayer.java`
|
|
8
|
+
**平台支持**: Android
|
|
9
|
+
|
|
10
|
+
## 核心功能
|
|
11
|
+
|
|
12
|
+
### 🎯 主要能力
|
|
13
|
+
- ✅ **多协议支持**: HTTP-FLV、WebRTC、TRTC、HLS、RTMP
|
|
14
|
+
- ✅ **画面控制**: 旋转、填充模式、镜像
|
|
15
|
+
- ✅ **播放控制**: 播放/停止、暂停/恢复、音量调节
|
|
16
|
+
- ✅ **缓存优化**: 自动调整缓存策略
|
|
17
|
+
- ✅ **无缝切换**: 直播流多分辨率无缝切换
|
|
18
|
+
- ✅ **自定义处理**: 音视频数据监听和自定义渲染
|
|
19
|
+
- ✅ **高级功能**: 截图、SEI消息、画中画、本地录制
|
|
20
|
+
|
|
21
|
+
### 🔧 技术特性
|
|
22
|
+
- **低延迟**: 优化的缓存策略和网络自适应
|
|
23
|
+
- **高兼容**: 支持多种视频编码格式和分辨率
|
|
24
|
+
- **易集成**: 简洁的API设计和完整的回调机制
|
|
25
|
+
- **高性能**: 硬件加速解码和高效的渲染管线
|
|
26
|
+
|
|
27
|
+
### 播放器实例创建
|
|
28
|
+
```java
|
|
29
|
+
V2TXLivePlayer player = new V2TXLivePlayerImpl(context);
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## 接口详解
|
|
33
|
+
|
|
34
|
+
### 1. 基础设置接口
|
|
35
|
+
|
|
36
|
+
#### setObserver() - 设置播放器回调
|
|
37
|
+
```java
|
|
38
|
+
public abstract void setObserver(V2TXLivePlayerObserver observer)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**参数**:
|
|
42
|
+
- `observer`: 播放器回调目标对象,需实现 `V2TXLivePlayerObserver` 协议
|
|
43
|
+
|
|
44
|
+
**使用时机**: 播放器初始化后立即设置
|
|
45
|
+
|
|
46
|
+
**说明**: 通过设置回调,可以监听播放器状态、播放音量回调、音视频首帧回调、统计数据、警告和错误信息等
|
|
47
|
+
|
|
48
|
+
**示例**:
|
|
49
|
+
```java
|
|
50
|
+
player.setObserver(new V2TXLivePlayerObserver() {
|
|
51
|
+
// ...
|
|
52
|
+
});
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
### setRenderView() - 设置视频渲染 View
|
|
57
|
+
```java
|
|
58
|
+
public abstract int setRenderView(TXCloudVideoView view)
|
|
59
|
+
public abstract int setRenderView(TextureView view)
|
|
60
|
+
public abstract int setRenderView(SurfaceView view)
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**参数**:
|
|
64
|
+
- `view`: 播放器渲染 View,支持 TXCloudVideoView、TextureView、SurfaceView(HDR播放必须为 SurfaceView)
|
|
65
|
+
|
|
66
|
+
**返回值**: `V2TXLiveCode`
|
|
67
|
+
- `V2TXLIVE_OK`: 成功
|
|
68
|
+
|
|
69
|
+
**使用时机**: 必须在开始播放前设置渲染视图
|
|
70
|
+
|
|
71
|
+
**示例**:
|
|
72
|
+
```java
|
|
73
|
+
player.setRenderView(videoView);
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
### setRenderRotation() - 设置播放器画面的旋转角度
|
|
78
|
+
```java
|
|
79
|
+
public abstract int setRenderRotation(V2TXLiveRotation rotation)
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**参数**:
|
|
83
|
+
- `rotation`: 旋转角度 `V2TXLiveDef#V2TXLiveRotation`
|
|
84
|
+
- `V2TXLiveRotation0`【默认值】: 0度, 不旋转
|
|
85
|
+
- `V2TXLiveRotation90`: 顺时针旋转90度
|
|
86
|
+
- `V2TXLiveRotation180`: 顺时针旋转180度
|
|
87
|
+
- `V2TXLiveRotation270`: 顺时针旋转270度
|
|
88
|
+
|
|
89
|
+
**返回值**: `V2TXLiveCode`
|
|
90
|
+
- `V2TXLIVE_OK`: 成功
|
|
91
|
+
|
|
92
|
+
**使用时机**: 无限制
|
|
93
|
+
|
|
94
|
+
**示例**:
|
|
95
|
+
```java
|
|
96
|
+
// 设置视频画面旋转0度
|
|
97
|
+
player.setRenderRotation(V2TXLiveDef.V2TXLiveRotation.V2TXLiveRotation0);
|
|
98
|
+
// 设置视频画面旋转90度
|
|
99
|
+
player.setRenderRotation(V2TXLiveDef.V2TXLiveRotation.V2TXLiveRotation90);
|
|
100
|
+
// 设置视频画面旋转180度
|
|
101
|
+
player.setRenderRotation(V2TXLiveDef.V2TXLiveRotation.V2TXLiveRotation180);
|
|
102
|
+
// 设置视频画面旋转270度
|
|
103
|
+
player.setRenderRotation(V2TXLiveDef.V2TXLiveRotation.V2TXLiveRotation270);
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
### setRenderFillMode() - 设置播放器画面的填充模式
|
|
108
|
+
```java
|
|
109
|
+
public abstract int setRenderFillMode(V2TXLiveFillMode mode)
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**参数**:
|
|
113
|
+
- `mode`: 填充模式 `V2TXLiveDef#V2TXLiveFillMode`
|
|
114
|
+
- `V2TXLiveFillModeFill`:【默认值】: 图像铺满屏幕,不留黑边,如果图像宽高比不同于屏幕宽高比,部分画面内容会被裁剪掉
|
|
115
|
+
- `V2TXLiveFillModeFit`: 图像适应屏幕,保持画面完整,但如果图像宽高比不同于屏幕宽高比,会有黑边的存在
|
|
116
|
+
- `V2TXLiveFillModeScaleFill`: 图像拉伸铺满,因此长度和宽度可能不会按比例变化
|
|
117
|
+
|
|
118
|
+
**返回值**: `V2TXLiveCode`
|
|
119
|
+
- `V2TXLIVE_OK`: 成功
|
|
120
|
+
|
|
121
|
+
**使用时机**: 无限制
|
|
122
|
+
|
|
123
|
+
**示例**:
|
|
124
|
+
```java
|
|
125
|
+
// 图像铺满屏幕
|
|
126
|
+
player.setRenderFillMode(V2TXLiveDef.V2TXLiveFillMode.V2TXLiveFillModeFill);
|
|
127
|
+
// 图像适应屏幕
|
|
128
|
+
player.setRenderFillMode(V2TXLiveDef.V2TXLiveFillMode.V2TXLiveFillModeFit);
|
|
129
|
+
// 图像拉伸铺满
|
|
130
|
+
player.setRenderFillMode(V2TXLiveDef.V2TXLiveFillMode.V2TXLiveFillModeScaleFill);
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
### setRenderMirrorMode() - 设置播放器画面的镜像模式
|
|
135
|
+
```java
|
|
136
|
+
public abstract int setRenderMirrorMode(boolean enable)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**参数**:
|
|
140
|
+
- `enable`: 是否开启播放端镜像模式【默认值】:false
|
|
141
|
+
|
|
142
|
+
**说明**: 开启镜像模式后,视频画面将左右翻转,您可以根据需要随时切换观看效果
|
|
143
|
+
|
|
144
|
+
**返回值**: `V2TXLiveCode`
|
|
145
|
+
- `V2TXLIVE_OK`: 成功
|
|
146
|
+
|
|
147
|
+
**使用时机**: 无限制
|
|
148
|
+
|
|
149
|
+
**示例**:
|
|
150
|
+
```java
|
|
151
|
+
// 开启镜像模式
|
|
152
|
+
player.setRenderMirrorMode(true);
|
|
153
|
+
// 关闭镜像模式
|
|
154
|
+
player.setRenderMirrorMode(false);
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
### 2. 播放控制接口
|
|
159
|
+
|
|
160
|
+
### startLivePlay() - 开始播放音视频流
|
|
161
|
+
```java
|
|
162
|
+
public abstract int startLivePlay(String url)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**参数**:
|
|
166
|
+
- `url`: 音视频流的播放地址,支持 HTTP-FLV、WebRTC、TRTC、HLS、RTMP
|
|
167
|
+
|
|
168
|
+
**返回值**: `V2TXLiveCode`
|
|
169
|
+
- `V2TXLIVE_OK`: 操作成功,开始连接并播放
|
|
170
|
+
- `V2TXLIVE_ERROR_INVALID_PARAMETER`: 操作失败,url 不合法
|
|
171
|
+
- `V2TXLIVE_ERROR_REFUSED`: RTC 不支持同一设备上同时推拉同一个 StreamId
|
|
172
|
+
- `V2TXLIVE_ERROR_INVALID_LICENSE`: licence 不合法,播放失败
|
|
173
|
+
|
|
174
|
+
**重要说明**:
|
|
175
|
+
- 10.7 版本开始,需要通过 `V2TXLivePremier#setLicence` 设置 Licence 后方可成功播放,否则将播放失败(黑屏),全局仅设置一次即可
|
|
176
|
+
- 直播 Licence、短视频 Licence 和视频播放 Licence 均可使用
|
|
177
|
+
|
|
178
|
+
**使用时机**: 无限制
|
|
179
|
+
|
|
180
|
+
**示例**:
|
|
181
|
+
```java
|
|
182
|
+
int result = player.startLivePlayer("http://example.com/live/stream_1080p.flv");
|
|
183
|
+
if (result == V2TXLiveCode.V2TXLIVE_OK) {
|
|
184
|
+
Log.i(TAG, "开始播放成功");
|
|
185
|
+
} else if (result == V2TXLiveCode.V2TXLIVE_ERROR_INVALID_PARAMETER) {
|
|
186
|
+
Log.w(TAG, "播放地址不合法");
|
|
187
|
+
} else if (result == V2TXLiveCode.V2TXLIVE_ERROR_REFUSED) {
|
|
188
|
+
Log.w(TAG, "调用被拒绝");
|
|
189
|
+
} else if (result == V2TXLiveCode.V2TXLIVE_ERROR_INVALID_LICENSE) {
|
|
190
|
+
Log.w(TAG, "Licence 不合法,请检查 Licence");
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
### stopPlay() - 停止播放音视频流
|
|
196
|
+
```java
|
|
197
|
+
public abstract int stopPlay()
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**返回值**: `V2TXLiveCode`
|
|
201
|
+
- `V2TXLIVE_OK`: 成功
|
|
202
|
+
|
|
203
|
+
**使用时机**: 开始播放后
|
|
204
|
+
|
|
205
|
+
**示例**:
|
|
206
|
+
```java
|
|
207
|
+
player.stopPlay();
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
### isPlaying() - 播放器是否正在播放中
|
|
212
|
+
```java
|
|
213
|
+
public abstract int isPlaying()
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
**返回值**:
|
|
217
|
+
- `1`: 正在播放中
|
|
218
|
+
- `0`: 已经停止播放
|
|
219
|
+
|
|
220
|
+
**使用时机**: 无限制
|
|
221
|
+
|
|
222
|
+
**示例**:
|
|
223
|
+
```java
|
|
224
|
+
int isPlaying = player.isPlaying();
|
|
225
|
+
if (isPlaying == 1) {
|
|
226
|
+
Log.i(TAG, "正在播放中");
|
|
227
|
+
} else {
|
|
228
|
+
Log.i(TAG, "播放停止");
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### 3. 音视频控制接口
|
|
233
|
+
|
|
234
|
+
### pauseAudio() - 暂停播放器的音频流
|
|
235
|
+
```java
|
|
236
|
+
public abstract int pauseAudio()
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
**返回值**: `V2TXLiveCode`
|
|
240
|
+
- `V2TXLIVE_OK`: 成功
|
|
241
|
+
|
|
242
|
+
**使用时机**: 无限制,若在开始播放前调用,则开始播放后,仅有视频画面,无音频播放
|
|
243
|
+
|
|
244
|
+
**示例**:
|
|
245
|
+
```java
|
|
246
|
+
player.pauseAudio();
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
### resumeAudio() - 恢复播放器的音频流
|
|
251
|
+
```java
|
|
252
|
+
public abstract int resumeAudio()
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
**返回值**: `V2TXLiveCode`
|
|
256
|
+
- `V2TXLIVE_OK`: 成功
|
|
257
|
+
|
|
258
|
+
**使用时机**: 无限制
|
|
259
|
+
|
|
260
|
+
**示例**:
|
|
261
|
+
```java
|
|
262
|
+
player.resumeAudio();
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
### pauseVideo() - 暂停播放器的视频流
|
|
267
|
+
```java
|
|
268
|
+
public abstract int pauseVideo()
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
**返回值**: `V2TXLiveCode`
|
|
272
|
+
- `V2TXLIVE_OK`: 成功
|
|
273
|
+
|
|
274
|
+
**使用时机**: 无限制,若在开始播放前调用,则开始播放后,仅有音频播放,无视频播放
|
|
275
|
+
|
|
276
|
+
**示例**:
|
|
277
|
+
```java
|
|
278
|
+
player.pauseVideo();
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
### resumeVideo() - 恢复播放器的视频流
|
|
283
|
+
|
|
284
|
+
```java
|
|
285
|
+
public abstract int resumeVideo()
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
**返回值**: `V2TXLiveCode`
|
|
289
|
+
- `V2TXLIVE_OK`: 成功
|
|
290
|
+
|
|
291
|
+
**使用时机**: 无限制
|
|
292
|
+
|
|
293
|
+
**示例**:
|
|
294
|
+
```java
|
|
295
|
+
player.resumeVideo();
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
### setPlayoutVolume() - 设置播放器音量
|
|
300
|
+
|
|
301
|
+
```java
|
|
302
|
+
public abstract int setPlayoutVolume(int volume)
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
**参数**:
|
|
306
|
+
- `volume`: 音量大小,取值范围0 - 100【默认值】: 100
|
|
307
|
+
|
|
308
|
+
**返回值**: `V2TXLiveCode`
|
|
309
|
+
- `V2TXLIVE_OK`: 成功
|
|
310
|
+
|
|
311
|
+
**使用时机**: 无限制
|
|
312
|
+
|
|
313
|
+
**示例**:
|
|
314
|
+
```java
|
|
315
|
+
player.setPlayoutVolume(50);
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
### 4. 高级功能接口
|
|
320
|
+
|
|
321
|
+
### setCacheParams() - 设置播放器缓存自动调整的最小和最大时间
|
|
322
|
+
|
|
323
|
+
```java
|
|
324
|
+
public abstract int setCacheParams(float minTime, float maxTime)
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
**参数**:
|
|
328
|
+
- `minTime`: 缓存自动调整的最小时间,取值需要大于0【默认值】:1
|
|
329
|
+
- `maxTime`: 缓存自动调整的最大时间,取值需要大于0【默认值】:5
|
|
330
|
+
|
|
331
|
+
**返回值**: `V2TXLiveCode`
|
|
332
|
+
- `V2TXLIVE_OK`: 成功
|
|
333
|
+
- `V2TXLIVE_ERROR_INVALID_PARAMETER`: 操作失败,minTime 和 maxTime 需要大于0
|
|
334
|
+
|
|
335
|
+
**优化建议**:
|
|
336
|
+
- 网络稳定:设置较小缓存(1-3秒)
|
|
337
|
+
- 网络波动:设置较大缓存(3-5秒)
|
|
338
|
+
- 无特殊要求,建议使用默认值
|
|
339
|
+
|
|
340
|
+
**使用时机**: 无限制
|
|
341
|
+
|
|
342
|
+
**示例**:
|
|
343
|
+
```java
|
|
344
|
+
player.setCacheParams(1, 5);
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
### switchStream() - 直播流多分辨率无缝切换,支持 FLV 和 LEB
|
|
349
|
+
|
|
350
|
+
```java
|
|
351
|
+
public abstract int switchStream(String newUrl)
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
**参数**:
|
|
355
|
+
- `newUrl`: 新分辨率拉流地址
|
|
356
|
+
|
|
357
|
+
**返回值**: `V2TXLiveCode`
|
|
358
|
+
- `V2TXLIVE_OK`: 成功
|
|
359
|
+
|
|
360
|
+
**使用时机**: 开始播放后
|
|
361
|
+
|
|
362
|
+
**示例**:
|
|
363
|
+
```java
|
|
364
|
+
player.startLivePlayer("http://example.com/live/stream_1080p.flv");
|
|
365
|
+
|
|
366
|
+
player.setObserver(new V2TXLivePlayerObserver() {
|
|
367
|
+
@Override
|
|
368
|
+
public void onStreamSwitched(V2TXLivePlayer player, String url, int code) {
|
|
369
|
+
if (code == 0) {
|
|
370
|
+
Log.i(TAG, "切换成功");
|
|
371
|
+
} else if (code == -1) {
|
|
372
|
+
Log.i(TAG, "切换超时");
|
|
373
|
+
} else if (code == -2) {
|
|
374
|
+
Log.i(TAG, "切换失败,服务端错误");
|
|
375
|
+
} else if (code == -3) {
|
|
376
|
+
Log.i(TAG, "切换失败,客户端错误");
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
});
|
|
380
|
+
player.switchStream("http://example.com/live/stream_720p.flv";
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
### getStreamList() - 获取码流信息,支持 HLS
|
|
385
|
+
|
|
386
|
+
```java
|
|
387
|
+
public abstract ArrayList<V2TXLiveDef.V2TXLiveStreamInfo> getStreamList()
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
**返回值**: 码流信息数组,包含不同清晰度的流信息
|
|
391
|
+
|
|
392
|
+
**使用时机**: 开始播放后
|
|
393
|
+
|
|
394
|
+
**示例**:
|
|
395
|
+
```java
|
|
396
|
+
player.startLivePlayer("http://example.com/live/stream_1080p.m3u8");
|
|
397
|
+
|
|
398
|
+
ArrayList<V2TXLiveStreamInfo> streamList = player.getStreamList();
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
### enableVolumeEvaluation() - 启用播放音量大小提示
|
|
403
|
+
|
|
404
|
+
```java
|
|
405
|
+
public abstract int enableVolumeEvaluation(int intervalMs)
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
**参数**:
|
|
409
|
+
- `intervalMs`: 决定了 `onPlayoutVolumeUpdate` 回调的触发间隔,单位为ms,最小间隔为100ms,如果小于等于0则会关闭回调,建议设置为300ms【默认值】:0,不开启
|
|
410
|
+
|
|
411
|
+
**说明**: 开启后可以在 `V2TXLivePlayerObserver` 回调中获取到 SDK 对音量大小值的评估
|
|
412
|
+
|
|
413
|
+
**返回值**: `V2TXLiveCode`
|
|
414
|
+
- `V2TXLIVE_OK`: 成功
|
|
415
|
+
|
|
416
|
+
**使用时机**: 无限制
|
|
417
|
+
|
|
418
|
+
**示例**:
|
|
419
|
+
```java
|
|
420
|
+
player.setObserver(new V2TXLivePlayerObserver() {
|
|
421
|
+
@Override
|
|
422
|
+
public void onPlayoutVolumeUpdate(V2TXLivePlayer player, int volume) {
|
|
423
|
+
// 音频播放音量回调,可以更新音量大小
|
|
424
|
+
Log.i(TAG, "音频播放音量,音量:" + volume);
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
player.enableVolumeEvaluation(300);
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
### snapshot() - 截取播放过程中的视频画面
|
|
432
|
+
```java
|
|
433
|
+
public abstract int snapshot()
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
**返回值**: `V2TXLiveCode`
|
|
437
|
+
- `V2TXLIVE_OK`: 成功
|
|
438
|
+
- `V2TXLIVE_ERROR_REFUSED`: 播放器处于停止状态,不允许调用截图操作
|
|
439
|
+
|
|
440
|
+
**使用时机**: 开始播放后
|
|
441
|
+
|
|
442
|
+
**示例**:
|
|
443
|
+
```java
|
|
444
|
+
player.setObserver(new V2TXLivePlayerObserver() {
|
|
445
|
+
@Override
|
|
446
|
+
public void onSnapshotComplete(V2TXLivePlayer player, Bitmap image) {
|
|
447
|
+
// doSomething
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
player.snapshot();
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
|
|
454
|
+
### enableObserveVideoFrame() - 开启/关闭自定义视频渲染
|
|
455
|
+
|
|
456
|
+
```java
|
|
457
|
+
public abstract int enableObserveVideoFrame(boolean enable, V2TXLivePixelFormat pixelFormat, V2TXLiveBufferType bufferType)
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
**参数**:
|
|
461
|
+
- `enable`: 是否开启自定义渲染【默认值】:false
|
|
462
|
+
- `pixelFormat`: 自定义渲染回调的视频像素格式 `V2TXLiveDef#V2TXLivePixelFormat`
|
|
463
|
+
- `bufferType`: 自定义渲染回调的视频数据格式 `V2TXLiveDef#V2TXLiveBufferType`
|
|
464
|
+
|
|
465
|
+
**说明**:
|
|
466
|
+
- SDK 在您开启此开关后将不再渲染视频画面,您可以通过 `V2TXLivePlayerObserver` 获得视频帧,并执行自定义的渲染逻辑
|
|
467
|
+
- 支持的类型组合:
|
|
468
|
+
V2TXLiveDef.V2TXLivePixelFormat.V2TXLivePixelFormatTexture2D, V2TXLiveDef.V2TXLiveBufferType.V2TXLiveBufferTypeTexture(推荐)
|
|
469
|
+
V2TXLiveDef.V2TXLivePixelFormat.V2TXLivePixelFormatI420, V2TXLiveDef.V2TXLiveBufferType.V2TXLiveBufferTypeByteArray
|
|
470
|
+
V2TXLiveDef.V2TXLivePixelFormat.V2TXLivePixelFormatI420, V2TXLiveDef.V2TXLiveBufferType.V2TXLiveBufferTypeByteBuffer
|
|
471
|
+
|
|
472
|
+
**返回值**: `V2TXLiveCode`
|
|
473
|
+
- `V2TXLIVE_OK`: 成功
|
|
474
|
+
- `V2TXLIVE_ERROR_NOT_SUPPORTED`: 像素格式或者数据格式不支持
|
|
475
|
+
|
|
476
|
+
**使用时机**: 开始播放前
|
|
477
|
+
|
|
478
|
+
**示例**:
|
|
479
|
+
```java
|
|
480
|
+
// 开启自定义渲染
|
|
481
|
+
player.enableObserveVideoFrame(true, V2TXLiveDef.V2TXLivePixelFormat.V2TXLivePixelFormatTexture2D, V2TXLiveDef.V2TXLiveBufferType.V2TXLiveBufferTypeTexture);
|
|
482
|
+
player.setObserver(new V2TXLivePlayerObserver() {
|
|
483
|
+
@Override
|
|
484
|
+
public void onRenderVideoFrame(V2TXLivePlayer player, V2TXLiveVideoFrame videoFrame) {
|
|
485
|
+
// 自定义渲染
|
|
486
|
+
}
|
|
487
|
+
});
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
### enableObserveAudioFrame() - 开启/关闭对音频数据的监听回调
|
|
492
|
+
|
|
493
|
+
```java
|
|
494
|
+
public abstract int enableObserveAudioFrame(boolean enable)
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
**参数**:
|
|
498
|
+
- `enable`: 是否开启音频数据回调【默认值】:false
|
|
499
|
+
|
|
500
|
+
**说明**: 如果您开启此开关,您可以通过 `V2TXLivePlayerObserver` 获得音频数据,并执行自定义的逻辑
|
|
501
|
+
|
|
502
|
+
**返回值**: `V2TXLiveCode`
|
|
503
|
+
- `V2TXLIVE_OK`: 成功
|
|
504
|
+
|
|
505
|
+
**使用时机**: 开始播放前
|
|
506
|
+
|
|
507
|
+
**示例**:
|
|
508
|
+
```java
|
|
509
|
+
// 开启音频数据监听
|
|
510
|
+
player.enableObserveAudioFrame(true);
|
|
511
|
+
player.setObserver(new V2TXLivePlayerObserver() {
|
|
512
|
+
@Override
|
|
513
|
+
public void onPlayoutAudioFrame(V2TXLivePlayer player, V2TXLiveAudioFrame audioFrame) {
|
|
514
|
+
// doSomething
|
|
515
|
+
}
|
|
516
|
+
});
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
|
|
520
|
+
### enableReceiveSeiMessage() - 开启/关闭接收 SEI 消息
|
|
521
|
+
|
|
522
|
+
```java
|
|
523
|
+
public abstract int enableReceiveSeiMessage(boolean enable, int payloadType)
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
**参数**:
|
|
527
|
+
- `enable`: true: 开启接收 SEI 消息; false: 关闭接收 SEI 消息【默认值】: false
|
|
528
|
+
- `payloadType`: 指定接收 SEI 消息的 payloadType,支持 5、242、243,请与发送端的 payloadType 保持一致
|
|
529
|
+
|
|
530
|
+
**返回值**: `V2TXLiveCode`
|
|
531
|
+
- `V2TXLIVE_OK`: 成功
|
|
532
|
+
|
|
533
|
+
**使用时机**: 开始播放前
|
|
534
|
+
|
|
535
|
+
**示例**:
|
|
536
|
+
```java
|
|
537
|
+
// 开启音频数据监听
|
|
538
|
+
player.enableReceiveSeiMessage(true, 5);
|
|
539
|
+
player.enableReceiveSeiMessage(true, 242);
|
|
540
|
+
player.enableReceiveSeiMessage(true, 243);
|
|
541
|
+
player.setObserver(new V2TXLivePlayerObserver() {
|
|
542
|
+
@Override
|
|
543
|
+
public void onReceiveSeiMessage(V2TXLivePlayer player, int payloadType, byte[] data) {
|
|
544
|
+
// doSomething
|
|
545
|
+
}
|
|
546
|
+
});
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
### startLocalRecording() - 开始录制音视频流
|
|
551
|
+
|
|
552
|
+
```java
|
|
553
|
+
public abstract int startLocalRecording(V2TXLiveLocalRecordingParams params)
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
**参数**:
|
|
557
|
+
- `params`: 请参考 `V2TXLiveDef.java` 中关于 `V2TXLiveLocalRecordingParams` 的介绍
|
|
558
|
+
|
|
559
|
+
**重要说明**:
|
|
560
|
+
- 拉流开启后才能开始录制,非拉流状态下开启录制无效
|
|
561
|
+
- 录制过程中不要动态切换软/硬解,生成的视频极有可能出现异常
|
|
562
|
+
|
|
563
|
+
**返回值**: `V2TXLiveCode`
|
|
564
|
+
- `V2TXLIVE_OK`: 成功
|
|
565
|
+
- `V2TXLIVE_ERROR_INVALID_PARAMETER`: 参数不合法,例如 filePath 为空
|
|
566
|
+
- `V2TXLIVE_ERROR_REFUSED`: API被拒绝,拉流尚未开始
|
|
567
|
+
|
|
568
|
+
**使用时机**: 开始播放后
|
|
569
|
+
|
|
570
|
+
**示例**:
|
|
571
|
+
```java
|
|
572
|
+
player.setObserver(new V2TXLivePlayerObserver() {
|
|
573
|
+
@Override
|
|
574
|
+
public void onLocalRecordBegin(V2TXLivePlayer player, int code, String storagePath) {
|
|
575
|
+
Log.i(TAG, "开始录制");
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
@Override
|
|
579
|
+
public void onLocalRecording(V2TXLivePlayer player, long durationMs, String storagePath) {
|
|
580
|
+
Log.i(TAG, "录制中..., durationMs: " + durationMs);
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
@Override
|
|
584
|
+
public void onLocalRecordComplete(V2TXLivePlayer player, int code, String storagePath) {
|
|
585
|
+
Log.i(TAG, "录制完成");
|
|
586
|
+
}
|
|
587
|
+
});
|
|
588
|
+
|
|
589
|
+
V2TXLiveDef.V2TXLiveLocalRecordingParams params = new V2TXLiveDef.V2TXLiveLocalRecordingParams();
|
|
590
|
+
params.filePath = "filepath";
|
|
591
|
+
params.interval = 2000;
|
|
592
|
+
int code = player.startLocalRecording(params);
|
|
593
|
+
if (code == V2TXLIVE_OK) {
|
|
594
|
+
Log.i(TAG, "录制开启成功");
|
|
595
|
+
} else if (code == V2TXLIVE_ERROR_INVALID_PARAMETER) {
|
|
596
|
+
Log.i(TAG, "录制参数不合法");
|
|
597
|
+
} else if (code == V2TXLIVE_ERROR_REFUSED) {
|
|
598
|
+
Log.i(TAG, "录制调用被拒绝");
|
|
599
|
+
}
|
|
600
|
+
```
|
|
601
|
+
|
|
602
|
+
|
|
603
|
+
### stopLocalRecording() - 停止录制音视频流
|
|
604
|
+
|
|
605
|
+
```java
|
|
606
|
+
public abstract void stopLocalRecording()
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
**说明**: 当停止拉流后,如果视频还在录制中,SDK 内部会自动结束录制
|
|
610
|
+
|
|
611
|
+
**使用时机**: 开始播放并且开启录制后
|
|
612
|
+
|
|
613
|
+
**示例**:
|
|
614
|
+
```java
|
|
615
|
+
player.stopLocalRecording();
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
|
|
619
|
+
### showDebugView() - 是否显示播放器状态信息的调试浮层
|
|
620
|
+
|
|
621
|
+
```java
|
|
622
|
+
public abstract void showDebugView(boolean isShow)
|
|
623
|
+
```
|
|
624
|
+
|
|
625
|
+
**参数**:
|
|
626
|
+
- `isShow`: 是否显示【默认值】:false
|
|
627
|
+
|
|
628
|
+
**使用时机**: 无限制
|
|
629
|
+
|
|
630
|
+
**示例**:
|
|
631
|
+
```java
|
|
632
|
+
player.showDebugView(true);
|
|
633
|
+
```
|
|
634
|
+
|
|
635
|
+
|
|
636
|
+
### setProperty()
|
|
637
|
+
|
|
638
|
+
调用 V2TXLivePlayer 的高级 API 接口
|
|
639
|
+
|
|
640
|
+
```java
|
|
641
|
+
public abstract int setProperty(String key, Object value)
|
|
642
|
+
```
|
|
643
|
+
|
|
644
|
+
**参数**:
|
|
645
|
+
- `key`: 高级 API 对应的 key
|
|
646
|
+
- `value`: 调用 key 所对应的高级 API 时,需要的参数
|
|
647
|
+
|
|
648
|
+
**说明**: 该接口用于调用一些高级功能,有特殊需求,请于商务或架构师联系
|
|
649
|
+
|
|
650
|
+
**返回值**: `V2TXLiveCode`
|
|
651
|
+
- `V2TXLIVE_OK`: 成功
|
|
652
|
+
- `V2TXLIVE_ERROR_INVALID_PARAMETER`: 操作失败,key 不允许为 null
|
|
653
|
+
|
|
654
|
+
|
|
655
|
+
#### enablePictureInPicture() - 开启/关闭画中画模式,仅iOS支持
|
|
656
|
+
```dart
|
|
657
|
+
Future<V2TXLiveCode> enablePictureInPicture(bool enable)
|
|
658
|
+
```
|
|
659
|
+
**参数**:
|
|
660
|
+
- `enable`: 是否启用画中画模式,默认: false
|
|
661
|
+
|
|
662
|
+
|
|
663
|
+
#### getTextureId() - 获取纹理 ID
|
|
664
|
+
```dart
|
|
665
|
+
Future<int> getTextureId(int width, int height)
|
|
666
|
+
```
|
|
667
|
+
**参数**:
|
|
668
|
+
- `width`: 纹理宽度
|
|
669
|
+
- `height`: 纹理高度
|
|
670
|
+
|
|
671
|
+
## 使用示例
|
|
672
|
+
|
|
673
|
+
```java
|
|
674
|
+
// 创建播放器实例
|
|
675
|
+
V2TXLivePlayer player = V2TXLivePlayerImpl(context);
|
|
676
|
+
|
|
677
|
+
// 设置回调
|
|
678
|
+
player.setObserver(new V2TXLivePlayerObserver() {
|
|
679
|
+
@Override
|
|
680
|
+
public void onConnected() {
|
|
681
|
+
// 连接成功回调
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
@Override
|
|
685
|
+
public void onVideoResolutionChanged(int width, int height) {
|
|
686
|
+
// 视频分辨率变化回调
|
|
687
|
+
}
|
|
688
|
+
});
|
|
689
|
+
|
|
690
|
+
// 设置渲染视图
|
|
691
|
+
player.setRenderView(videoView);
|
|
692
|
+
|
|
693
|
+
// 开始播放
|
|
694
|
+
int result = player.startLivePlay("rtmp://example.com/live/stream");
|
|
695
|
+
if (result == V2TXLIVE_OK) {
|
|
696
|
+
// 播放成功
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
// 暂停视频
|
|
700
|
+
player.pauseVideo();
|
|
701
|
+
|
|
702
|
+
// 恢复视频
|
|
703
|
+
player.resumeVideo();
|
|
704
|
+
|
|
705
|
+
// 停止播放
|
|
706
|
+
player.stopPlay();
|
|
707
|
+
```
|
|
708
|
+
|
|
709
|
+
## 注意事项
|
|
710
|
+
|
|
711
|
+
1. **Licence 要求**: 10.7 版本开始必须设置有效的 Licence 才能正常播放
|
|
712
|
+
2. **权限要求**: 需要网络权限和音频播放权限
|