1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- import 'dart:io';
- import 'dart:isolate';
- import 'dart:typed_data';
- import 'package:fis_vid/data_host/interface/data_host.dart';
- import 'package:fis_vid/data_host/vid_download.dart';
- import 'package:flutter/painting.dart';
- import 'package:flutter/rendering.dart';
- import 'package:image/image.dart' as img;
- import 'package:path_provider/path_provider.dart';
- import 'package:vid/us/vid_us_image.dart';
- import 'package:fis_vid/processors/base.dart';
- import 'package:vid/us/vid_us_image_data.dart';
- import 'package:vid/us/vid_us_probe.dart';
- class VidDataHost implements VidDataHostInterface {
- VidDataHost(this.url);
- static const _kStorageDir = 'ExamRecords';
- VidUsImageData? _data;
- @override
- final String url;
- @override
- VidUsProbe get probe => _data!.probe;
- @override
- int get frameCount => _data!.imageCount;
- @override
- Future<VidUsImageData?> getData() async => _data;
- @override
- Future<VidDataHostLoadInfo?> load() async {
- final vidFileBuffer = await _loadVidFile(url);
- if (vidFileBuffer == null) return null;
- _data = VidUsImageData(vidFileBuffer);
- return VidDataHostLoadInfo(probe);
- }
- @override
- Future<VidUsImage> getFrame<TProcessor extends VidFrameProcessor>(
- int index, {
- List<TProcessor>? processors,
- }) async {
- if (_data == null) {
- throw Exception(
- "[VidDataHost] getFrame: must call load first and data is not null.");
- }
- final frame = _data!.getImage(index);
- return VidFrameProcessor.processFrame(frame, processors);
- }
- @override
- Future<void> release() async {
- _data = null;
- }
- Future<Uint8List?> _loadVidFile(String url) async {
- try {
- final name = url.split('/').last.split('.').first;
- final fileName = '$name.dat';
- final cachePath = await _getStoragePath(fileName);
- var file = File(cachePath);
- if (await file.exists()) {
- final buffer = await file.readAsBytes();
- return buffer;
- } else {
- final buffer = await VidFileDownloader.download(url);
- if (buffer != null) {
- file = await file.create(recursive: true);
- file.writeAsBytes(buffer);
- }
- return buffer;
- }
- } catch (e) {
- return null;
- }
- }
- Future<String> _getStoragePath(String fileName) async {
- Directory? dir;
- if (Platform.isAndroid) {
- dir = await getExternalStorageDirectory();
- }
- dir ??= await getApplicationDocumentsDirectory();
- return "${dir.path}/$_kStorageDir/$fileName";
- }
- }
|