
原因
最近,该公司希望提供视频点播服务. 出于成本考虑,领导者希望一切都将使用开源系统来完成. 基于此出发点,必须排除主要的云视频平台(腾讯云音视频点播VOD,网易云视频,秦牛云,阿里云视频服务等). 实际上,我仍然建议您在这里购买云视频平台,因为用自己的轮子肯定不如其他轮子(特殊的研发团队除外java本地视频播放器,但靠这种业务为生的公司除外). 此外,云视频平台服务提供商提供了一套完整的解决方案解决方案: 收集,存储,转码,播放器等,并在CDN和弹性扩展方面获得最大的保护.
准备
视频点播至少需要两件事: 流媒体服务和视频播放器. 因为这是有关前端播放器的文章,所以我将介绍流媒体服务的构建,以后再添加新的文章.
由于该公司的前端架构使用了vue系列存储桶,所以我仍然希望找到基于vue软件包的视频播放器.
首先,我在vue社区中找到了vue-dplayer,因此我在本地进行了安装和测试. 这时出现一个问题: 该播放器正在播放基于hls协议的m3u8文件(视频文件已成功部署在流服务中),可以在iOS上正常播放(受其自身协议支持),但是在Chrome浏览器中不支持. 然后我去github查找信息. 信息显示Dplay(根据Dplay打包了vue-dplayer)支持hls,但只需要引入hls.js,然后使用hls处理视频对象即可. 因为hls.js和Dplayer示例代码是针对视频对象处理的,所以当将vue-dplayer引入项目时,必须对其进行修改. 时间紧迫,我将首先放弃(此后,我将有一篇专门介绍Dplayer播放hls的文章. (补充),转身拥抱vue视频播放器.
为什么要使用vue-video-player?
1. 我构建的流服务的管理页面中的播放器是videoJs(根据videoJs打包了vue-video-player),使用后感觉很好.
2. 百度进入“ vue video”,vue-video-player在顶部. (哈哈,太随意了)
3. 当然,我仍然阅读演示页面. 支持的协议已经完成.

4. 尽管在vue-video-player github上存在一些尚未解决的问题,但我感到,保护功能强大的videoJs库和成千上万的用户可以始终解决该问题. (我的自信)
全部打开
安装依赖项
npm install vue-video-player --save
介绍样式
// 第一个是videoJs的样式,后一个是vue-video-player的样式,因为考虑到我其他业务组件可能也会用到视频播放,所以就放在了main.js内
require('video.js/dist/video-js.css')
require('vue-video-player/src/custom-theme.css')
导入VueVideoPlayer并将其挂在vue上
//在main.js内 import VideoPlayer from 'vue-video-player' Vue.use(VideoPlayer);
编写业务组件myPlayer.vue
<template>
<div class="container">
<div class="player">
<video-player class="video-player vjs-custom-skin"
ref="videoPlayer"
:playsinline="true"
:options="playerOptions"
@play="onPlayerPlay($event)"
@pause="onPlayerPause($event)"
>
</video-player>
</div>
</div>
</template>
<script>
import { videoPlayer } from 'vue-video-player';
export default {
data () {
return {
playerOptions: {
// playbackRates: [0.7, 1.0, 1.5, 2.0], //播放速度
autoplay: false, //如果true,浏览器准备好时开始回放。
muted: false, // 默认情况下将会消除任何音频。
loop: false, // 导致视频一结束就重新开始。
preload: 'auto', // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
language: 'zh-CN',
aspectRatio: '16:9', // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
sources: [{
type: "application/x-mpegURL",
src: "video.m3u8" //你的m3u8地址(必填)
}],
poster: "poster.jpg", //你的封面地址
width: document.documentElement.clientWidth,
notSupportedMessage: '此视频暂无法播放,请稍后再试', //允许覆盖Video.js无法播放媒体源时显示的默认信息。
// controlBar: {
// timeDivider: true,
// durationDisplay: true,
// remainingTimeDisplay: false,
// fullscreenToggle: true //全屏按钮
// }
}
}
},
components: {
videoPlayer
},
methods: {
onPlayerPlay(player) {
alert("play");
},
onPlayerPause(player){
alert("pause");
},
},
computed: {
player() {
return this.$refs.videoPlayer.player
}
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style type="text/css" scoped>
.container {
background-color: #efefef;
min-height: 100%;
}
</style>

注意:
1. 视频播放器标签的类必须设置为“视频播放器vjs-自定义皮肤”,以使用您介绍的工作样式. 刚开始时,我直接将代码复制到github页面上,并且代码类是video-player-box.
2. 根据videoJS Api修改属性. 我在这里添加了一些注释以供参考.
3. 将src和poster属性修改为服务器资源地址.
添加hls支持
//安装依赖
npm install --save videojs-contrib-hls
//在main.js内引入
require('videojs-contrib-hls/dist/videojs-contrib-hls');
启动服务并检查效果
npm run dev

videoJs的播放按钮默认为椭圆形. 我个人不习惯,所以将其更改为圆形.

添加CSS样式
.video-js .vjs-big-play-button{
/*
播放按钮换成圆形
*/
height: 2em;
width: 2em;
line-height: 2em;
border-radius: 1em;
}
注意:
直接在myPlayer.vue组件中添加样式将被覆盖,无论是否添加作用域属性,这都取决于vue加载样式的顺序. 我之前检查了这些信息并阅读了一篇文章. 很好,但是很遗憾,我找不到.
我的最终解决方案是: 自定义一个css文件,使用require将其导入main.js,并放在上述样式介绍之后.
require('video.js/dist/video-js.css');
require('vue-video-player/src/custom-theme.css');
require('@/../static/css/myVideoCss.css');
大错误: 播放按钮与fastclick冲突
冲突是这样的: 播放器位于移动浏览器或chrome开发工具(手机大小)中,单击播放按钮,播放和暂停事件将被多次触发.
一开始我不知道原因,我在github上提到了一个issure,我发现最后一个关闭的issure解决了问题. 在这里,我必须向作者表示歉意,并向您添加. 哈哈. 所以我读了另一个人给出的答案: 与fastclick插件冲突...,但是...没有解决方案. 然后我试图注释掉fastclick,它确实影响了它.
然后我去了fastclick github地址,页面上清楚地说了出来. 只需在触发的元素中添加一个needsclick类即可.

但是我尝试了很长时间却没有成功. 这时,我看到了上帝的贴子,粗略地看了一下fastclick的源代码过程,作者提到“ Fastclick将this.needsClick放在ontouchEnd的末尾执行,这导致添加“ needsclick “前面提到的类名. ”所以我想尝试修改fastclick的源代码并进行验证.
我复制了整个faseclick.js并用require引用.
const FastClick = require('@/../static/js/fastclick.js');
FastClick.attach(document.body);
打开代码java本地视频播放器,猜测为什么needsclick无效,所以我直接搜索了该词. 在FastClick.prototype.needsClick方法的末尾,有一个验证:
return (/\bneedsclick\b/).test(target.className);
首先,FastClick.prototype.needsClick方法将确定元素是否应保留渗透功能,最后一行必须是验证触发元素的类是否包含Needsclick. 因此,我首先猜测触发的元素是否未添加类,因此未添加控制台. target.className:

果然,找到一条规则,我需要控制的所有按钮均以vjs开头,因此在验证中添加另一个验证.
复制代码,代码如下:
返回((/\bneedsclick\b/).test(target.className)||(/ \ bvjs /). test(target.className));
问题解决了,当然,解决问题的方法是暴力的,所以我希望在这里,对发现和发现此贴子有用的学生可以在此基础上继续进行补充和改进. 我先去这里最新发布的版本
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-276725-1.html
大写的P