streaming_progress_bar.dart 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import 'package:audio_video_progress_bar/audio_video_progress_bar.dart';
  2. import 'package:fis_common/logger/logger.dart';
  3. import 'package:fis_measure/interfaces/process/player/play_controller.dart';
  4. import 'package:fis_measure/view/player/controller.dart';
  5. import 'package:fis_measure/view/player/events.dart';
  6. import 'package:fis_vid/data_channel/progress_info.dart';
  7. import 'package:flutter/material.dart';
  8. import 'package:get/get.dart';
  9. import 'package:fis_measure/view/mobile_view/widgets/throttle.dart' as utils;
  10. class StreamingProgressBar extends StatefulWidget {
  11. const StreamingProgressBar({super.key});
  12. @override
  13. State<StatefulWidget> createState() => _StreamingProgressBarState();
  14. }
  15. class _StreamingProgressBarState extends State<StreamingProgressBar> {
  16. final controller = Get.find<IPlayerController>() as VidPlayerController;
  17. int totalCount = 0;
  18. int currentIndex = 0;
  19. double bufferedProgress = 0;
  20. int get bufferedCount {
  21. int count = (bufferedProgress * totalCount).toInt();
  22. final currentPlayedIndex = controller.currentFrame?.index ?? 0;
  23. if (count < currentPlayedIndex) {
  24. // 缓冲进度至少需要追平播放(可播放)进度
  25. count = currentPlayedIndex;
  26. }
  27. return count;
  28. }
  29. @override
  30. void initState() {
  31. WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
  32. controller.eventHandler.addListener(_onControllerEvent);
  33. controller.dataChannel.downloadProgressChanged
  34. .addListener(_onDownloadProgressChanged);
  35. });
  36. super.initState();
  37. }
  38. @override
  39. void dispose() {
  40. controller.dataChannel.downloadProgressChanged
  41. .removeListener(_onDownloadProgressChanged);
  42. controller.eventHandler.removeListener(_onControllerEvent);
  43. super.dispose();
  44. }
  45. @override
  46. Widget build(BuildContext context) {
  47. return ProgressBar(
  48. progress: Duration(milliseconds: currentIndex),
  49. total: Duration(milliseconds: totalCount),
  50. buffered: Duration(milliseconds: bufferedCount),
  51. // baseBarColor: Colors.blueGrey,
  52. // progressBarColor: Colors.blue,
  53. // bufferedBarColor: Colors.pink[300],
  54. barHeight: 12,
  55. thumbRadius: 10,
  56. thumbColor: Colors.white,
  57. timeLabelLocation: TimeLabelLocation.none,
  58. onSeek: (timeStamp) {
  59. final newIndex = timeStamp.inMilliseconds;
  60. if (newIndex != currentIndex) {
  61. setState(() {
  62. currentIndex = newIndex;
  63. });
  64. controller.locateTo(currentIndex);
  65. }
  66. },
  67. onDragUpdate: (details) {
  68. final newIndex = details.timeStamp.inMilliseconds;
  69. if (newIndex != currentIndex) {
  70. setState(() {
  71. currentIndex = newIndex;
  72. });
  73. utils.throttle(() {
  74. controller.locateTo(currentIndex);
  75. }, 'onDragTo', 80);
  76. // controller.locateTo(currentIndex);
  77. }
  78. },
  79. onDragStart: (details) {
  80. //手动拖动时移除事件监听【避免重复setstate】
  81. controller.eventHandler.removeListener(_onControllerEvent);
  82. },
  83. onDragEnd: () {
  84. controller.eventHandler.addListener(_onControllerEvent);
  85. },
  86. );
  87. }
  88. void _update() {
  89. /// 第一帧下标为0 ,所以 totalFramesCount 要减1
  90. totalCount = controller.totalFramesCount - 1;
  91. currentIndex = controller.currentFrameIndex;
  92. if (mounted) {
  93. setState(() {});
  94. }
  95. }
  96. void _onDownloadProgressChanged(Object sender, VidDownloadProgressInfo e) {
  97. if (e.progress == 1) {
  98. bufferedProgress = 1;
  99. } else {
  100. bufferedProgress = _calcRealFramesBufferPercent();
  101. }
  102. if (mounted) {
  103. setState(() {});
  104. }
  105. }
  106. void _onControllerEvent(Object sender, VidPlayerEvent e) {
  107. if (e is VidPlayerFrameIndexChangeEvent) {
  108. if (currentIndex != e.index) {
  109. _update();
  110. }
  111. }
  112. }
  113. double _calcRealFramesBufferPercent() {
  114. final channel = controller.dataChannel;
  115. final int fileSize = channel.getFileSize();
  116. final int bufferredSize = channel.getBufferSize();
  117. final int framesTotalSize = fileSize - controller.vidHeaderSize;
  118. final int framesBufferredSize = bufferredSize - controller.vidHeaderSize;
  119. double percent = framesBufferredSize / framesTotalSize;
  120. return percent;
  121. }
  122. }