|
@@ -1,9 +1,11 @@
|
|
|
+import 'dart:async';
|
|
|
import 'dart:collection';
|
|
|
import 'dart:typed_data';
|
|
|
+import 'dart:ui';
|
|
|
import 'package:fis_measure/view/player/controller.dart';
|
|
|
import 'package:fis_measure/view/player/enums.dart';
|
|
|
import 'package:fis_measure/view/player/events.dart';
|
|
|
-import 'package:flutter/material.dart';
|
|
|
+import 'package:flutter/material.dart' hide Image;
|
|
|
import 'package:vid_player_demo/utils/image_holder.dart';
|
|
|
import 'package:vid_player_demo/utils/utils.dart';
|
|
|
import 'dart:ui' as ui;
|
|
@@ -48,6 +50,7 @@ class _VidCanvasPlayerState extends State<VidCanvasPlayer> {
|
|
|
if (oldWidget.controller != widget.controller) {
|
|
|
throw UnsupportedError("[VidTestPlayer] unsupport replace controller.");
|
|
|
}
|
|
|
+ // image?.dispose(); //TODO 不知是否生效
|
|
|
super.didUpdateWidget(oldWidget);
|
|
|
}
|
|
|
|
|
@@ -69,21 +72,53 @@ class _VidCanvasPlayerState extends State<VidCanvasPlayer> {
|
|
|
}
|
|
|
|
|
|
void onFrameChanged(VidPlayerFrameIndexChangeEvent e) {
|
|
|
- loadFrame(e.bytes);
|
|
|
+ loadFrame(e);
|
|
|
}
|
|
|
|
|
|
- void loadFrame(Uint8List bytes) async {
|
|
|
+ void loadFrame(VidPlayerFrameIndexChangeEvent e) async {
|
|
|
// List<StackTrace>? debugList = image?.debugGetOpenHandleStackTraces();
|
|
|
// print("${DateTime.now()} Load frame \n ${debugList.toString()}");
|
|
|
// image?.dispose();
|
|
|
- image = await decodeImageFromList(bytes);
|
|
|
- print("${DateTime.now()} Load frame ${image?.width} x ${image?.height}");
|
|
|
+
|
|
|
+ image = await _loadImage(e.bytes);
|
|
|
+ // image = await decodeImageFromList(e.bytes);
|
|
|
+
|
|
|
+ /// 输出数组的前20位数字
|
|
|
+ // print(
|
|
|
+ // "${e.width} x ${e.height} ${e.bytes.length} ${e.bytes.sublist(3000, 3020)}");
|
|
|
+ // print("${DateTime.now()} Load frame ${image?.width} x ${image?.height}");
|
|
|
// holder = MyImageHolder(image!.clone());
|
|
|
- image?.dispose();
|
|
|
- // setState(() {});
|
|
|
+ setState(() {});
|
|
|
+ // image?.dispose();
|
|
|
+ // image?.dispose();
|
|
|
+
|
|
|
countCurFPS();
|
|
|
}
|
|
|
|
|
|
+ Future<Image> _loadImage(Uint8List bytes) async {
|
|
|
+ final Completer<Image> completer = Completer<Image>();
|
|
|
+ decodeVidFromList(bytes, (Image image) => completer.complete(image));
|
|
|
+
|
|
|
+ // ui.decodeImageFromList(bytes, (Image image) => completer.complete(image));
|
|
|
+
|
|
|
+ return completer.future;
|
|
|
+ }
|
|
|
+
|
|
|
+ void decodeVidFromList(Uint8List bytes, ImageDecoderCallback callback) async {
|
|
|
+ ImmutableBuffer.fromUint8List(bytes).then((ImmutableBuffer buffer) async {
|
|
|
+ final ImageDescriptor descriptor = await ImageDescriptor.encoded(buffer);
|
|
|
+ descriptor.instantiateCodec().then((Codec codec) {
|
|
|
+ final Future<FrameInfo> frameInfo = codec.getNextFrame();
|
|
|
+ codec.dispose();
|
|
|
+ return frameInfo;
|
|
|
+ }).then((FrameInfo frameInfo) {
|
|
|
+ buffer.dispose();
|
|
|
+ descriptor.dispose();
|
|
|
+ return callback(frameInfo.image);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
void updateFrame() {
|
|
|
setState(() {});
|
|
|
}
|
|
@@ -141,12 +176,12 @@ class _VidCanvasPlayerState extends State<VidCanvasPlayer> {
|
|
|
if (image != null) {
|
|
|
final size = MediaQuery.of(context).size;
|
|
|
return CustomPaint(
|
|
|
- painter: VidPainter(holder: holder!),
|
|
|
+ painter: VidPainter(image: image!),
|
|
|
isComplex: false, //是否为复杂图像(true会缓存)
|
|
|
size: size,
|
|
|
);
|
|
|
} else {
|
|
|
- return Container();
|
|
|
+ return const Text("No holder");
|
|
|
}
|
|
|
}
|
|
|
|