一、视频播放
1. 安装video.js
// video.js
npm install video.js
2. 引用(main.js)
import videojs from "video.js";
import "video.js/dist/video-js.css";
Vue.prototype.$video = videojs;
3.vue中添加视频代码
- <template>
- <video
- id="myVideoId"
- class="video-js vjs-big-play-centered vjs-fluid"
- controls
- preload="auto"
- width="100%"
- height="100%"
- >
- <source type="application/x-mpegURL" :src="playURL" />
- </video>
- </template>
- export default {
- data() {
- return {
- transcribeStr: "录 像",
- myPlayer: null,
- // 视频播放地址
- playURL: "",
- };
- },
- mounted() {
- this.initVideo();
- },
- watch: {},
- methods: {
- initVideo() {
- //此处初始化的调用,我放在了获取数据之后的方法内,而不是放在钩子函数mounted
- //页面dom元素渲染完毕,执行回调里面的方法
- this.$nextTick(() => {
- this.myPlayer = this.$video(document.getElementById("myVideoId"), {
- //确定播放器是否具有用户可以与之交互的控件。没有控件,启动视频播放的唯一方法是使用autoplay属性或通过Player API。
- controls: true,
- //自动播放属性,muted:静音播放
- autoplay: true,
- //建议浏览器是否应在<video>加载元素后立即开始下载视频数据。
- preload: "auto",
- //设置视频播放器的显示宽度(以像素为单位)
- // width: "800px",
- //设置视频播放器的显示高度(以像素为单位)
- // height: "400px",
- controlBar: {
- playToggle: true
- }
- });
- });
- }
- },
- beforeDestroy() {
- // 组件销毁时,清除播放器
- if (this.myPlayer) this.myPlayer.dispose();
- }
- };
二、视频录制和下载
1. 安装录制所需插件
npm i recordrtc
2.引用(main.js)
import RecordRTC from "recordrtc";
Vue.prototype.$recordRTC = RecordRTC;
3.vue中添加视频录制和下载代码(本功能基于上面代码)
- <div @click="transcribe">
- <i class="record-procees" v-if="isRecorder"></i>
- {{ transcribeStr }}
- </div>
- // 录制
- transcribe() {
- this.isRecorder = !this.isRecorder;
- if (this.isRecorder) {
- this.transcribeStr = "结 束";
- if (!this.canvas) this.canvas = document.createElement("canvas");
- this.recorder = this.$recordRTC(this.canvas, {
- type: "canvas"
- });
- this.recorder.startRecording();
- this.drawMedia();
- } else {
- this.transcribeStr = "录 像";
- this.recorder.stopRecording(() => {
- const url = window.URL.createObjectURL(this.recorder.getBlob());
- this.downloadFile(url, "mp4");
- cancelAnimationFrame(this.animationFrame);
- this.canvas = null;
- this.animationFrame = null;
- });
- }
- },
- // 刷新canvas
- drawMedia() {
- const ctx = this.canvas.getContext("2d");
- // 找到需要截图的video标签
- const video = this.myPlayer.el().querySelector("video");
- this.canvas.setAttribute("width", video.videoWidth);
- this.canvas.setAttribute("height", video.videoHeight);
- ctx.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
- // requestAnimationFrame 根据电脑显示帧数进行循环
- this.animationFrame = requestAnimationFrame(() => this.drawMedia());
- },
- // 下载
- downloadFile: function(blob, fileType) {
- const a = document.createElement("a");
- a.style.display = "none";
- a.href = blob;
- // const time = this.parseTime(new Date())
- const time = new Date().getTime();
- a.download = `${time}.${fileType}`;
- document.body.appendChild(a);
- a.click();
- setTimeout(function() {
- document.body.removeChild(a);
- window.URL.revokeObjectURL(blob);
- }, 1000);
- },
- <style>
- .record-procees {
- display: inline-block;
- height: 10px;
- width: 10px;
- margin-top: 12px;
- margin-right: 6px;
- background: red;
- border-radius: 8px;
- animation: blings 1s linear infinite;
- }
- @keyframes blings {
- 0% {
- opacity: 0.1;
- }
- 100% {
- opacity: 1;
- }
- }
- style>
三、截图
<li @click="screenshotHandle">截图</li>
- screenshotHandle() {
- const fileType = "png";
- // 找到需要截图的video标签
- // video 实列
- const video = this.myPlayer.el().querySelector("video");
- // const video = this.video;
- console.log(video, "video");
- const canvas = document.createElement("canvas");
- canvas.width = video.videoWidth;
- canvas.height = video.videoHeight;
- console.log(canvas, "canvas");
- canvas
- .getContext("2d")
- .drawImage(video, 0, 0, canvas.width, canvas.height); // 图片大小和视频分辨率一致
- const strDataURL = canvas.toDataURL("image/" + fileType); // canvas中video中取一帧图片并转成dataURL
- let arr = strDataURL.split(","),
- mime = arr[0].match(/:(.*?);/)[1],
- bstr = atob(arr[1]),
- n = bstr.length,
- u8arr = new Uint8Array(n);
- while (n--) {
- u8arr[n] = bstr.charCodeAt(n);
- }
- const blob = new Blob([u8arr], {
- type: mime
- });
- const url = window.URL.createObjectURL(blob);
- this.downloadFile(url, "png");
- },