void _initializePlayer()

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.");
  }