Ajax返回的对象中使用Vue做的视频列表页面,把每个视频的首帧作为封面图片或者视频poster。
HTML代码:
<ul> <li v-for="item,index in videoList"> <video :ref="'video'+index" crossorigin="anonymous" :poster="item.videoPoster" preload="metadata" style="display: none;"></video> <canvas :ref="'canvas'+index" style="display: none;"></canvas> </li> </ul>
Vue代码:
var app = new Vue({ el: '#app',//作用域 data: { videoList:[ { "videoUrl":"../upload/video1.mp4", "videoPoster:"../upload/poster1.jpg" //默认封面 }, { "videoUrl":"../upload/video2.mp4", "videoPoster:"../upload/poster2.jpg" //默认封面 }, { "videoUrl":"../upload/video3.mp4", "videoPoster:"../upload/poster3.jpg" //默认封面 } ] }, methods: { // 生成视频缩略图函数 generateThumbnail: function(video, index) { const self = this; //重置缩略图,如果要更换所有的默认封面则使用,否则不需要 //self.$set(self.videos[index], 'videoPoster', null); const videoElement = self.$refs[`video${index}`][0]; //定义对应下标的视频对象 const canvasElement = self.$refs[`canvas${index}`][0]; //定义对应下标的画布对象 videoElement.src = video.FileUrl; // 设置视频源 //当视频加载完成时 videoElement.addEventListener('loadeddata', () => { videoElement.currentTime = 0.1; //设置视频当前时间为第一帧 }); //当视频跳转到指定时间点时 videoElement.addEventListener('seeked', () => { const videoWidth = videoElement.videoWidth; //获取视频宽度 const videoHeight = videoElement.videoHeight; //获取视频高度 canvasElement.width = 960; //设置画布宽度,或者直接使用视频的宽度 canvasElement.height = 540; //设置画布高度,或者直接使用视频的高度 //绘制视频帧到Canvas const ctx = canvasElement.getContext('2d'); ctx.drawImage(videoElement, 0, 0, videoWidth, videoHeight); // 将Canvas转换为DataURL const dataURL = canvasElement.toDataURL(); //更新返回对象里的默认封面为视频首帧 if(self.list[index].videoPoster== ''){ self.$set(self.list[index], 'videoPoster', dataURL); //如果返回对象的默认封面为空,则使用视频首帧 }else{ const orURL = self.list[index].videoPoster; self.$set(self.list[index], 'videoPoster', orURL); //如果返回对象的默认封面不为空,则使用对象原来的默认封面(可以不要) } }); //加载视频 videoElement.load(); }, init: function(){ $.post(url, { action: 'GetVideoList', }, function (res) { if (res.success) { self.list = res.data.Items; //等待vue的双向绑定后执行的js self.$nextTick(function () { self.list.forEach((video, index) => { self.generateThumbnail(video, index); }); }) }else{ } }, 'json'); } }, mounted: function () { this.init(); } });
完成。