定制app开发Vue视频播放组件(Video)

定制app开发可自定义设置以下属性:

  • 视频文件url(videoUrl),必传

  • 视频封面url(videoCover),默认为null

  • 宽度(width),默认为800px

  • 定制app开发视频播放器高度(height),默认为450px

  • 定制app开发视频就绪后是否马上播放(autoplay),默认为false

  • 定制app开发是否向用户显示控件,定制app开发比如是否向用户显示控件,比如进度条,全屏等(controls),默认为true

  • 视频播放完成后,是否循环播放(loop),默认为false

  • 是否静音(muted),默认为false

  • 是否在页面加载后载入视频(preload)如果设置了autoplay属性,则preload将被忽略,默认为auto // auto:一旦页面加载,则开始加载视频; metadata:当页面加载后仅加载视频的元数据 none:页面加载后不应加载视频

  • 中间播放暂停按钮的边长(playWidth),默认为96px

效果如下图:

①创建视频播放组件VideoPlay.vue: 

  1. <template>
  2. <div :class="['m-video', { hover: !originPlay }]" :style="`width: ${width}px; height: ${height}px;`">
  3. <video
  4. ref="veo"
  5. :class="{ cursor: !originPlay }"
  6. :style="`object-fit: ${zoom};`"
  7. :src="videoUrl"
  8. :poster="videoCover"
  9. :width="width"
  10. :height="height"
  11. :autoplay="autoplay"
  12. :controls="!originPlay&&controls"
  13. :loop="loop"
  14. :muted="autoplay || muted"
  15. :preload="preload">
  16. 您的浏览器不支持video标签。
  17. </video>
  18. <svg :class="[vplay ? 'play cursor':'hidden']" :style="`width: ${playWidth}px; height: ${playWidth}px;`" @click="clickPlay" viewBox="0 0 24 24">
  19. <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4.75 6.75C4.75 5.64543 5.64543 4.75 6.75 4.75H17.25C18.3546 4.75 19.25 5.64543 19.25 6.75V17.25C19.25 18.3546 18.3546 19.25 17.25 19.25H6.75C5.64543 19.25 4.75 18.3546 4.75 17.25V6.75Z"></path>
  20. <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M15.25 12L9.75 8.75V15.25L15.25 12Z"></path>
  21. </svg>
  22. </div>
  23. </template>
  24. <script>
  25. export default {
  26. name: 'Video',
  27. props: {
  28. videoUrl: { // 视频文件url
  29. type: String,
  30. default: null,
  31. required: true
  32. },
  33. videoCover: { // 视频封面url
  34. type: String,
  35. default: null
  36. },
  37. width: { // 视频播放器宽度
  38. type: Number,
  39. default: 800
  40. },
  41. height: { // 视频播放器高度
  42. type: Number,
  43. default: 450
  44. },
  45. /*
  46. 由于目前在最新版的Chrome浏览器(以及所有以Chromium为内核的浏览器)中,
  47. 已不再允许自动播放音频和视频。就算你为video或audio标签设置了autoplay
  48. 属性也一样不能自动播放!
  49. 本组件解决方法:设置视频 autoplay 时,自动将视频设置为静音 muted: true 即可实现自
  50. 动播放,然后用户可以使用控制栏开启声音,类似某宝商品自动播放的宣传视频逻辑
  51. */
  52. autoplay: { // 视频就绪后是否马上播放
  53. type: Boolean,
  54. default: false
  55. },
  56. controls: { // 是否向用户显示控件,比如进度条,全屏
  57. type: Boolean,
  58. default: true
  59. },
  60. loop: { // 视频播放完成后,是否循环播放
  61. type: Boolean,
  62. default: false
  63. },
  64. muted: { // 是否静音
  65. type: Boolean,
  66. default: false
  67. },
  68. preload: { // 是否在页面加载后载入视频,如果设置了autoplay属性,则preload将被忽略;
  69. type: String,
  70. default: 'auto' // auto:一旦页面加载,则开始加载视频; metadata:当页面加载后仅加载视频的元数据 none:页面加载后不应加载视频
  71. },
  72. playWidth: { // 中间播放暂停按钮的边长
  73. type: Number,
  74. default: 96
  75. },
  76. zoom: { // video的poster默认图片和视频内容缩放规则
  77. type: String,
  78. default: 'none' // none:(默认)保存原有内容,不进行缩放; fill:不保持原有比例,内容拉伸填充整个内容容器; contain:保存原有比例,内容以包含方式缩放; cover:保存原有比例,内容以覆盖方式缩放
  79. }
  80. },
  81. data () {
  82. return {
  83. originPlay: true,
  84. vplay: true
  85. }
  86. },
  87. mounted () {
  88. this.$refs.veo.addEventListener('pause', this.onPause)
  89. this.$refs.veo.addEventListener('playing', this.onPlaying)
  90. if (this.autoplay) {
  91. this.vplay = false
  92. this.originPlay = false
  93. }
  94. },
  95. methods: {
  96. onPause () {
  97. this.vplay = true
  98. this.$once('hook:beforeDestroy', function () {
  99. removeEventListener('pause', this.onPause)
  100. })
  101. },
  102. onPlaying () {
  103. this.vplay = false
  104. // 自动清理自己,避免内存泄漏
  105. this.$once('hook:beforeDestroy', function () {
  106. removeEventListener('playing', this.onPlaying)
  107. })
  108. },
  109. clickPlay () {
  110. this.$refs.veo.play()
  111. this.vplay = false
  112. if (this.originPlay) {
  113. this.originPlay = false
  114. }
  115. }
  116. }
  117. }
  118. </script>
  119. <style lang="less" scoped>
  120. .m-video {
  121. display: inline-block;
  122. position: relative;
  123. background: #000;
  124. .cursor {
  125. cursor: pointer;
  126. }
  127. .play {
  128. fill: none;
  129. color: #FFF;
  130. opacity: 0.7;
  131. position: absolute;
  132. top: 0;
  133. right: 0;
  134. bottom: 0;
  135. left: 0;
  136. margin: auto;
  137. transition: opacity .3s;
  138. &:hover {
  139. opacity: 0.9;
  140. }
  141. }
  142. .hidden {
  143. display: none;
  144. }
  145. }
  146. .hover {
  147. &:hover {
  148. .play {
  149. opacity: 0.9;
  150. }
  151. }
  152. }
  153. </style>

②在要使用的页面引入:

  1. <VideoPlay
  2. videoUrl="视频链接"
  3. videoCover="封面链接"
  4. :width="800"
  5. :height="450"
  6. :autoplay="false"
  7. :controls="true"
  8. :loop="false"
  9. :muted="false"
  10. preload="auto"
  11. :playWidth="96"
  12. zoom="none"
  13. />
  14. import VideoPlay from '@/components/VideoPlay'
  15. components: {
  16. VideoPlay
  17. }
网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发