timer.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. class Timer {
  2. constructor(player) {
  3. this.player = player;
  4. window.requestAnimationFrame = (() =>
  5. window.requestAnimationFrame ||
  6. window.webkitRequestAnimationFrame ||
  7. window.mozRequestAnimationFrame ||
  8. window.oRequestAnimationFrame ||
  9. window.msRequestAnimationFrame ||
  10. function(callback) {
  11. window.setTimeout(callback, 1000 / 60);
  12. })();
  13. this.types = ['loading', 'info', 'fps'];
  14. this.init();
  15. }
  16. init() {
  17. this.types.map((item) => {
  18. if (item !== 'fps') {
  19. this[`init${item}Checker`]();
  20. }
  21. return item;
  22. });
  23. }
  24. initloadingChecker() {
  25. let lastPlayPos = 0;
  26. let currentPlayPos = 0;
  27. let bufferingDetected = false;
  28. this.loadingChecker = setInterval(() => {
  29. if (this.enableloadingChecker) {
  30. // whether the video is buffering
  31. currentPlayPos = this.player.video.currentTime;
  32. if (!bufferingDetected && currentPlayPos === lastPlayPos && !this.player.video.paused) {
  33. this.player.container.classList.add('dplayer-loading');
  34. bufferingDetected = true;
  35. }
  36. if (bufferingDetected && currentPlayPos > lastPlayPos && !this.player.video.paused) {
  37. this.player.container.classList.remove('dplayer-loading');
  38. bufferingDetected = false;
  39. }
  40. lastPlayPos = currentPlayPos;
  41. }
  42. }, 100);
  43. }
  44. initfpsChecker() {
  45. window.requestAnimationFrame(() => {
  46. if (this.enablefpsChecker) {
  47. this.initfpsChecker();
  48. if (!this.fpsStart) {
  49. this.fpsStart = new Date();
  50. this.fpsIndex = 0;
  51. } else {
  52. this.fpsIndex++;
  53. const fpsCurrent = new Date();
  54. if (fpsCurrent - this.fpsStart > 1000) {
  55. this.player.infoPanel.fps((this.fpsIndex / (fpsCurrent - this.fpsStart)) * 1000);
  56. this.fpsStart = new Date();
  57. this.fpsIndex = 0;
  58. }
  59. }
  60. } else {
  61. this.fpsStart = 0;
  62. this.fpsIndex = 0;
  63. }
  64. });
  65. }
  66. initinfoChecker() {
  67. this.infoChecker = setInterval(() => {
  68. if (this.enableinfoChecker) {
  69. this.player.infoPanel.update();
  70. }
  71. }, 1000);
  72. }
  73. enable(type) {
  74. this[`enable${type}Checker`] = true;
  75. if (type === 'fps') {
  76. this.initfpsChecker();
  77. }
  78. }
  79. disable(type) {
  80. this[`enable${type}Checker`] = false;
  81. }
  82. destroy() {
  83. this.types.map((item) => {
  84. this[`enable${item}Checker`] = false;
  85. this[`${item}Checker`] && clearInterval(this[`${item}Checker`]);
  86. return item;
  87. });
  88. }
  89. }
  90. export default Timer;