in lib/aliplayer_widget_controller.dart [184:346]
void _initializePlayer() {
logi("Initializing player");
/// 1、创建播放器
_aliPlayer = FlutterAliPlayerFactory.createAliPlayer();
_playerUniqueId = _aliPlayer.playerId;
_playerLog("[api][lifecycle][create]");
/// 2、设置播放器事件回调
// 设置播放器事件回调,准备完成事件
_aliPlayer.setOnPrepared((String playerId) {
_isPrepared = true;
int cost = DateTime.now().millisecondsSinceEpoch - _prepareStartTime;
_playerLog("[cbk][onPrepared]: costTime: $cost");
// 创建清晰度信息
Future.microtask(() => _createTrackInfoWhenPrepared());
// 创建缩略图(方式1)
Future.microtask(() => _createThumbnailWhenPrepared());
});
// 设置播放器事件回调,首帧显示事件
_aliPlayer.setOnRenderingStart((String playerId) async {
int cost = DateTime.now().millisecondsSinceEpoch - _prepareStartTime;
_playerLog("[cbk][renderingStart]: costTime: $cost");
// 更新渲染状态
isRenderedNotifier.value = true;
final totalDuration = await _aliPlayer.getDuration();
if (totalDuration == 0) {
return;
}
totalDurationNotifier.value = Duration(milliseconds: totalDuration);
});
// 设置播放器事件回调,播放完成事件
_aliPlayer.setOnCompletion((String playerId) {
_isPrepared = false;
_prepareStartTime = 0;
});
// 设置视频大小变化回调
_aliPlayer.setOnVideoSizeChanged((
int width,
int height,
int? rotation,
String playerId,
) async {
_playerLog("[cbk][videoSizeChanged]: $width, $height, $rotation");
// 更新视频尺寸
_updateVideoSize();
});
// 设置视频当前播放位置回调
_aliPlayer.setOnInfo(
(int? infoCode, int? extraValue, String? extraMsg, String playerId) {
if (infoCode == 1) {
// _playerLog("[cbk][bufferedPosition]: $extraValue, $extraMsg");
final bufferedPosition = extraValue ?? 0;
bufferedPositionNotifier.value =
Duration(milliseconds: bufferedPosition);
} else if (infoCode == 2) {
// _playerLog("[cbk][currentPosition]: $extraValue, $extraMsg");
final currentPosition = extraValue ?? 0;
currentPositionNotifier.value = Duration(milliseconds: currentPosition);
}
});
// 设置获取 track 信息回调
_aliPlayer.setOnTrackReady((String playerId) async {
_playerLog("[cbk][setOnTrackReady]");
// 更新视频尺寸
_updateVideoSize();
// 创建清晰度信息
Future.microtask(() => _createTrackInfoWhenPrepared());
// 创建缩略图(方式2)
Future.microtask(() => _createThumbnailWhenTrackReady());
});
// 设置track切换完成回调
_aliPlayer.setOnTrackChanged((dynamic value, String playerId) {
final trackInfoList = trackInfoListNotifier.value;
final selectedTrackInfo = TrackInfoUtil.getTrackInfoByIndex(
trackInfoList,
value["trackIndex"],
);
// 如果没有找到对应的清晰度信息,则不处理
if (selectedTrackInfo == null) {
return;
}
// 更新当前清晰度信息
currentTrackInfoNotifier.value = selectedTrackInfo;
// 显示提示信息
String quality = TrackInfoUtil.getQuality(selectedTrackInfo);
SnackBarUtil.success(_context, "selectTrack: $quality");
});
// 设置错误代理回调
_aliPlayer.setOnError((
int errorCode,
String? errorExtra,
String? errorMsg,
String playerId,
) {
_playerLog("[cbk][error]: errorCode: $errorCode, errorMsg: $errorMsg");
playErrorNotifier.value = {errorCode: errorMsg};
// If occurs error, update video size as default.
if (videoSizeNotifier.value == Size.zero) {
final videoSize = ScreenUtil.calculateDefaultDimensions(_context);
videoSizeNotifier.value = videoSize;
}
});
// 设置播放器状态改变回调
_aliPlayer.setOnStateChanged((int newState, String playerId) {
final oldState = playStateNotifier.value;
_playerLog("[cbk][stateChanged]: state: $oldState->$newState");
// Update play state
playStateNotifier.value = newState;
});
// 设置缩略图代理回调
_aliPlayer.setOnThumbnailPreparedListener(
preparedSuccess: (playerId) {
_playerLog("[cbk][thumbnailPrepared]: preparedSuccess, $playerId");
_thumbnailSuccess = true;
},
preparedFail: (playerId) {
_playerLog("[cbk][thumbnailPrepared]: preparedFail, $playerId");
_thumbnailSuccess = false;
},
);
// 设置缩略图获取代理回调
_aliPlayer.setOnThumbnailGetListener(
onThumbnailGetSuccess: (bitmap, range, playerId) {
var provider = MemoryImage(bitmap);
thumbnailNotifier.value = provider;
},
onThumbnailGetFail: (playerId) {},
);
/// 3. 其它配置
// IPlayer.ScaleMode.SCALE_ASPECT_FILL
_aliPlayer.setScalingMode(1);
logi("Player initialization completed.");
}