import 'package:flutter/material.dart'; import 'package:media_kit/media_kit.dart'; import 'package:media_kit_video/media_kit_video.dart'; import '../../services/preview_player.dart'; import 'media_kit_full_player.dart' show isNonFatalMpvMessage; /// media_kit(libmpv) 기반 재생기. Windows·Android 공용. class MediaKitPreviewPlayer implements PreviewPlayer { final Player _player = Player(); late final VideoController _video = VideoController(_player, configuration: VideoControllerConfiguration( enableHardwareAcceleration: hardwareAcceleration)); final bool hardwareAcceleration; MediaKitPreviewPlayer({this.hardwareAcceleration = true}); static bool _initialized = false; /// 앱 시작 시 한 번 호출 static void ensureInitialized() { if (_initialized) return; MediaKit.ensureInitialized(); _initialized = true; } @override Stream get positionStream => _player.stream.position; @override Stream get durationStream => _player.stream.duration; @override Stream get playingStream => _player.stream.playing; @override Stream get errorStream => _player.stream.error.where((m) => !isNonFatalMpvMessage(m)); @override Duration get position => _player.state.position; @override Duration get duration => _player.state.duration; @override bool get isPlaying => _player.state.playing; @override Future open(String path) async { await _player.open(Media(path), play: false); await _player.setSubtitleTrack(SubtitleTrack.no()); } @override Future playOrPause() => _player.playOrPause(); @override Future pause() => _player.pause(); @override Future seek(Duration position) => _player.seek(position.isNegative ? Duration.zero : position); @override Future setRate(double rate) => _player.setRate(rate); @override Widget buildView() => Video( controller: _video, controls: NoVideoControls, fill: Colors.black, subtitleViewConfiguration: const SubtitleViewConfiguration(visible: false), ); @override Future dispose() => _player.dispose(); }