-
-
Notifications
You must be signed in to change notification settings - Fork 65
Open
Description
我在使用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
Labels
No labels