data_host.dart 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import 'dart:io';
  2. import 'dart:isolate';
  3. import 'dart:typed_data';
  4. import 'package:fis_vid/data_host/interface/data_host.dart';
  5. import 'package:fis_vid/data_host/vid_download.dart';
  6. import 'package:flutter/painting.dart';
  7. import 'package:flutter/rendering.dart';
  8. import 'package:image/image.dart' as img;
  9. import 'package:path_provider/path_provider.dart';
  10. import 'package:vid/us/vid_us_image.dart';
  11. import 'package:fis_vid/processors/base.dart';
  12. import 'package:vid/us/vid_us_image_data.dart';
  13. import 'package:vid/us/vid_us_probe.dart';
  14. class VidDataHost implements VidDataHostInterface {
  15. VidDataHost(this.url);
  16. static const _kStorageDir = 'ExamRecords';
  17. VidUsImageData? _data;
  18. @override
  19. final String url;
  20. @override
  21. VidUsProbe get probe => _data!.probe;
  22. @override
  23. int get frameCount => _data!.imageCount;
  24. @override
  25. Future<VidUsImageData?> getData() async => _data;
  26. @override
  27. Future<VidDataHostLoadInfo?> load() async {
  28. final vidFileBuffer = await _loadVidFile(url);
  29. if (vidFileBuffer == null) return null;
  30. _data = VidUsImageData(vidFileBuffer);
  31. return VidDataHostLoadInfo(probe);
  32. }
  33. @override
  34. Future<VidUsImage> getFrame<TProcessor extends VidFrameProcessor>(
  35. int index, {
  36. List<TProcessor>? processors,
  37. }) async {
  38. if (_data == null) {
  39. throw Exception(
  40. "[VidDataHost] getFrame: must call load first and data is not null.");
  41. }
  42. final frame = _data!.getImage(index);
  43. return VidFrameProcessor.processFrame(frame, processors);
  44. }
  45. @override
  46. Future<void> release() async {
  47. _data = null;
  48. }
  49. Future<Uint8List?> _loadVidFile(String url) async {
  50. try {
  51. final name = url.split('/').last.split('.').first;
  52. final fileName = '$name.dat';
  53. final cachePath = await _getStoragePath(fileName);
  54. var file = File(cachePath);
  55. if (await file.exists()) {
  56. final buffer = await file.readAsBytes();
  57. return buffer;
  58. } else {
  59. final buffer = await VidFileDownloader.download(url);
  60. if (buffer != null) {
  61. file = await file.create(recursive: true);
  62. file.writeAsBytes(buffer);
  63. }
  64. return buffer;
  65. }
  66. } catch (e) {
  67. return null;
  68. }
  69. }
  70. Future<String> _getStoragePath(String fileName) async {
  71. Directory? dir;
  72. if (Platform.isAndroid) {
  73. dir = await getExternalStorageDirectory();
  74. }
  75. dir ??= await getApplicationDocumentsDirectory();
  76. return "${dir.path}/$_kStorageDir/$fileName";
  77. }
  78. }