uni-app从后端返回的mp4链接视频截取一帧为封面

这篇具有很好参考价值的文章主要介绍了uni-app从后端返回的mp4链接视频截取一帧为封面。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、需求:

后端返回包含视频链接的数组对象,格式如下:

[
   {
      url: 'xxxxx.mp4',
   },
   {
      url: 'xxxxx.mp4',
   },
   {
      url: 'xxxxx.mp4',
   },
]

从上面的mp4视频中截取一帧设置为封面,如下图,下面的封面图从视频中截取而来。
uniapp给视频加封面,uni-app,Vue,uni-app,音视频,javascript

二、代码实现:
<script>
	export default {
		onLoad() 
			this.getViedoList();
		},
		data() {
			return{
	            videoLists:[], // 获取到的视频列表数组
				posterList: [] ,// 视频封面图数组
			}
		},
		methods: {
			getViedoList(){
				this.$uniReq({
					url:"doc/api/doc's/@freevideo",
					method:"GET",
				}).then((re)=>
					this.videoLists = re
			        this.createPoster();
				}).catch((err)=>{
					console.log(err);
				})
			}
			createPoster() { // 截取封面 封装函数
				var videoCanList = []
				this.videoLists.forEach((item,index) => {
					var promise = new Promise((reslove, reject) => {
						// 在缓存中创建video标签
						var video = document.createElement("VIDEO")
						// 通过setAttribute给video dom元素添加自动播放的属性,因为视频播放才能获取封面图
						video.currentTime = 1; // 截取视频的第1秒
						video.setAttribute('crossOrigin', 'anonymous');
						video.setAttribute('autoplay', 'autoplay')
						// 再添加一个静音的属性,否则自动播放会有声音
						video.setAttribute('muted', 'muted')
						// 上面我们只是创建了video标签,视频播放需要内部的source的标签,scr为播放源
						video.innerHTML = '<source src=' + item.url + ' type="audio/mp4">'
						// 再创建canvas画布标签
						var canvas = document.createElement('canvas');
						var ctx = canvas.getContext('2d');
						// video注册canplay自动播放事件
						video.addEventListener('canplay', function() {
							// 创建画布的宽高属性节点,就是图片的大小,单位PX
							var anw = document.createAttribute("width");
							anw.nodeValue = 500;
							var anh = document.createAttribute("height");
							anh.nodeValue = 300;
							canvas.setAttributeNode(anw);
							canvas.setAttributeNode(anh);
							// 画布渲染
							ctx.drawImage(video, 0, 0, 500, 300);
							// 生成图片
							var base64 = canvas.toDataURL('image/png') // 这就是封面图片的base64编码
							// 视频结束播放的事件
							video.pause()
							reslove(base64)  // promise函数成功的回调
						}, false)
					})
					videoCanList.push(promise)
				})
				Promise.all(videoCanList).then(res => {
					this.posterList = res
				})
			}
		}
	}
</script>

按照上面的代码,其中posterList就是对应的每一个视频的封面base64数组,一切看起来都挺好,在H5正常运行,但是在APP端使用,明显是不可以的,因为在app端,document为undefined,那么怎么弄呢,查阅了资料,发现使用renderjs即可以识别。

<view class='healthPromotion' :videoLists="videoLists" :change:videoLists="renderScript.createPoster"></view>

<script>
	export default {
		onLoad() 
			this.getViedoList();
		},
		data() {
			return{
	            videoLists:[], // 获取到的视频列表数组
				posterList: [] ,// 视频封面图数组
			}
		},
		methods: {
			getViedoList(){
				this.$uniReq({
					url:"doc/api/doc's/@freevideo",
					method:"GET",
				}).then((re)=>
					this.videoLists = re
				}).catch((err)=>{
					console.log(err);
				})
			},
            reciveMessage(val) {
				this.posterList = val
			}
		}
	}
</script>

<script module="renderScript" lang="renderjs">
	export default {
		methods: {
			createPoster(val) {
				var videoCanList = [],curDateList = []
				val.forEach((item,index) => {
					var promise = new Promise((reslove, reject) => {
						// 在缓存中创建video标签
						var video = document.createElement("VIDEO")
						// 通过setAttribute给video dom元素添加自动播放的属性,因为视频播放才能获取封面图
						video.currentTime = 5
						video.setAttribute('crossOrigin', 'anonymous');
						video.setAttribute('autoplay', 'autoplay')
						// 再添加一个静音的属性,否则自动播放会有声音
						video.setAttribute('muted', 'muted')
						// 上面我们只是创建了video标签,视频播放需要内部的source的标签,scr为播放源
						video.innerHTML = '<source src=' + item.url + ' type="audio/mp4">'
						// 再创建canvas画布标签
						var canvas = document.createElement('canvas');
						var ctx = canvas.getContext('2d');
						// video注册canplay自动播放事件
						video.addEventListener('canplay', function() {
							// 创建画布的宽高属性节点,就是图片的大小,单位PX
							var anw = document.createAttribute("width");
							anw.nodeValue = 500;
							var anh = document.createAttribute("height");
							anh.nodeValue = 300;
							canvas.setAttributeNode(anw);
							canvas.setAttributeNode(anh);
							// 画布渲染
							ctx.drawImage(video, 0, 0, 500, 300);
							// 生成图片
							var base64 = canvas.toDataURL('image/png') // 这就是封面图片的base64编码
							// 视频结束播放的事件
							video.pause()
							curDateList.unshift({ // 这里是我自己的数据处理模块
								type: 'video',
								videoUrl: item.url,
								img: base64
							})
							reslove(base64)  // promise函数成功的回调
						}, false)
					})
					videoCanList.push(promise)
				})
				Promise.all(videoCanList).then(res => {
					this.$ownerInstance.callMethod('reciveMessage', res)
				})
			},
		}
	}
</script>


1)当 videoLists变化时,通过 :change:videoLists="renderScript.createPoster"这一段代码, renderjs 中的createPoster被调用
2)renderjs给script传递数据 this.$ownerInstance.callMethod(‘reciveMessage’, res),调用reciveMessage代码,给posterList 赋值

通过上面的方法完成renderjs与常规script的通信,这样就达到了开篇的需求图的封面列表,H5,APP端都可以生成封面图,亲测有效文章来源地址https://www.toymoban.com/news/detail-622734.html

到了这里,关于uni-app从后端返回的mp4链接视频截取一帧为封面的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • uni-app:navigateBack返回上一页

    在 navigateBack 方法中使用 uni.navigateBack  来返回上一个页面。 delta 参数表示返回的页面层数,这里设置为1表示返回上一个页面。 要在uni-app中实现返回上一页并刷新上一个页面,并设置上一个页面的data值,可以使用uni.emit和uni.emit和uni.on来实现事件的发布和订阅。  当前页面

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

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

    2024年02月01日
    浏览(47)
  • Uni-app返回上一页面并携带参数

    目录 一、前言 二、实现方法 三、遇到的坑 四、事件详解 一、前言         需要实现这么一个需求:在一个列表页面,当子页面直接返回时,不刷新列表页面。但是当子页面的数据有变动时,需要刷新列表页面。本篇博客记录一下我是如何解决这个问题的。        

    2024年02月08日
    浏览(49)
  • uni-app 如何返回到指定的页面

    实际开发中,发现了一个问题,即使签署合同的时候,发现调用法大大的页面,出现了一个问题,就是签署后,点回退,回退到了重新签署的页面。所以需要对回退进行自定义处理。 处理的话,就要到指定的返回页面。这里还存在不签署的情况,回退要是原来的页面。所以要

    2024年01月18日
    浏览(63)
  • uni-app:请求后端数据uni.request

     完整代码: 核心 使用的方法 uni.request({...});  与接口相连接的路径 注:这里标红的部分为全局变量 例如: url:\\\'https://域名/api/Produce/select_employee\\\'(表示在使用该域名下的api中的Produce文件的select_employee方法) url: getApp().globalData.position + \\\'Produce/select_employee\\\', 传入数据到后端 

    2024年02月16日
    浏览(48)
  • uni-app: onBackPress() 监听页面返回 - 更新数据

    生命周期 - onBackPress() 监听页面返回 函数名 说明 平台差异说明 onBackPress 监听页面返回 ,返回 event = {from:backbutton、 navigateBack} ,backbutton 表示来源是左上角返回按钮或 android 返回键;navigateBack表示来源是 uni.navigateBack ;详细说明及使用:onBackPress 详解。支付宝小程序只有真机

    2024年02月11日
    浏览(63)
  • uni-app 的条件编译(APP-PLUS 、H5、MP-WEIXIN )

    条件编译是用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同平台。 写法:以 #ifdef 或 #ifndef 加 %PLATFORM% 开头,以 #endif 结尾。 1 #ifdef:if defined 仅在某平台存在 2 #ifndef:if not defined 除了某平台均存在 3 %PLATFORM%:平台名称

    2024年02月09日
    浏览(47)
  • uni-app返回上一个页面并进行页面刷新

    适用两个不同的页面跳转,返回上一个页面保存并刷新修改后的数据(也解决了uni-app的navigateBack返回不刷新的方法之一) 当前页: 上一页: 思路: 1、用getCurrentPages()获取打开的页面 2、保存当前页面和上一个页面 提示:不确定是不是从当前页跳转到上一页就console.log(pages[pa

    2024年02月12日
    浏览(58)
  • uni-app小程序uni.navigateBack返回上一个页面并传递参数.返回上个页面并刷新

    返回上一个打开的页面并传递一个参数。有种办法就是使用 假如从B页面返回A页面: 经过测试,在uni.app中使用B页面使用setData设置A页面参数无法实现(应该是被更改为常量属性了)。 打印console.log(prevPage)前一页面对象可得: 方法1:我们可以使用A页面原有方法 B页面传递:

    2024年02月16日
    浏览(62)
  • uni-app微信小程序,在页面顶部添加返回按键,返回上一个页面

    1.示例: 2.实现方式: 在page.json文件中的style里添加如下代码: 3.tips: 在page.json中的页面顺序就是小程序加载过程中的页面顺序

    2024年02月12日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包