uni-app App和H5平台上传视频截取视频第一帧生成图片

这篇具有很好参考价值的文章主要介绍了uni-app App和H5平台上传视频截取视频第一帧生成图片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

uni-app App和H5平台使用renderjs上传视频截取视频第一帧生成图片

提示:因为uni-app中renderjs仅支持App和H5平台,所以该方案仅支持当前这两个平台。 this.request为本人封装的接口请求方法,可以替换成个人的接口请求方法,如有需要可在下方留言



前言

因为uni-app App端没有dom概念,不支持dom操作,并且uni-app的canvas不支持绘制video。renderjs完美解决了uni-app App端的基础dom操作。实现效果在最下方!!


一、renderjs简介

renderjs是一个运行在视图层的js。它比[WXS](https://uniapp.dcloud.io/tutorial/miniprogram-subject.html#wxs)更加强大。它只支持app-vue和h5。

renderjs的主要作用有2个:

  • 大幅降低逻辑层和视图层的通讯损耗,提供高性能视图交互能力
  • 在视图层操作dom,运行for web的js库

二、创建index.vue文件,下方代码均在index.vue中

1.HTML代码

代码如下(示例):

<template>
	<view class="content">
		// 逻辑层调用视图层方法,采用监听data中变量改变的方法
		<view id="canvas" class="canvas" :prop="newVal" :change:prop="canvas.create"></view>
		<button @click="choose">chooseVideo</button>
	</view>
</template>

2.逻辑层代码

代码如下(示例):

<!-- 逻辑层script -->
<script>
	export default {
		data() {
			return {
				newVal: null
			};
		},
		methods: {
			choose(){
				// 选取视频文件,拿到本地地址
				uni.chooseVideo({
					sourceType: ['camera', 'album'],
					success:  (blod)=>{
						// 获取视频信息,拿到宽高信息
						uni.getVideoInfo({
							src: blod.tempFilePath,
							success: (info) => {
								// 上传视频到网络地址,当然也可以使用本地地址。App、H5平台本人都测试过,都没问题!!!
								uni.uploadFile({
									url: 'http://替换成自己个上传文件接口/api/common/upload', //仅为示例,非真实的接口地址
									filePath: blod.tempFilePath,
									name: 'file',
									formData: {
										'token': uni.getStorageSync('userInfo').token
									},
									success: src => {
										// fullurl也可以使用本地地址,上传选择文件获取到的 => blod.tempFilePath
										this.newVal = {fullurl: JSON.parse(src.data).data.fullurl, width: info.width, height: info.height}
										// 这里当时想做个平台区分,但是后面发现H5平台这种调用方式,视图层create接受参数的时候,只能接收到newValue,但是不能接收到event, ownerInstance,所以还是统一使用上方操作
										// 下方方法仅展示,调用还是统一使用上方操作
										// // #ifdef APP-PLUS
										// this.newVal = {fullurl: JSON.parse(src.data).data.fullurl, width: info.width, height: info.height}
										// // #endif
										// // #ifdef H5
										// this.create({fullurl: JSON.parse(src.data).data.fullurl, width: info.width, height: info.height})
										// // #endif
									},
									complete: all => {
										console.log(JSON.parse(all.data))
									}
								})
							}
						})
					}
				})
			},
			// 逻辑层拿到base64字符串,上传网络图片
			getBase64(options){
				this.request({
					url: 'common/base64', //仅为示例,非真实的接口地址
					data: {
						base64: options.base64
					}
				}).then(res=>{
					// 拿到上传base64图片的网络图片
					console.log(res)
				})
			},
		}
	}
</script>

3.视图层代码

代码如下(示例):

<!-- 视图层script module对应HTML代码中view的id-->
<script module="canvas" lang="renderjs">
	export default {
		methods: {
			// 视图层创建base64图片
			create(newValue, oldValue, ownerInstance){
				// 第一次进入为空不操作
				if(newValue == null){
					return
				}
				// 在缓存中创建video标签
				var video = document.createElement("VIDEO")
				// 通过setAttribute给video dom元素添加自动播放的属性,因为视频播放才能获取封面图    
				// 设置video自动播放属性
				video.autoplay = true
				// 该设置方法无效
				// video.setAttribute('autoplay', true)
				// 再添加一个静音的属性,否则自动播放会有声音
				// 该设置方法无效
				// video.setAttribute('muted', true)
				video.muted = true
				// 如果报错Uncaught SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.
				// 可以把下面两行代码加上,因为我用的线上video url,所以可能抛出了异常。大概意思就是跨域了toDataURL()使用了外域资源
				video.setAttribute('crossOrigin', 'anonymous')
				video.crossOrigin = '*'
				// 上面我们只是创建了video标签,视频播放需要内部的source的标签,scr为播放源
				video.innerHTML = '<source src=' + newValue.fullurl + ' type="audio/mp4">'
				// 再创建canvas画布标签
				var canvas = document.createElement('canvas');
				var ctx = canvas.getContext('2d');
				// video注册canplay自动播放事件
				// 防止video不播放,所以手动加个播放操作
				video.play()
				// video播放事件
				video.addEventListener('canplay', ()=>{
					// 创建画布的宽高属性节点,就是图片的大小,单位PX
					var anw = document.createAttribute("width");
					anw.nodeValue = newValue.width;
					var anh = document.createAttribute("height");
					anh.nodeValue = newValue.height;
					canvas.setAttributeNode(anw);
					canvas.setAttributeNode(anh);
					// 画布渲染
					ctx.drawImage(video, 0, 0, newValue.width, newValue.height);
					// 生成base64图片,指定type为jpeg格式生成的图片base64编码会小很多
					var base64 = canvas.toDataURL('image/jpeg') // 这就是封面图片的base64编码
					// 传递数据给逻辑层
					ownerInstance.callMethod('getBase64',{
						base64: base64
					})
					// 删除创建的video 、canvas dom,要不然重新选取视频生成图片不生效
					// ps:开始有这个问题,但是后面不知道为什么又没有了,如果发现生成第一次base64之后再选择不生效,可以尝试一下把下方注释打开
					// document.body.removeChild(video)
					// document.body.removeChild(canvas)
				})
			}
		}
	}
</script>

提示:本文由本人原创,转载请注明出处!!! 如果本文对你有帮助,请点个赞吧!

实现效果

1.base64图片效果

uni-app App和H5平台上传视频截取视频第一帧生成图片

2.线上图片效果

uni-app App和H5平台上传视频截取视频第一帧生成图片
uni-app App和H5平台上传视频截取视频第一帧生成图片文章来源地址https://www.toymoban.com/news/detail-407771.html

到了这里,关于uni-app App和H5平台上传视频截取视频第一帧生成图片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uni-app uni-file-picker文件上传实现拍摄从相册选择获取图片上传文档服务器(H5上传-微信小程序上传)

    前言 最近在使用uni-app写H5移动端,有一个从手机拍摄从相册选择获取图片上传到文档服务器功能。 查阅uni-app发现关于上传图片,uni-file-picker文件上传,uni.chooseImage,uni.uploadFile H5上传时它和pc端原理差不多,都是file对象上传,PC端是通过new file对象,uni-app是直接提供了 微信

    2024年02月15日
    浏览(41)
  • uni-app引入海康威视h5player实现视频监控的播放

    知识储备 uni-app web-view组件相关知识:点击学习。 海康威视相关工具下载:点击跳转下载。 web-view组件不全屏显示:uni-app web-view 如果设置不全屏 不自动铺满。 工具下载 首先下载海康威视h5player的demo 在uni-app项目中static文件夹下创建文件目录,我命名为h5player 将demo中bin文件

    2024年02月02日
    浏览(30)
  • 【Uni-app 引入海康h5player并接入ws视频流】

    内容简介 采用uni-app中的renderjs 引入海康H5 SDK 后端接入海康综合安防平台的开放API获取预览流 海康H5 SDK 下载地址 接入原因 因在移动端接入不管是hls flv rtsp rtmp流的播放稳定性和速度均很慢,特采用ws直连流来播放,效率很稳定性均显著提高。因采用前者流可以直接使用原生

    2024年02月11日
    浏览(59)
  • 不同平台使用不同技术实现微信好友、朋友圈分享汇总(H5、taro、uni-app)

    人生路漫漫,坑,是活久了见。程序猿世界里各种奇葩的需求都有,随之而来的各种坑也是层出不穷。 应前IBM同事邀请特来做分享的专题总结。一般人我不告诉他,刷到的朋友们就赚到了,你懂的~~~~~~收藏吧!   事情前情概述,昨天IBM的同事前来咨询我怎样实现微信分享功

    2024年02月15日
    浏览(41)
  • uni-app移动端-H5-微信小程序下载保存图片,文档和视频到手机,带进度条

    可移步插件地址,可直接导入hbuilderx示例项目查看: uni-app移动端-H5-微信小程序下载保存图片,文档和视频到手机,带进度条 具体代码如下

    2024年02月13日
    浏览(22)
  • uni-app - App 平台内嵌网页物理手机自带返回键失效解决方案(内嵌的 webview 网页 H5 打包后手机物理返回键无效直接退出应用了)

    当您需要打包 App(*.apk) 平台时,发现内嵌的 H5 页面虽然可以正常显示与运行,但是手机的物理返回键却无法使用,当点击手机物理返回按键(或手势)时,直接显示 “再按一次退出应用”,而 并非返回上一个\\\"网页\\\"。 出现这种情况的原因是, 内嵌的网页与您的 App “毫无

    2024年02月09日
    浏览(52)
  • 跨平台应用开发进阶(五十)uni-app ios web-view嵌套H5项目白屏问题分析及解决

    应用 uni-app 框架开发好APP上架使用过程中,发现应用经过长时间由后台切换至前台时,通过 webview 方式嵌套的H5页面发生白屏现象。 任何手机设备上,当手机内存不足时,os都会回收资源。一般是先回收后台打开的资源。如果当前应用占用的资源过高,当前应用也有可能崩溃

    2024年02月14日
    浏览(37)
  • uni-app打开外部链接方式汇总(h5&app)

    问题描述 在应用中打开一个外部的html页面,即完整http链接的页面。h5通过window.open或是内嵌iframe基本都没有问题,本文主要针对app端的方法进行汇总,不涉及到小程序端。 方案1 使用uni-app的扩展组件 uni-link ,使用参考文档uni-app官网 该组件的行为是在app内打开外部浏览器,

    2024年02月01日
    浏览(25)
  • uni-app搭建h5项目

    一、 打开官方网站 https://uniapp.dcloud.net.cn/quickstart-cli.html 二、找到使用vue-cli命令行,按照文档上的步骤进行搭建 全局安装 vue-cli 搭建项目 可以根据命令行搭建,搭建vue2.0对应的是webpack, 也可以搭建vue3.0+vite,命令行下载不下来,直接访问高亮起来的 gitee 然后下载模板即可

    2024年02月22日
    浏览(50)
  • uni-app如何区分 app、h5、小程序代码; uni-app如何判断是android、ios、小程序

    uniapp是DCloud公司于2012年开始研发的能够一次代码开发,生成H5、小程序(微信、支付宝、百度、华为等)、APP等应用的技术的统称,开发工具是HBuilderX,功能非常强大,由此引申出许多技术社区与生态环境。 使用HBuilderX开发Uniapp程序的项目,用它生成多端应用,由于兼容各种

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包