uniapp播放视频截图(APP可以用,小程序勿进)

uniapp播放视频截图

前言

最近用uniapp在做一个播放视频截图的功能,第一个当然想到了video组件。可是翻遍这货竟然没有支持截图的API。一番操作下来,用uniapp肯定是无法实现这个功能了,那我们能不能曲线救国方案实现了?当然是可以的,不然就不会有本篇文章出现了,这里以播放uniapp官方的视频为例,先上图镇楼:
在这里插入图片描述

思路

先讲下思路,uniapp没有给我们提供视频截图的api,但是使用浏览器提供的drawImage方法能实现video截图,但是前提是必须使用html中的VIDEO标签。然后再使用uniapp提供的renderjs配合dom操作来完成视频截图功能。

实现

首先是页面元素,很简单这里不做过多解释

<template>
	<view>
		<!--VIDEO标签父元素-->
		<view id="videop"></view>
		<image id="myImg" :src="shot" style="width: 100%;height: 200px;"></image>
		<!--这里的test对应renderjs中的module取值-->
		<button @click="test.onClick">截图</button>
	</view>
</template>

然后我们看下renderjs实现部分,逻辑参考注释

<script module="test" lang="renderjs">
	let width,height
	export default {
		mounted() {
			width = uni.getSystemInfoSync().screenWidth
			height = 200
			console.log('mounted')
			var src = "https://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/%E7%AC%AC1%E8%AE%B2%EF%BC%88uni-app%E4%BA%A7%E5%93%81%E4%BB%8B%E7%BB%8D%EF%BC%89-%20DCloud%E5%AE%98%E6%96%B9%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B@20200317.mp4"
			//通过dom操作创建一个html VIDEO标签并设置好相关参数
			var x = document.createElement("VIDEO");
			x.setAttribute("id", "videoplayer");
			x.setAttribute("width", width);
			x.setAttribute("height", height);
			x.setAttribute("controls", "controls");
			x.setAttribute("autoplay", "true");
			x.setAttribute("src", src);
			//加入到页面id为videop的元素中
			document.getElementById('videop').appendChild(x)
		},
		methods: {
			//页面元素截图按钮点击事件
			onClick(event, ownerInstance) {
				//通过dom创建一个canvas
				var canvas = document.createElement("canvas");
				canvas.setAttribute("width", width);
				canvas.setAttribute("height", height);
				var canvasCtx = canvas.getContext("2d");
				//获取页面中的VIDEO标签
				var video = document.querySelector("#videoplayer")
				//坐原图像的x,y轴坐标,大小,目标图像的x,y轴标,大小。
				canvasCtx.drawImage(video, 0, 0, video.width, video.height);
				//把图标base64编码后变成一段url字符串
				var dataUrl = canvas.toDataURL("image/png");
				//调用页面methods中的updateimg方法,将图片base64地址传递
				ownerInstance.callMethod('updateimg', {
					dataUrl: dataUrl
				})
			}
		}
	}
</script>

接下来看下页面methods中的updateimg方法

...
methods: {
	updateimg(obj){
				//获取图片地址,并显示到页面的img标签上,然后将base64图片保存到相册
				this.shot = obj.dataUrl
				const bitmap = new plus.nativeObj.Bitmap("test");
				bitmap.loadBase64Data(obj.dataUrl, function() {
					const url = "_doc/" + new Date().getTime() + ".png";  // url为时间戳命名方式
					bitmap.save(url, {
						overwrite: true,  // 是否覆盖
						quality: 100  // 图片清晰度
					}, (i) => {
						uni.saveImageToPhotosAlbum({
							filePath: url,
							success: function() {
								uni.showToast({
									title: '图片保存成功',
									icon: 'none'
								})
								bitmap.clear()
							}
						});
					}, (e) => {
						uni.showToast({
							title: '图片保存失败',
							icon: 'none'
						})
						bitmap.clear()
					});
				}, (e) => {
					uni.showToast({
						title: '图片保存失败',
						icon: 'none'
					})
					bitmap.clear()
				});          
			}			
}
...

实现代码到这里基本就完成了,代码算是比较简单,但是思路确实另辟蹊径,有兴趣的可以跑跑看,唯一的缺点是截图的大小不跟随视频的分辨率而是跟你VIDEO的大小一样,VIDEO设置的太小可能导致图片不清晰。

尾巴

今天的内容相对来说比较简单,但是特别要注意这种方式只适用于APP。
老规矩,喜欢我的文章,欢迎给我点赞,评论,关注,谢谢大家!

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
### 回答1: 可以使用uni-app提供的video组件来实现上滑播放视频的功能,具体代码如下: <template> <view class="container"> <video :src="videoUrl" @play="onPlay" @pause="onPause" @ended="onEnded"></video> </view> </template> <script> export default { data() { return { videoUrl: 'http://example.com/video.mp4', isPlaying: false } }, methods: { onPlay() { this.isPlaying = true }, onPause() { this.isPlaying = false }, onEnded() { this.isPlaying = false } } } </script> <style> .container { width: 100%; height: 100%; display: flex; justify-content: center; align-items: center; } video { width: 100%; height: 100%; } </style> 在这个代码中,我们使用了uni-app提供的video组件来播放视频,通过监听play、pause和ended事件来控制视频的播放状态。同时,我们使用了isPlaying变量来记录视频是否正在播放。在模板中,我们将video组件放在一个容器中,并设置容器的宽高为100%,使得视频可以占满整个屏幕。在样式中,我们设置了video组件的宽高为100%,使得视频可以自适应屏幕大小。 ### 回答2: 实现在uniapp小程序上滑播放视频可以通过以下步骤: 1. 在uniapp的页面上,引入uni-media组件,用于播放视频。uni-media是uniapp封装的视频播放组件,可以将视频播放器放置在页面上。 2. 在页面上声明一个变量,用于控制视频是否播放。例如,可以定义一个变量叫做`isPlaying`,初始值为false。 3. 监听页面的滑动事件,可以使用`@scroll`或者`@touchmove`等事件,以在滑动时触发相关操作。 4. 在滑动事件中,判断用户的滑动方向和滑动距离,可以通过事件的`direction`和`deltaY`属性获取。如果向上滑动且滑动距离足够长,就将`isPlaying`变量置为true,表示开始播放视频。 5. 在uni-media组件中添加条件判断,根据`isPlaying`变量的值来控制视频的播放。如果`isPlaying`为true,则播放视频;如果`isPlaying`为false,则暂停视频。 6. 最后,需要在页面顶部或者其他位置添加一个视频播放器的占位元素,例如一个图片或者视频封面图,作为触发播放视频的入口。当用户滑动触发播放后,可以隐藏占位元素,显示实际的视频播放器。 简单示例代码如下: ```html <!-- 在页面上添加 uni-media 组件 --> <template> <view> <image class="video-placeholder" src="video_cover.jpg" v-if="!isPlaying" @click="startPlaying"></image> <uni-media class="video-player" :src="videoSrc" :autoplay="isPlaying"></uni-media> </view> </template> <script> export default { data() { return { isPlaying: false, // 控制视频播放状态 videoSrc: 'video.mp4' // 视频链接 } }, methods: { startPlaying() { this.isPlaying = true; // 开始播放视频 } }, // 监听滑动事件 onScroll(event) { // 判断滚动方向 if (event.direction === 'up' && event.deltaY > 100) { this.isPlaying = true; // 向上滑动播放视频 } } } </script> <style> .video-player { width: 100%; height: 300px; } .video-placeholder { width: 100%; height: 300px; } </style> ``` 以上代码实现了在uniapp小程序上滑播放视频的功能。通过监听滑动事件,判断滑动距离和方向,控制视频播放的逻辑。在页面上添加`uni-media`组件作为视频播放器,并根据`isPlaying`的值来控制视频的播放和暂停。同时,通过添加一个视频播放器的占位元素,在用户滑动触发播放后,隐藏占位元素,显示实际的视频播放器。 ### 回答3: 要使用代码实现uniapp小程序上滑播放视频的功能,可以按照以下步骤操作: 1. 创建一个页面用于展示视频,可以在该页面的 template 中添加一个 video 组件用于播放视频。 2. 在页面的 script 部分,定义一个 data 属性,用于保存视频的播放状态和相关参数。可以包括视频是否可播放、当前播放的视频索引、视频的列表等。 3. 在页面的 created 生命周期钩子函数中,可以通过请求接口获取视频列表数据,并将数据保存在 data 中。 4. 在页面的 onReachBottom 函数中,监听上滑事件。当触发上滑事件时,可以在 data 中更新当前播放的视频索引,实现上滑播放下一个视频的效果。 5. 在页面的 onReady 函数中,监听视频的播放事件。当视频开始播放时,可以通过 data 更新视频的播放状态,用于控制页面其他部分的交互。 6. 在页面的 template 中,利用 v-if 或 v-show 来控制视频的显示与隐藏,根据数据中的播放状态来判断是否显示视频。 7. 可以添加一些交互操作,比如点击视频切换播放/暂停状态,或者点击列表项切换播放的视频等。 这是一个大致的思路,具体的细节实现可以根据具体需求来进行调整和完善。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值