vue2.0+vue-video-player

开整

  • 安装依赖
npm install vue-video-player --save
  • 1
  • 引入样式
  1. // 第一个是videoJs的样式,后一个是vue-video-player的样式,因为考虑到我其他业务组件可能也会用到视频播放,所以就放在了main.js内
  2. require('video.js/dist/video-js.css')
  3. require('vue-video-player/src/custom-theme.css')
  • 把VueVideoPlayer导入并挂在到vue上
  1. //在main.js内
  2. import VideoPlayer from 'vue-video-player'
  3. Vue.use(VideoPlayer);
  • 编写业务组件 myPlayer.vue
  1. <template>
  2. <div class="container">
  3. <div class="player">
  4. <video-player class="video-player vjs-custom-skin"
  5. ref="videoPlayer"
  6. :playsinline="true"
  7. :options="playerOptions"
  8. @play="onPlayerPlay($event)"
  9. @pause="onPlayerPause($event)"
  10. >
  11. </video-player>
  12. </div>
  13. </div>
  14. </template>
  15. <script>
  16. import { videoPlayer } from 'vue-video-player';
  17. export default {
  18. data () {
  19. return {
  20. playerOptions: {
  21. // playbackRates: [0.7, 1.0, 1.5, 2.0], //播放速度
  22. autoplay: false, //如果true,浏览器准备好时开始回放。
  23. muted: false, // 默认情况下将会消除任何音频。
  24. loop: false, // 导致视频一结束就重新开始。
  25. preload: 'auto', // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
  26. language: 'zh-CN',
  27. aspectRatio: '16:9', // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
  28. fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
  29. sources: [{
  30. type: "video/mp4",
  31. src: "http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4" //你的视频地址(必填)
  32. }],
  33. poster: "poster.jpg", //你的封面地址
  34. width: document.documentElement.clientWidth,
  35. notSupportedMessage: '此视频暂无法播放,请稍后再试', //允许覆盖Video.js无法播放媒体源时显示的默认信息。
  36. // controlBar: {
  37. // timeDivider: true,
  38. // durationDisplay: true,
  39. // remainingTimeDisplay: false,
  40. // fullscreenToggle: true //全屏按钮
  41. // }
  42. }
  43. }
  44. },
  45. components: {
  46. videoPlayer
  47. },
  48. methods: {
  49. onPlayerPlay(player) {
  50. alert("play");
  51. },
  52. onPlayerPause(player){
  53. alert("pause");
  54. },
  55. },
  56. computed: {
  57. player() {
  58. return this.$refs.videoPlayer.player
  59. }
  60. }
  61. }
  62. </script>
  63. <!-- Add "scoped" attribute to limit CSS to this component only -->
  64. <style type="text/css" scoped>
  65. .container {
  66. background-color: #efefef;
  67. min-height: 100%;
  68. }
  69. </style>

注意: 
1. video-player标签的class必须设置成“video-player vjs-custom-skin”,你引入的样式才能起作用。我刚开始做时,直接拷贝的github页的代码,那个代码的class是video-player-box。 
2. 根据videoJS Api修改属性。我这里加了一些注释,可以参考。 
3. 修改src、poster属性为你的服务器资源地址。

  • 增加hls支持
  1. //安装依赖
  2. npm install --save videojs-contrib-hls
  3. //在main.js内引入
  4. require('videojs-contrib-hls/dist/videojs-contrib-hls');
  • 启动服务,查看效果
npm run dev
  • 1

chrome手机尺寸效果

  • videoJs的播放按钮默认为椭圆形,我个人有点不习惯,所以修改成了圆形。

    1. 增加css样式
  1. .video-js .vjs-big-play-button{
  2. /*
  3. 播放按钮换成圆形
  4. */
  5. height: 2em;
  6. width: 2em;
  7. line-height: 2em;
  8. border-radius: 1em;
  9. }

注意: 
直接在 myPlayer.vue组件内增加样式会被覆盖,不论你有没有增加scoped属性,这取决于vue加载样式的顺序,之前查资料看了一个帖子,讲的很好,可惜找不着了。 
我最终的解决方案是:自定义了一个css文件,使用require引入到了main.js内,放在上述样式引入之后。

  1. require('video.js/dist/video-js.css');
  2. require('vue-video-player/src/custom-theme.css');
  3. require('@/../static/css/myVideoCss.css');

大bug: 播放按钮与fastclick冲突

冲突是这样的:播放器在手机浏览器或者chrome开发者工具(手机尺寸)内,点击播放按钮,播放与暂停事件会被触发多次。

刚开始不知道什么原因,在github上提了个issure,刚提完就发现上一个关闭的issure解决的就是这个问题,这里得向作者道个歉,给您添堵了。哈哈。于是我看了另外一个人给的答案:与fastclick插件冲突……,但是….. 没有解决方案。然后我尝试注释掉了fastclick,果然是它影响的。

然后我去fastclick github 地址看了看 ,页面说的很清楚,只要在触发的元素上增加一个needsclick的class就可以了。

但是我试了好久都没有成功。这时候看到了神贴,大体浏览了一下fastclick的源码过程,并且作者提到“Fastclick 把 this.needsClick 放到了 ontouchEnd 末尾去执行,才导致前面说的加上了“needsclick”类名也无效的问题。”所以我想尝试修改fastclick的源码,并且验证一下。

  • 我把整个faseclick.js拷贝了出来,并采用require的方式引用。
  1. const FastClick = require('@/../static/js/fastclick.js');
  2. FastClick.attach(document.body);
  • 打开代码,猜想为什么needsclick没有起到作用,所以就直接检索了一下这个单词,在 FastClick.prototype.needsClick方法的最后,有一个验证:
return (/\bneedsclick\b/).test(target.className);
  • 首先FastClick.prototype.needsClick方法是判断元素是否要保留穿透功能,而最后一行肯定是验证触发的元素的class是不是含有needsclick。所以我先猜测是不是我触发的元素没有加上class,所以console了target.className: 
    这里写图片描述

  • 果然没有,并且发现一个规律,我需要控制的按钮都是以vjs开头的,所以,在验证上再增加一个验证。

return ((/\bneedsclick\b/).test(target.className) || (/\bvjs/).test(target.className));

  • 问题解决,当然解决问题的方式暴力了一些,所以这里我希望看到并觉得此帖有帮助的同学能够在此基础上继续补充完善。我就先趟到这。

最后

  • 贴个版本
  1. "fastclick": "^1.0.6",
  2. "videojs-contrib-hls": "^5.12.2",
  3. "vue": "^2.2.2",
  4. "vue-router": "^2.2.0",
  5. "vue-video-player": "^4.0.6",
posted @ 2021-03-11 09:01  LilLazy  阅读(1394)  评论(2)    收藏  举报