VideoPlayer.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <template>
  2. <view class="video-container">
  3. <!-- 使用uniapp的video组件 -->
  4. <video
  5. :src="src"
  6. :controls="controls"
  7. :autoplay="autoplay"
  8. :loop="loop"
  9. :muted="muted"
  10. :initial-time="initialTime"
  11. :duration="duration"
  12. :direction="direction"
  13. :show-fullscreen-btn="showFullscreenBtn"
  14. :show-play-btn="showPlayBtn"
  15. :show-center-play-btn="showCenterPlayBtn"
  16. :enable-progress-gesture="enableProgressGesture"
  17. :object-fit="objectFit"
  18. :poster="poster"
  19. :show-mute-btn="showMuteBtn"
  20. :title="title"
  21. :play-btn-position="playBtnPosition"
  22. :enable-play-gesture="enablePlayGesture"
  23. :auto-pause-if-navigate="autoPauseIfNavigate"
  24. :auto-pause-if-open-native="autoPauseIfOpenNative"
  25. :vslide-gesture="vslideGesture"
  26. :vslide-gesture-in-fullscreen="vslideGestureInFullscreen"
  27. :style="videoStyle"
  28. @play="onPlay"
  29. @pause="onPause"
  30. @ended="onEnded"
  31. @timeupdate="onTimeUpdate"
  32. @fullscreenchange="onFullscreenChange"
  33. @waiting="onWaiting"
  34. @error="onError"
  35. @progress="onProgress"
  36. ></video>
  37. </view>
  38. </template>
  39. <script>
  40. export default {
  41. name: 'VideoPlayer',
  42. props: {
  43. // 视频源地址
  44. src: {
  45. type: String,
  46. required: true
  47. },
  48. // 是否显示默认播放控件
  49. controls: {
  50. type: Boolean,
  51. default: true
  52. },
  53. // 是否自动播放
  54. autoplay: {
  55. type: Boolean,
  56. default: false
  57. },
  58. // 是否循环播放
  59. loop: {
  60. type: Boolean,
  61. default: false
  62. },
  63. // 是否静音播放
  64. muted: {
  65. type: Boolean,
  66. default: false
  67. },
  68. // 指定视频初始播放位置
  69. initialTime: {
  70. type: Number,
  71. default: 0
  72. },
  73. // 指定视频时长
  74. duration: {
  75. type: Number,
  76. default: 0
  77. },
  78. // 设置全屏时视频的方向
  79. direction: {
  80. type: Number,
  81. default: 0
  82. },
  83. // 是否显示全屏按钮
  84. showFullscreenBtn: {
  85. type: Boolean,
  86. default: true
  87. },
  88. // 是否显示播放按钮
  89. showPlayBtn: {
  90. type: Boolean,
  91. default: true
  92. },
  93. // 是否显示视频中间的播放按钮
  94. showCenterPlayBtn: {
  95. type: Boolean,
  96. default: true
  97. },
  98. // 是否开启控制进度的手势
  99. enableProgressGesture: {
  100. type: Boolean,
  101. default: true
  102. },
  103. // 当视频大小与 video 容器大小不一致时,视频的表现形式
  104. objectFit: {
  105. type: String,
  106. default: 'contain'
  107. },
  108. // 视频封面的图片网络资源地址
  109. poster: {
  110. type: String,
  111. default: ''
  112. },
  113. // 是否显示静音按钮
  114. showMuteBtn: {
  115. type: Boolean,
  116. default: false
  117. },
  118. // 视频的标题
  119. title: {
  120. type: String,
  121. default: ''
  122. },
  123. // 播放按钮的位置
  124. playBtnPosition: {
  125. type: String,
  126. default: 'bottom'
  127. },
  128. // 是否开启播放手势
  129. enablePlayGesture: {
  130. type: Boolean,
  131. default: false
  132. },
  133. // 当跳转到其它小程序页面时,是否自动暂停本页面的视频
  134. autoPauseIfNavigate: {
  135. type: Boolean,
  136. default: true
  137. },
  138. // 当跳转到其它微信原生页面时,是否自动暂停本页面的视频
  139. autoPauseIfOpenNative: {
  140. type: Boolean,
  141. default: true
  142. },
  143. // 在非全屏模式下,是否开启亮度与音量调节手势
  144. vslideGesture: {
  145. type: Boolean,
  146. default: false
  147. },
  148. // 在全屏模式下,是否开启亮度与音量调节手势
  149. vslideGestureInFullscreen: {
  150. type: Boolean,
  151. default: true
  152. },
  153. // 视频容器的样式
  154. videoStyle: {
  155. type: Object,
  156. default: () => ({})
  157. }
  158. },
  159. methods: {
  160. // 播放事件
  161. onPlay(e) {
  162. this.$emit('play', e)
  163. },
  164. // 暂停事件
  165. onPause(e) {
  166. this.$emit('pause', e)
  167. },
  168. // 播放结束事件
  169. onEnded(e) {
  170. this.$emit('ended', e)
  171. },
  172. // 播放进度变化事件
  173. onTimeUpdate(e) {
  174. this.$emit('timeupdate', e)
  175. },
  176. // 全屏变化事件
  177. onFullscreenChange(e) {
  178. this.$emit('fullscreenchange', e)
  179. },
  180. // 视频缓冲事件
  181. onWaiting(e) {
  182. this.$emit('waiting', e)
  183. },
  184. // 视频错误事件
  185. onError(e) {
  186. this.$emit('error', e)
  187. },
  188. // 加载进度事件
  189. onProgress(e) {
  190. this.$emit('progress', e)
  191. }
  192. }
  193. }
  194. </script>
  195. <style lang="scss" scoped>
  196. .video-container {
  197. width: 100%;
  198. height: 100%;
  199. video {
  200. width: 100%;
  201. height: 100%;
  202. }
  203. }
  204. </style>