直播协议 | 优点 | 缺点 | 播放延迟 |
HLS | 成熟度高、高并发无压力 | 需集成 SDK 才能播放 | 3s - 5s |
FLV | 成熟度高、高并发无压力 | 需集成 SDK 才能播放 | 2s - 3s |
RTMP | 延迟较低 | 高并发情况下表现不佳 | 1s - 3s |
WebRTC | 延迟最低 | 需集成 SDK 才能播放 | < 1s |
TXLivePlayerController controller = TXLivePlayerController();
@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('直播'),),body: SafeArea(child: Column(children: [Container(height: 150,color: Colors.black,child: Center(child: _aspectRatio>0?AspectRatio(aspectRatio: _aspectRatio,child: TXPlayerVideo(controller: _controller),):Container(),),),],),),);}
String flvUrl = "http://liteavapp.qcloud.com/live/liteavdemoplayerstreamid_demo1080p.flv";await _controller.startLivePlay(flvUrl);// 如果你使用的是 12.0 的以下版本,需要传入 playType,示例如下:await _controller.startLivePlay(flvUrl, playType: TXPlayType.LIVE_FLV);
可选值 | 枚举值 | 含义 |
PLAY_TYPE_LIVE_RTMP | 0 | 传入的 URL 为 RTMP 直播地址 |
PLAY_TYPE_LIVE_FLV | 1 | 传入的 URL 为 FLV 直播地址 |
PLAY_TYPE_LIVE_RTMP_ACC | 5 | 低延迟链路地址(仅适合于连麦场景) |
PLAY_TYPE_VOD_HLS | 3 | 传入的 URL 为 HLS(m3u8) 播放地址 |
// 暂停_controller.pause();// 恢复_controller.resume();
// 停止播放_controller.stop();
_controller.onPlayerEventBroadcast.listen((event) {//订阅事件分发if(event["event"] == 2012) {String msg = event["EVT_GET_MSG"];}});
// 正在播放的是流http://5815.liveplay.myqcloud.com/live/5815_62fe94d692ab11e791eae435c87f075e.flv,// 现切换到码率为 900kbps 的新流上_controller.switchStream("http://5815.liveplay.myqcloud.com/live/5815_62fe94d692ab11e791eae435c87f075e_900.flv");
控制模式 | 卡顿率 | 平均延迟 | 适用场景 | 原理简述 |
极速模式 | 较流畅偏高 | 2s - 3s | 美女秀场(冲顶大会) | 在延迟控制上有优势,适用于对延迟大小比较敏感的场景 |
流畅模式 | 卡顿率最低 | >= 5s | 游戏直播(企鹅电竞) | 对于超大码率的游戏直播(例如绝地求生)非常适合,卡顿率最低 |
自动模式 | 网络自适应 | 2s - 8s | 混合场景 | 观众端的网络越好,延迟就越低;观众端网络越差,延迟就越高 |
// 自动模式_controller.setLiveMode(TXPlayerLiveMode.Automatic);// 极速模式_controller.setLiveMode(TXPlayerLiveMode.Speed);// 流畅模式_controller.setLiveMode(TXPlayerLiveMode.Smooth);// 设置完成之后再启动播放
// 暂停_controller.pause();// 继续_controller.resume();
_controller.onPlayerEventBroadcast.listen((event) {if (event["event"] == TXVodPlayEvent.PLAY_EVT_GET_MESSAGE) {String msg = event[TXVodPlayEvent.EVT_GET_MSG];} else if (event["event"] == TXVodPlayEvent.PLAY_ERR_NET_DISCONNECT) {print("网络断开,拉流失败");}});
// 正在播放的是流 http://5815.liveplay.myqcloud.com/live/5815_62fe94d692ab11e791eae435c87f075e.flv,// 现切换到码率为900kbps的新流上_controller.switchStream("http://5815.liveplay.myqcloud.com/live/5815_62fe94d692ab11e791eae435c87f075e_900.flv");
控制模式 | 卡顿率 | 平均延迟 | 适用场景 | 原理简述 |
极速模式 | 较流畅偏高 | 2s - 3s | 美女秀场(冲顶大会) | 在延迟控制上有优势,适用于对延迟大小比较敏感的场景 |
流畅模式 | 卡顿率最低 | >= 5s | 游戏直播(企鹅电竞) | 对于超大码率的游戏直播(例如绝地求生)非常适合,卡顿率最低 |
自动模式 | 网络自适应 | 2s - 8s | 混合场景 | 观众端的网络越好,延迟就越低;观众端网络越差,延迟就越高 |
//自动模式_controller.setCacheParams(1, 5);//极速模式_controller.setCacheParams(1, 1);//流畅模式_controller.setCacheParams(5, 5);
quality
设置为 MAIN_PUBLISHER 或者 VIDEO_CHAT。Obs 的推流端积压比较严重,是无法达到低延时效果的。onPlayerNetStatusBroadcast
的NET_STATUS_VIDEO_WIDTH
和NET_STATUS_VIDEO_HEIGHT
获取视频的宽和高。具体使用方法见 状态反馈(onPlayerNetStatusBroadcast)。TXLivePlayerController
的 onPlayerEventBroadcast
和 onPlayerNetStatusBroadcast
进行监听,之后 SDK 的内部状态信息均会通过 onPlayerEventBroadcast
(事件通知)和 onPlayerNetStatusBroadcast
(状态反馈)通知给您。事件 ID | 数值 | 含义说明 |
PLAY_EVT_PLAY_BEGIN | 2004 | 视频播放开始 |
PLAY_EVT_PLAY_LOADING | 2007 | 视频播放 loading,如果能够恢复,之后会有 LOADING_END 事件 |
PLAY_EVT_VOD_LOADING_END | 2014 | 视频播放 loading 结束,视频继续播放 |
事件 ID | 数值 | 含义说明 |
PLAY_EVT_PLAY_END | 2006 | 视频播放结束 |
PLAY_ERR_NET_DISCONNECT | -2301 | 网络断连,且经多次重连亦不能恢复,更多重试请自行重启播放 |
PLAY_ERR_HLS_KEY | -2305 | HLS 解密 key 获取失败 |
事件 ID | 数值 | 含义说明 |
PLAY_WARNING_VIDEO_DECODE_FAIL | 2101 | 当前视频帧解码失败 |
PLAY_WARNING_AUDIO_DECODE_FAIL | 2102 | 当前音频帧解码失败 |
PLAY_WARNING_RECONNECT | 2103 | 网络断连, 已启动自动重连 (重连超过三次就直接抛送 PLAY_ERR_NET_DISCONNECT 了) |
PLAY_WARNING_HW_ACCELERATION_FAIL | 2106 | 硬解启动失败,采用软解 |
评估参数 | 含义说明 |
NET_STATUS_CPU_USAGE | 当前瞬时 CPU 使用率 |
NET_STATUS_VIDEO_WIDTH | 视频分辨率 - 宽 |
NET_STATUS_VIDEO_HEIGHT | 视频分辨率 - 高 |
NET_STATUS_NET_SPEED | 当前的网络数据接收速度 |
NET_STATUS_VIDEO_FPS | 当前流媒体的视频帧率 |
NET_STATUS_VIDEO_BITRATE | 当前流媒体的视频码率,单位 kbps |
NET_STATUS_AUDIO_BITRATE | 当前流媒体的音频码率,单位 kbps |
NET_STATUS_CACHE_SIZE | 缓冲区(jitterbuffer)大小,缓冲区当前长度为0,说明离卡顿就不远了 |
NET_STATUS_SERVER_IP | 连接的服务器 IP |
本页内容是否解决了您的问题?