Thanks to visit codestin.com
Credit goes to github.com

Skip to content

使用mdk创建播放器时,onStateChanged、onMediaStatus、onEvent有时无法回调。 #303

@ProgramerMartin

Description

@ProgramerMartin

我在使用mdk创建自定义播放器时,当我播放一个视频并设置player.state = PlaybackState.stopped;停止后,再次播放视频时,onStateChanged、onMediaStatus、onEvent方法无法回调。
我通过mdk创建自定义播放器,是想要复用Player实例,而不是像video_player那样每次切换视频都创建新的。
麻烦看下这是个bug吗?还是我的调用方式有问题?
这是我的代码:

import 'package:flutter/material.dart';
import 'package:fvp/mdk.dart';

class MdkController {
  late Player player;
  final ValueNotifier<int?> textureId = ValueNotifier<int?>(null);

  MdkController() {
    player = Player();
    player.onStateChanged((PlaybackState oldValue, PlaybackState newValue) {
      print(' oldValue = $oldValue \n newValue = $newValue');
    });
    player.onMediaStatus((MediaStatus oldValue, MediaStatus newValue) {
      print(
        'mediaStatus = $newValue \n isEnd =  ${newValue.test(MediaStatus.end)}',
      );
      return true;
    });
    player.onEvent((MediaEvent val) {
      print('MediaEvent = ${val.detail} ${val.category}');
    });
  }

  // 播放
  play(
    String uri, {
    MediaType? type,
    Map<String, String>? headers,
    bool autoPlay = true,
  }) async {
    if (player.state != PlaybackState.stopped) {
      player.state = PlaybackState.stopped;
    }
    player.waitFor(PlaybackState.stopped);

    if (headers != null && headers.isNotEmpty) {
      String setHeaders = '';
      headers.forEach((key, value) {
        setHeaders += '$key: $value\r\n';
      });
      player.setProperty('avio.headers', setHeaders);
    }

    player.media = uri;

    player.loop = 0;

    int ret = await player.prepare(
      // position: 0,
      // flags: SeekFlag(SeekFlag.fromStart),
    );
    if (ret < 0) {
      print('prepare < 0 $ret');
      return;
    }

    textureId.value = await player.updateTexture();
    if (textureId.value == null || textureId.value! < 0) {
      print('textureId < 0  ${textureId.value}');
      return;
    }

    if (autoPlay) {
      start();
    }
  }

  // 停止
  stop() {
    player.state = PlaybackState.stopped;
  }

  // 暂停
  pause() {
    player.state = PlaybackState.paused;
  }

  // 开始
  start() {
    player.state = PlaybackState.playing;
  }

  // 播放位置
  seek(Duration position) {
    player.seek(
      position: position.inMilliseconds,
      flags: SeekFlag(SeekFlag.fromStart),
    );
  }

  // 快进位置
  speek(Duration position) {
    player.seek(
      position: position.inMilliseconds,
      flags: SeekFlag(SeekFlag.fromNow),
    );
  }

  void dispose() {
    player.dispose();
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions