@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,879 @@
1
+ # 腾讯云直播SDK V2TXLivePlayerObserver 播放器回调接口文档
2
+
3
+ ## 概述
4
+
5
+ `V2TXLivePlayerObserver` 是腾讯云直播SDK的播放器回调接口,用于接收播放器的各种状态通知和事件回调。通过实现该接口的回调方法,开发者可以监控播放器的运行状态、处理播放事件、获取统计数据等。
6
+
7
+ **文件路径**: `v2_tx_live_player_observer.dart`
8
+ **平台支持**: Flutter
9
+
10
+ **主要功能**:
11
+ - 播放器状态监控(错误、警告、连接状态)
12
+ - 音视频播放事件回调
13
+ - 播放统计数据和性能指标
14
+ - 自定义渲染和音频处理
15
+ - 本地录制任务管理
16
+ - SEI消息接收和处理
17
+
18
+ ## 回调方法详解
19
+
20
+ ### 1. 错误和警告回调
21
+
22
+ #### onError() - 播放器错误通知
23
+ ```dart
24
+ void onError(V2TXLivePlayer player, int code, String msg, Map<String, dynamic> extraInfo)
25
+ ```
26
+
27
+ **功能**: 播放器出现错误时回调
28
+
29
+ **参数**:
30
+ - `player`: 触发回调的播放器实例
31
+ - `code`: 错误码,参考 `V2TXLiveCode` 枚举
32
+ - `msg`: 错误描述信息
33
+ - `extraInfo`: 扩展信息,包含详细的错误上下文
34
+
35
+ **使用场景**:
36
+ - rtc拉流参数不合法
37
+ - rtc拉流超时
38
+ - rtc拉流服务器处理失败
39
+ - 找不到hevc解码器
40
+
41
+ **示例**:
42
+ ```dart
43
+ player.addListener(V2TXLivePlayerObserver(
44
+ onError: (player, code, msg, extraInfo) {
45
+ switch (code) {
46
+ case V2TXLiveCode.V2TXLIVE_ERROR_INVALID_PARAMETER:
47
+ print('rtc拉流参数不合法,$msg');
48
+ break;
49
+ case V2TXLiveCode.V2TXLIVE_ERROR_REQUEST_TIMEOUT:
50
+ print('rtc拉流超时,$msg');
51
+ break;
52
+ case V2TXLiveCode.V2TXLIVE_ERROR_SERVER_PROCESS_FAILED:
53
+ print('rtc拉流服务器处理失败,请检查拉流参数,$msg');
54
+ break;
55
+ case V2TXLiveCode.V2TXLIVE_ERROR_DISCONNECTED:
56
+ print('拉流断开,$msg');
57
+ break;
58
+ case V2TXLiveCode.V2TXLIVE_ERROR_NO_AVAILABLE_HEVC_DECODERS:
59
+ print('找不到hevc解码器,可以切换到avc流进行播放,$msg');
60
+ break;
61
+ default:
62
+ print('其它错误,$msg');
63
+ break;
64
+ }
65
+ }
66
+ ));
67
+ ```
68
+
69
+ #### onWarning() - 播放器警告通知
70
+ ```dart
71
+ void onWarning(V2TXLivePlayer player, int code, String msg, Map<String, dynamic> extraInfo)
72
+ ```
73
+
74
+ **功能**: 播放器出现警告时回调
75
+
76
+ **参数**:
77
+ - `player`: 触发回调的播放器实例
78
+ - `code`: 警告码,参考 `V2TXLiveCode` 枚举
79
+ - `msg`: 警告描述信息
80
+ - `extraInfo`: 扩展信息
81
+
82
+ **使用场景**:
83
+ - 视频渲染发生卡顿
84
+ - 解码器类型变更
85
+
86
+ **示例**:
87
+ ```dart
88
+ player.addListener(V2TXLivePlayerObserver(
89
+ onWarning: (player, code, msg, extraInfo) {
90
+ switch (code) {
91
+ case V2TXLiveCode.V2TXLIVE_WARNING_VIDEO_BLOCK:
92
+ print('视频渲染发生卡顿');
93
+ break;
94
+ case V2TXLiveCode.V2TXLIVE_WARNING_CURRENT_DECODE_TYPE_CHANGED:
95
+ int codecType = extraInfo['codec_type'];
96
+ if (codecType == 0) {
97
+ print('解码器类型变更,h.264,$msg');
98
+ } else if (codecType == 1) {
99
+ print('解码器类型变更,h.265,$msg');
100
+ }
101
+ break;
102
+ default:
103
+ print('其它警告,$msg');
104
+ break;
105
+ }
106
+ }
107
+ ));
108
+ ```
109
+
110
+ ## 回调类型枚举
111
+
112
+ ### V2TXLivePlayerListenerType
113
+
114
+ 播放器监听器类型枚举,定义了所有可用的回调事件类型:
115
+
116
+ | 枚举值 | 描述 | 参数说明 |
117
+ |--------|------|----------|
118
+ | `onError` | **错误回调** - SDK 不可恢复的错误通知 | `code`: 错误码(V2TXLiveCode)<br>`msg`: 错误消息<br>`extraInfo`: 扩展信息 |
119
+ | `onWarning` | **警告回调** - 非关键问题通知(如卡顿、可恢复的解码失败) | `code`: 警告码(V2TXLiveCode)<br>`msg`: 警告消息<br>`extraInfo`: 扩展信息 |
120
+ | `onVideoResolutionChanged` | **视频分辨率变化通知** | `width`: 视频宽度<br>`height`: 视频高度 |
121
+ | `onConnected` | **连接成功通知** | `extraInfo`: 扩展信息 |
122
+ | `onVideoPlaying` | **视频播放事件** | `firstPlay`: 首次播放标志<br>`extraInfo`: 扩展信息 |
123
+ | `onAudioPlaying` | **音频播放事件** | `firstPlay`: 首次播放标志<br>`extraInfo`: 扩展信息 |
124
+ | `onVideoLoading` | **视频加载事件** | `extraInfo`: 扩展信息 |
125
+ | `onAudioLoading` | **音频加载事件** | `extraInfo`: 扩展信息 |
126
+ | `onPlayoutVolumeUpdate` | **播放音量更新** | `volume`: 音量值(0-100) |
127
+ | `onStatisticsUpdate` | **播放器统计信息回调** | `appCpu`: 应用 CPU 使用率(%)<br>`systemCpu`: 系统 CPU 使用率(%)<br>`width`: 视频宽度<br>`height`: 视频高度<br>`fps`: 帧率<br>`videoBitrate`: 视频码率(Kbps)<br>`audioBitrate`: 音频码率(Kbps) |
128
+ | `onSnapshotComplete` | **截图完成回调** | `image`: 截取的视频画面(Uint8List) |
129
+ | `onRenderVideoFrame` | **自定义视频渲染回调** | `videoFrame`: 视频帧数据(Map) |
130
+ | `onReceiveSeiMessage` | **SEI 消息接收回调** | `payloadType`: 消息类型<br>`data`: 消息内容(Uint8List) |
131
+ | `onPictureInPictureStateUpdate` | **画中画状态变化回调** | `state`: 状态码<br>`message`: 状态消息<br>`extraInfo`: 扩展信息 |
132
+ | `onStreamSwitched` | **流切换回调** | 参数未详细说明 |
133
+
134
+ ## 回调函数定义
135
+
136
+ ### V2TXLivePlayerObserver
137
+
138
+ 播放器观察者回调函数类型定义:
139
+
140
+ ```dart
141
+ typedef V2TXLivePlayerObserver<P> = void Function(
142
+ V2TXLivePlayerListenerType type,
143
+ P? params
144
+ );
145
+ ```
146
+
147
+ **参数说明:**
148
+ - `type`: 回调事件类型(V2TXLivePlayerListenerType)
149
+ - `params`: 回调参数,类型为泛型 P,根据不同的回调类型传递不同的参数结构
150
+
151
+ ## 回调分类说明
152
+
153
+ ### 1. 错误和警告回调
154
+
155
+ #### onError
156
+ - **重要性**: 高
157
+ - **触发时机**: SDK 发生不可恢复的错误时
158
+ - **处理建议**: 必须监听此回调,并根据错误码给用户适当的 UI 提示
159
+
160
+ #### onWarning
161
+ - **重要性**: 中
162
+ - **触发时机**: 发生非关键问题,如卡顿、可恢复的解码失败等
163
+ - **处理建议**: 可选择性监听,用于监控播放质量
164
+
165
+ ### 2. 连接和状态回调
166
+
167
+ #### onConnected() - 网络连接成功回调
168
+ ```dart
169
+ void onConnected(V2TXLivePlayer player, Map<String, dynamic> extraInfo)
170
+ ```
171
+
172
+ **功能**: 播放器成功连接到服务器时回调
173
+
174
+ **参数**:
175
+ - `player`: 触发回调的播放器实例
176
+ - `extraInfo`: 连接相关信息
177
+
178
+ **使用场景**:
179
+ - 监控播放器网络连接状态
180
+ - 确认播放器已建立连接
181
+
182
+ **示例**:
183
+ ```dart
184
+ player.addListener(V2TXLivePlayerObserver(
185
+ onConnected: (player, extraInfo) {
186
+ print('服务器连接成功');
187
+ }
188
+ ));
189
+ ```
190
+
191
+ #### onVideoResolutionChanged() - 视频分辨率变化回调
192
+ ```dart
193
+ void onVideoResolutionChanged(V2TXLivePlayer player, int width, int height)
194
+ ```
195
+
196
+ **功能**: 视频分辨率发生变化时回调
197
+
198
+ **参数**:
199
+ - `player`: 触发回调的播放器实例
200
+ - `width`: 新的视频宽度
201
+ - `height`: 新的视频高度
202
+
203
+ **使用场景**:
204
+ - 自适应视频渲染视图
205
+ - 动态调整播放器布局
206
+
207
+ **示例**:
208
+ ```dart
209
+ player.addListener(V2TXLivePlayerObserver(
210
+ onVideoResolutionChanged: (player, width, height) {
211
+ print('视频流分辨率发生变化: width-$width, height-$height');
212
+ }
213
+ ));
214
+ ```
215
+
216
+ ### 3. 播放事件回调
217
+
218
+ #### onVideoPlaying() - 视频开始播放事件
219
+ ```dart
220
+ void onVideoPlaying(V2TXLivePlayer player, bool firstPlay, Map<String, dynamic> extraInfo)
221
+ ```
222
+
223
+ **功能**: 视频开始播放时回调,除首次播放外,与onVideoLoading配对使用
224
+
225
+ **参数**:
226
+ - `player`: 触发回调的播放器实例
227
+ - `firstPlay`: 是否为首次播放标志
228
+ - `extraInfo`: 播放相关信息
229
+
230
+ **使用场景**:
231
+ - 显示播放状态UI
232
+ - 开始播放计时
233
+ - 记录播放日志
234
+ - 计算秒开耗时
235
+
236
+ **示例**:
237
+ ```dart
238
+ player.addListener(V2TXLivePlayerObserver(
239
+ onVideoPlaying: (player, firstPlay, extraInfo) {
240
+ if (firstPlay) {
241
+ // 视频首次开始播放
242
+ print('首次开始播放');
243
+ } else {
244
+ // 视频非首次开始播放,可以隐藏加载 UI
245
+ print('开始播放');
246
+ }
247
+ }
248
+ ));
249
+ ```
250
+
251
+ #### onVideoLoading() - 视频开始加载事件
252
+ ```dart
253
+ void onVideoLoading(V2TXLivePlayer player, Map<String, dynamic> extraInfo)
254
+ ```
255
+
256
+ **功能**: 视频数据加载时回调
257
+
258
+ **参数**:
259
+ - `player`: 触发回调的播放器实例
260
+ - `extraInfo`: 加载状态信息
261
+
262
+ **使用场景**:
263
+ - 显示加载动画
264
+ - 缓冲状态提示
265
+
266
+ **示例**:
267
+ ```dart
268
+ player.addListener(V2TXLivePlayerObserver(
269
+ onVideoLoading: (player, extraInfo) {
270
+ // 视频播放开始加载,可以显示加载 UI
271
+ print('视频播放开始加载');
272
+ }
273
+ ));
274
+ ```
275
+
276
+ #### onAudioPlaying() - 音频开始播放事件
277
+ ```dart
278
+ void onAudioPlaying(V2TXLivePlayer player, bool firstPlay, Map<String, dynamic> extraInfo)
279
+ ```
280
+
281
+ **功能**: 音频开始播放时回调
282
+
283
+ **参数**:
284
+ - `player`: 触发回调的播放器实例
285
+ - `firstPlay`: 是否为首次播放标志
286
+ - `extraInfo`: 播放相关信息
287
+
288
+ **使用场景**:
289
+ - 音频播放状态监控
290
+ - 纯音频流播放场景
291
+
292
+ **示例**:
293
+ ```dart
294
+ player.addListener(V2TXLivePlayerObserver(
295
+ onAudioPlaying: (player, firstPlay, extraInfo) {
296
+ if (firstPlay) {
297
+ print('音频首次开始播放');
298
+ } else {
299
+ print('音频开始播放');
300
+ }
301
+ }
302
+ ));
303
+ ```
304
+
305
+ #### onAudioLoading() - 音频开始加载事件
306
+ ```dart
307
+ void onAudioLoading(V2TXLivePlayer player, Map<String, dynamic> extraInfo)
308
+ ```
309
+
310
+ **功能**: 音频数据加载时回调
311
+
312
+ **参数**:
313
+ - `player`: 触发回调的播放器实例
314
+ - `extraInfo`: 加载状态信息
315
+
316
+ **使用场景**:
317
+ - 显示加载动画
318
+ - 缓冲状态提示
319
+
320
+ **示例**:
321
+ ```dart
322
+ player.addListener(V2TXLivePlayerObserver(
323
+ onAudioLoading: (player, extraInfo) {
324
+ // 音频播放开始加载
325
+ print('音频播放开始加载');
326
+ }
327
+ ));
328
+ ```
329
+
330
+ ### 3. 音视频质量监控回调
331
+
332
+ #### onVideoResolutionChanged
333
+ - **触发时机**: 直播流分辨率发生变化时
334
+ ### 4. 音视频数据处理回调
335
+
336
+ #### onPlayoutVolumeUpdate() - 音量更新回调
337
+ ```dart
338
+ void onPlayoutVolumeUpdate(V2TXLivePlayer player, int volume)
339
+ ```
340
+
341
+ **功能**: 播放音量大小实时回调
342
+
343
+ **参数**:
344
+ - `player`: 触发回调的播放器实例
345
+ - `volume`: 当前播放音量值(0-100)
346
+
347
+ **前提条件**: 需要调用 `enableVolumeEvaluation()` 开启音量评估
348
+
349
+ **使用场景**:
350
+ - 实时音量显示
351
+ - 音频波形动画
352
+ - 静音检测
353
+
354
+ **示例**:
355
+ ```dart
356
+ player.addListener(V2TXLivePlayerObserver(
357
+ onPlayoutVolumeUpdate: (player, volume) {
358
+ // 音频播放音量回调,可以更新音量大小
359
+ print('音频播放音量,音量:$volume');
360
+ }
361
+ ));
362
+ player.enableVolumeEvaluation(300);
363
+ ```
364
+
365
+ #### onRenderVideoFrame() - 自定义视频渲染回调
366
+ ```dart
367
+ void onRenderVideoFrame(V2TXLivePlayer player, Map<String, dynamic> videoFrame)
368
+ ```
369
+
370
+ **功能**: 自定义视频帧渲染回调
371
+
372
+ **参数**:
373
+ - `player`: 触发回调的播放器实例
374
+ - `videoFrame`: 视频帧数据,包含像素格式、缓冲区类型等信息
375
+
376
+ **前提条件**: 需要调用 `enableObserveVideoFrame()` 开启视频帧回调
377
+
378
+ **使用场景**:
379
+ - 自定义视频渲染
380
+ - 添加滤镜效果
381
+ - 视频水印处理
382
+
383
+ **示例**:
384
+ ```dart
385
+ // 开启自定义渲染
386
+ await player.enableObserveVideoFrame(true,
387
+ V2TXLivePixelFormat.v2TXLivePixelFormatTexture2D,
388
+ V2TXLiveBufferType.v2TXLiveBufferTypeTexture);
389
+
390
+ player.addListener(V2TXLivePlayerObserver(
391
+ onRenderVideoFrame: (player, videoFrame) {
392
+ // 自定义渲染逻辑
393
+ print('收到视频帧数据: ${videoFrame['width']}x${videoFrame['height']}');
394
+ }
395
+ ));
396
+ ```
397
+
398
+ #### onPlayoutAudioFrame() - 音频数据回调
399
+ ```dart
400
+ void onPlayoutAudioFrame(V2TXLivePlayer player, Map<String, dynamic> audioFrame)
401
+ ```
402
+
403
+ **功能**: 音频数据播放回调
404
+
405
+ **参数**:
406
+ - `player`: 触发回调的播放器实例
407
+ - `audioFrame`: 音频帧数据,包含采样率、声道数等信息
408
+
409
+ **前提条件**: 需要调用 `enableObserveAudioFrame()` 开启音频帧回调
410
+
411
+ **使用场景**:
412
+ - 自定义音频处理
413
+ - 音频分析
414
+ - 实时音频效果
415
+
416
+ **示例**:
417
+ ```dart
418
+ // 开启音频数据监听
419
+ await player.enableObserveAudioFrame(true);
420
+
421
+ player.addListener(V2TXLivePlayerObserver(
422
+ onPlayoutAudioFrame: (player, audioFrame) {
423
+ // 自定义音频处理逻辑
424
+ print('收到音频帧数据,采样率: ${audioFrame['sampleRate']}');
425
+ }
426
+ ));
427
+ ```
428
+
429
+ ### 5. 统计和监控回调
430
+
431
+ #### onStatisticsUpdate() - 统计数据回调
432
+ ```dart
433
+ void onStatisticsUpdate(V2TXLivePlayer player, Map<String, dynamic> statistics)
434
+ ```
435
+
436
+ **功能**: 播放器统计数据实时回调,约2秒回调一次
437
+
438
+ **参数**:
439
+ - `player`: 触发回调的播放器实例
440
+ - `statistics`: 播放统计信息,包含以下字段:
441
+ - `appCpu`: 应用CPU使用率(%)
442
+ - `systemCpu`: 系统CPU使用率(%)
443
+ - `width`: 视频宽度
444
+ - `height`: 视频高度
445
+ - `fps`: 帧率
446
+ - `videoBitrate`: 视频码率(Kbps)
447
+ - `audioBitrate`: 音频码率(Kbps)
448
+ - `audioSampleRate`: 音频采样率
449
+ - `audioChannels`: 音频声道数
450
+
451
+ **使用场景**:
452
+ - 播放质量监控
453
+ - 性能优化分析
454
+ - 用户体验统计
455
+
456
+ **示例**:
457
+ ```dart
458
+ player.addListener(V2TXLivePlayerObserver(
459
+ onStatisticsUpdate: (player, statistics) {
460
+ print('播放统计信息:');
461
+ print(' - 应用CPU: ${statistics['appCpu']}%');
462
+ print(' - 系统CPU: ${statistics['systemCpu']}%');
463
+ print(' - 分辨率: ${statistics['width']}x${statistics['height']}');
464
+ print(' - 帧率: ${statistics['fps']}fps');
465
+ print(' - 视频码率: ${statistics['videoBitrate']}Kbps');
466
+ print(' - 音频码率: ${statistics['audioBitrate']}Kbps');
467
+ }
468
+ ));
469
+ ```
470
+
471
+ ### 6. 高级功能回调
472
+
473
+ #### onSnapshotComplete() - 截图完成回调
474
+ ```dart
475
+ void onSnapshotComplete(V2TXLivePlayer player, Uint8List image)
476
+ ```
477
+
478
+ **功能**: 截图操作完成回调
479
+
480
+ **参数**:
481
+ - `player`: 触发回调的播放器实例
482
+ - `image`: 截取的视频画面数据(Uint8List)
483
+
484
+ **使用场景**:
485
+ - 视频截图保存
486
+ - 画面分享功能
487
+
488
+ **示例**:
489
+ ```dart
490
+ player.addListener(V2TXLivePlayerObserver(
491
+ onSnapshotComplete: (player, image) {
492
+ // 处理截图数据
493
+ print('截图完成,图片大小: ${image.length} bytes');
494
+ // 可以保存到文件或分享
495
+ }
496
+ ));
497
+ player.snapshot();
498
+ ```
499
+
500
+ #### onReceiveSeiMessage() - SEI消息接收回调
501
+ ```dart
502
+ void onReceiveSeiMessage(V2TXLivePlayer player, int payloadType, Uint8List data)
503
+ ```
504
+
505
+ **功能**: 接收SEI(Supplemental Enhancement Information)消息回调
506
+
507
+ **参数**:
508
+ - `player`: 触发回调的播放器实例
509
+ - `payloadType`: SEI消息类型
510
+ - `data`: SEI消息数据
511
+
512
+ **前提条件**: 需要调用 `enableReceiveSeiMessage()` 开启SEI消息接收
513
+
514
+ **使用场景**:
515
+ - 场景信息传递
516
+ - 互动消息传输
517
+ - 时间戳同步
518
+
519
+ **示例**:
520
+ ```dart
521
+ // 开启SEI消息接收
522
+ await player.enableReceiveSeiMessage(true, 5);
523
+
524
+ player.addListener(V2TXLivePlayerObserver(
525
+ onReceiveSeiMessage: (player, payloadType, data) {
526
+ // 处理SEI消息
527
+ print('收到SEI消息,类型: $payloadType,数据大小: ${data.length} bytes');
528
+ }
529
+ ));
530
+ ```
531
+
532
+ #### onStreamSwitched() - 流切换回调
533
+ ```dart
534
+ void onStreamSwitched(V2TXLivePlayer player, String url, int code)
535
+ ```
536
+
537
+ **功能**: 分辨率切换操作完成回调,调用 `switchStream()` 时回调
538
+
539
+ **参数**:
540
+ - `player`: 触发回调的播放器实例
541
+ - `url`: 切换后的播放地址
542
+ - `code`: 切换状态码(0:成功,-1:超时,-2:服务端错误,-3:客户端错误)
543
+
544
+ **使用场景**:
545
+ - 清晰度切换监控
546
+ - 流切换状态反馈
547
+
548
+ **示例**:
549
+ ```dart
550
+ player.startLivePlay("http://example.com/live/stream_1080p.flv");
551
+
552
+ player.addListener(V2TXLivePlayerObserver(
553
+ onStreamSwitched: (player, url, code) {
554
+ if (code == 0) {
555
+ print('切换成功');
556
+ } else if (code == -1) {
557
+ print('切换超时');
558
+ } else if (code == -2) {
559
+ print('切换失败,服务端错误');
560
+ } else if (code == -3) {
561
+ print('切换失败,客户端错误');
562
+ }
563
+ }
564
+ ));
565
+
566
+ await player.switchStream("http://example.com/live/stream_720p.flv");
567
+ ```
568
+ ### 7. 本地录制回调
569
+
570
+ #### onLocalRecordBegin() - 录制开始回调
571
+ ```dart
572
+ void onLocalRecordBegin(V2TXLivePlayer player, int code, String storagePath)
573
+ ```
574
+
575
+ **功能**: 本地录制任务开始回调,调用 `startLocalRecording()` 时回调
576
+
577
+ **参数**:
578
+ - `player`: 触发回调的播放器实例
579
+ - `code`: 录制状态码
580
+ - `storagePath`: 录制文件存储路径
581
+
582
+ **状态码说明**:
583
+ - `0`: 录制任务启动成功
584
+ - `-1`: 内部错误导致录制失败
585
+ - `-2`: 文件后缀名有误
586
+ - `-6`: 录制已经启动
587
+ - `-7`: 录制文件已存在
588
+ - `-8`: 录制目录无写入权限
589
+
590
+ #### onLocalRecording() - 录制进度回调
591
+ ```dart
592
+ void onLocalRecording(V2TXLivePlayer player, int durationMs, String storagePath)
593
+ ```
594
+
595
+ **功能**: 录制任务进行中进度回调,频率与 `startLocalRecording()` 传入的 `interval` 参数一致
596
+
597
+ **参数**:
598
+ - `player`: 触发回调的播放器实例
599
+ - `durationMs`: 已录制时长(毫秒)
600
+ - `storagePath`: 录制文件存储路径
601
+
602
+ **使用场景**:
603
+ - 录制进度显示
604
+ - 录制时长限制
605
+ - 录制状态监控
606
+
607
+ #### onLocalRecordComplete() - 录制完成回调
608
+ ```dart
609
+ void onLocalRecordComplete(V2TXLivePlayer player, int code, String storagePath)
610
+ ```
611
+
612
+ **功能**: 录制任务完成回调,调用 `stopLocalRecording()` 时回调
613
+
614
+ **参数**:
615
+ - `player`: 触发回调的播放器实例
616
+ - `code`: 录制完成状态码
617
+ - `storagePath`: 录制文件存储路径
618
+
619
+ **状态码说明**:
620
+ - `0`: 结束录制任务成功
621
+ - `-1`: 录制失败
622
+ - `-2`: 切换分辨率或横竖屏导致录制结束
623
+ - `-3`: 录制时间太短或未采集到数据
624
+
625
+ **示例**:
626
+ ```dart
627
+ player.addListener(V2TXLivePlayerObserver(
628
+ onLocalRecordBegin: (player, code, storagePath) {
629
+ print('开始录制');
630
+ },
631
+ onLocalRecording: (player, durationMs, storagePath) {
632
+ print('录制中..., durationMs: $durationMs');
633
+ },
634
+ onLocalRecordComplete: (player, code, storagePath) {
635
+ print('录制完成');
636
+ }
637
+ ));
638
+
639
+ V2TXLiveLocalRecordingParams params = V2TXLiveLocalRecordingParams(
640
+ filePath: "filepath",
641
+ interval: 2000
642
+ );
643
+ V2TXLiveCode code = await player.startLocalRecording(params);
644
+ if (code == V2TXLiveCode.V2TXLIVE_OK) {
645
+ print('录制开启成功');
646
+ } else if (code == V2TXLiveCode.V2TXLIVE_ERROR_INVALID_PARAMETER) {
647
+ print('录制参数不合法');
648
+ } else if (code == V2TXLiveCode.V2TXLIVE_ERROR_REFUSED) {
649
+ print('录制调用被拒绝');
650
+ }
651
+ ```
652
+
653
+ ### 8. 使用示例
654
+
655
+ #### 基础播放器回调实现
656
+ ```dart
657
+ class MyPlayerObserver extends V2TXLivePlayerObserver {
658
+ @override
659
+ void onError(V2TXLivePlayer player, int code, String msg, Map<String, dynamic> extraInfo) {
660
+ // 处理播放错误
661
+ print('PlayerError: 错误码: $code, 错误信息: $msg');
662
+ }
663
+
664
+ @override
665
+ void onConnected(V2TXLivePlayer player, Map<String, dynamic> extraInfo) {
666
+ // 连接成功处理
667
+ print('Player: 成功连接到服务器');
668
+ }
669
+
670
+ @override
671
+ void onVideoPlaying(V2TXLivePlayer player, bool firstPlay, Map<String, dynamic> extraInfo) {
672
+ // 视频开始播放
673
+ if (firstPlay) {
674
+ print('Player: 首次播放开始');
675
+ }
676
+ }
677
+
678
+ @override
679
+ void onStatisticsUpdate(V2TXLivePlayer player, Map<String, dynamic> statistics) {
680
+ // 更新播放统计信息
681
+ print('PlayerStats: 帧率: ${statistics['fps']}, 码率: ${statistics['videoBitrate']}');
682
+ }
683
+ }
684
+
685
+ // 设置回调观察者
686
+ V2TXLivePlayer player = await V2TXLivePlayer.create();
687
+ player.addListener(MyPlayerObserver());
688
+ ```
689
+
690
+ #### 自定义视频处理示例
691
+ ```dart
692
+ class VideoProcessorObserver extends V2TXLivePlayerObserver {
693
+ @override
694
+ void onRenderVideoFrame(V2TXLivePlayer player, Map<String, dynamic> videoFrame) {
695
+ // 自定义视频帧处理
696
+ // 可以添加滤镜、水印等效果
697
+ processVideoFrame(videoFrame);
698
+ }
699
+
700
+ void processVideoFrame(Map<String, dynamic> frame) {
701
+ // 视频帧处理逻辑
702
+ print('处理视频帧: ${frame['width']}x${frame['height']}');
703
+ }
704
+ }
705
+
706
+ // 开启自定义视频帧回调
707
+ await player.enableObserveVideoFrame(true);
708
+ player.addListener(VideoProcessorObserver());
709
+ ```
710
+
711
+ #### 本地录制监控示例
712
+ ```dart
713
+ class RecordingObserver extends V2TXLivePlayerObserver {
714
+ @override
715
+ void onLocalRecordBegin(V2TXLivePlayer player, int code, String storagePath) {
716
+ if (code == 0) {
717
+ print('Recording: 录制开始,文件路径: $storagePath');
718
+ } else {
719
+ print('Recording: 录制失败,错误码: $code');
720
+ }
721
+ }
722
+
723
+ @override
724
+ void onLocalRecording(V2TXLivePlayer player, int durationMs, String storagePath) {
725
+ // 更新录制进度
726
+ updateRecordingProgress(durationMs);
727
+ }
728
+
729
+ @override
730
+ void onLocalRecordComplete(V2TXLivePlayer player, int code, String storagePath) {
731
+ if (code == 0) {
732
+ print('Recording: 录制完成,文件路径: $storagePath');
733
+ } else {
734
+ print('Recording: 录制异常结束,状态码: $code');
735
+ }
736
+ }
737
+
738
+ void updateRecordingProgress(int durationMs) {
739
+ print('录制进度: ${durationMs}ms');
740
+ }
741
+ }
742
+
743
+ player.addListener(RecordingObserver());
744
+ ```
745
+ ## 注意事项
746
+
747
+ ### 1. 回调线程安全
748
+ - **主线程回调**: 除自定义渲染回调外,其它所有回调方法都在UI主线程执行
749
+ - **线程切换**: 自定义渲染回调可能在非UI线程执行,需要进行线程安全处理
750
+
751
+ ### 2. 性能影响
752
+ - **自定义渲染**: 开启自定义视频渲染可能影响播放性能,建议仅在必要时使用
753
+ - **音频处理**: 音频数据回调可能增加CPU开销,合理控制处理频率
754
+ - **统计频率**: 统计数据回调约2秒一次,避免在回调中进行耗时操作
755
+
756
+ ### 3. 内存管理
757
+ - **观察者释放**: 及时释放不再使用的观察者对象,避免内存泄漏
758
+ - **回调引用**: 避免在回调中持有对播放器的强引用,防止循环引用
759
+ - **资源清理**: 播放器销毁前确保移除所有观察者
760
+
761
+ ### 4. 错误处理
762
+ - **错误码解析**: 合理处理各种错误码,提供友好的用户提示
763
+ - **异常捕获**: 在回调方法中添加异常捕获,防止崩溃
764
+ - **状态恢复**: 根据错误类型实现相应的状态恢复逻辑
765
+
766
+ ### 5. 权限和配置
767
+ - **存储权限**: 本地录制需要确保有存储权限和足够的存储空间
768
+ - **网络权限**: 播放器需要网络权限才能正常拉流
769
+ - **音频权限**: 音频播放需要音频权限支持
770
+
771
+ ### 6. 最佳实践
772
+
773
+ #### 错误处理最佳实践
774
+ ```dart
775
+ player.addListener(V2TXLivePlayerObserver(
776
+ onError: (player, code, msg, extraInfo) {
777
+ try {
778
+ // 根据错误码提供用户友好的提示
779
+ switch (code) {
780
+ case V2TXLiveCode.V2TXLIVE_ERROR_INVALID_PARAMETER:
781
+ showToast('播放地址无效,请检查后重试');
782
+ break;
783
+ case V2TXLiveCode.V2TXLIVE_ERROR_REQUEST_TIMEOUT:
784
+ showToast('网络连接超时,请检查网络后重试');
785
+ break;
786
+ default:
787
+ showToast('播放失败,请稍后重试');
788
+ break;
789
+ }
790
+ } catch (e) {
791
+ print('错误处理异常: $e');
792
+ }
793
+ }
794
+ ));
795
+ ```
796
+
797
+ #### 性能监控最佳实践
798
+ ```dart
799
+ player.addListener(V2TXLivePlayerObserver(
800
+ onStatisticsUpdate: (player, statistics) {
801
+ // 监控播放质量
802
+ double fps = statistics['fps'];
803
+ double bitrate = statistics['videoBitrate'];
804
+
805
+ if (fps < 15) {
806
+ // 帧率过低,可能卡顿
807
+ print('警告:帧率过低 ($fps fps)');
808
+ }
809
+
810
+ if (bitrate < 500) {
811
+ // 码率过低,可能画质差
812
+ print('警告:视频码率过低 ($bitrate Kbps)');
813
+ }
814
+ }
815
+ ));
816
+ ```
817
+
818
+ #### 内存管理最佳实践
819
+ ```dart
820
+ class PlayerManager {
821
+ V2TXLivePlayer? player;
822
+ V2TXLivePlayerObserver? observer;
823
+
824
+ Future<void> initPlayer() async {
825
+ player = await V2TXLivePlayer.create();
826
+ observer = V2TXLivePlayerObserver(
827
+ onConnected: (player, extraInfo) {
828
+ print('连接成功');
829
+ }
830
+ );
831
+ player!.addListener(observer!);
832
+ }
833
+
834
+ void dispose() {
835
+ // 先移除观察者
836
+ if (player != null && observer != null) {
837
+ player!.removeListener(observer!);
838
+ }
839
+ // 再销毁播放器
840
+ player?.destroy();
841
+ player = null;
842
+ observer = null;
843
+ }
844
+ }
845
+ ```
846
+
847
+ ## 常见问题解答
848
+
849
+ ### Q: 为什么没有收到回调?
850
+ A: 请检查:
851
+ 1. 是否正确设置了观察者 `player.addListener(observer)`
852
+ 2. 播放器是否已成功创建和初始化
853
+ 3. 是否在正确的时机注册回调
854
+
855
+ ### Q: 自定义渲染回调性能差怎么办?
856
+ A: 建议:
857
+ 1. 优化渲染逻辑,避免复杂计算
858
+ 2. 使用异步处理减少主线程阻塞
859
+ 3. 仅在必要时开启自定义渲染
860
+
861
+ ### Q: 本地录制失败如何处理?
862
+ A: 检查:
863
+ 1. 存储权限是否授予
864
+ 2. 存储路径是否有效且有写入权限
865
+ 3. 存储空间是否充足
866
+
867
+ ### Q: SEI消息接收不到?
868
+ A: 确认:
869
+ 1. 是否调用了 `enableReceiveSeiMessage()` 开启接收
870
+ 2. payloadType 是否与发送端一致
871
+ 3. 流媒体是否包含SEI消息
872
+
873
+ ## 文件信息
874
+
875
+ - **文件路径**: `/Users/borryzhang/Work/Project/liteav_flutter/sdk/trtc/v3/lib/v2_tx_live_player_observer.dart`
876
+ - **文件大小**: 3.26 KB
877
+ - **总行数**: 140 行
878
+ - **平台支持**: Flutter
879
+ - **SDK版本**: v3