视频播放器仓库

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. /**
  2. * These are custom helper methods that are not native
  3. * to the HTMLMediaElement API. Pass in the native
  4. * Video element, state and optional desired value to
  5. * set. To be primarily used in `mapVideoElToProps`.
  6. */
  7. export const togglePause = (videoEl, { paused }) => {
  8. const videoTitleEl = document.getElementById("videoTitle")
  9. paused ? videoEl.play() : videoEl.pause();
  10. if (videoTitleEl) {
  11. videoTitleEl.style.display = paused ? 'none' : '';
  12. }
  13. };
  14. export const setCurrentTime = (videoEl, state, value) => {
  15. videoEl.currentTime = value;
  16. };
  17. export const setVolume = (videoEl, state, value) => {
  18. videoEl.muted = false;
  19. videoEl.volume = value;
  20. };
  21. export const mute = (videoEl) => {
  22. videoEl.muted = true;
  23. };
  24. export const unmute = (videoEl) => {
  25. videoEl.muted = false;
  26. };
  27. export const toggleMute = (videoEl, { volume, muted }) => {
  28. if (muted || volume <= 0) {
  29. if (volume <= 0) {
  30. videoEl.volume = 1;
  31. }
  32. videoEl.muted = false;
  33. } else {
  34. videoEl.muted = true;
  35. }
  36. };
  37. export const toggleFullscreen = (videoEl, callback) => {
  38. videoEl.requestFullScreen =
  39. videoEl.requestFullscreen
  40. || videoEl.msRequestFullscreen
  41. || videoEl.mozRequestFullScreen
  42. || videoEl.webkitRequestFullscreen;
  43. document.exitFullscreen =
  44. document.exitFullscreen
  45. || document.msExitFullscreen
  46. || document.mozCancelFullScreen
  47. || document.webkitExitFullscreen;
  48. const fullscreenElement =
  49. document.fullscreenElement
  50. || document.msFullscreenElement
  51. || document.mozFullScreenElement
  52. || document.webkitFullscreenElement;
  53. if (fullscreenElement === videoEl) {
  54. document.querySelector('video').style.maxHeight = '100%';
  55. window.fullscreen = false;
  56. document.exitFullscreen();
  57. } else {
  58. document.querySelector('video').style.maxHeight = '100%';
  59. window.fullscreen = true;
  60. videoEl.requestFullScreen();
  61. }
  62. };
  63. export const showTrack = ({ textTracks }, track) => {
  64. hideTracks({ textTracks });
  65. track.mode = track.SHOWING || 'showing';
  66. };
  67. export const hideTracks = ({ textTracks }) => {
  68. for (var i = 0; i < textTracks.length; i++) {
  69. textTracks[i].mode = textTracks[i].DISABLED || 'disabled';
  70. }
  71. };
  72. export const toggleTracks = (() => {
  73. let previousTrack;
  74. return ({ textTracks }) => {
  75. let currentTrack = [...textTracks]
  76. .filter((track) => track.mode === track.SHOWING || track.mode === 'showing')[0];
  77. if (currentTrack) {
  78. hideTracks({ textTracks });
  79. previousTrack = currentTrack;
  80. } else {
  81. showTrack({ textTracks }, previousTrack || textTracks[0]);
  82. }
  83. }
  84. })();
  85. export const showSpeed = (videoEl, state, speed) => {
  86. let playbackrates = state.playbackrates;
  87. hideSpeeds(videoEl, { playbackrates });
  88. speed.mode = speed.SHOWING || 'showing';
  89. if (videoEl.dataset) {
  90. videoEl.dataset['playbackrates'] = JSON.stringify(playbackrates);
  91. } else {
  92. videoEl.setAttribute("data-playbackrates", JSON.stringify(playbackrates));
  93. }
  94. videoEl.playbackRate = speed.id;
  95. };
  96. export const hideSpeeds = (videoEl, state) => {
  97. let playbackrates = state.playbackrates;
  98. for (var i = 0; i < playbackrates.length; i++) {
  99. playbackrates[i].mode = playbackrates[i].DISABLED || 'disabled';
  100. }
  101. };
  102. export const toggleSpeeds = (() => {
  103. let previousSpeed;
  104. return (videoEl, state) => {
  105. let playbackrates = state.playbackrates;
  106. let currentSpeed = playbackrates
  107. .filter((item) => item.mode === 'showing')[0];
  108. if (currentSpeed) {
  109. hideSpeeds(videoEl, { playbackrates });
  110. previousSpeed = currentSpeed;
  111. } else {
  112. showSpeed(videoEl, { playbackrates }, previousSpeed || playbackrates[0]);
  113. }
  114. }
  115. })();
  116. /**
  117. * Custom getter methods that are commonly used
  118. * across video layouts. To be primarily used in
  119. * `mapStateToProps`
  120. */
  121. export const getPercentageBuffered = ({ buffered, duration }) =>
  122. buffered && buffered.length && buffered.end(buffered.length - 1) / duration * 100 || 0;
  123. export const getPercentagePlayed = ({ currentTime, duration }) =>
  124. currentTime / duration * 100;