Canvas动画制作并转为视频合并音乐
1、canvas动画说明
10种动画每种都可以拆分为前后两部分; 前部分为第一张做动作(缩放、左右上下移动), 后一部分为第二张图片进场,进场方式多种根据特效而定;
各动画的具体实现参考各动画的代码
用到的主要api : 切片 drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)
img | 规定要使用的图像、画布或视频。 |
---|---|
sx | 可选。开始剪切的 x 坐标位置。 |
sy | 可选。开始剪切的 y 坐标位置。 |
swidth | 可选。被剪切图像的宽度。 |
sheight | 可选。被剪切图像的高度。 |
x | 在画布上放置图像的 x 坐标位置。 |
y | 在画布上放置图像的 y 坐标位置。 |
width | 可选。要使用的图像的宽度。(伸展或缩小图像) |
height | 可选。要使用的图像的高度。(伸展或缩小图像) |
主要关键点: 动画暂停、图片比例兼容和3:4制作兼容、时长控制
动画暂停只在用户操作页面上需要该功能;
实现思路:首先弄一个变量来判断是暂停还是播放状态,动画实现是通过定时任务一直重复调动画方法,直到达到某条件才结束;
因此实现暂停是在每个动画方法开头进行暂停判断,如果是暂停状态就 将当前动画的一些参数存入全局变量 然后return动画方法; 继续的话同样调动画方法,只不过需要将动画的特有参数从全局变量中取出来,从而实现动画的继续渲染;
图片比例兼容和3:4兼容,图片不能变形,确定好怎么截取图片,
设计要点:动画画布必须被铺满、图片只能等比缩放(不能变形)、如果图片取不完,则取图片中心区域(高度多了就取中间部分,宽度多了同理)
时长控制: 目前所有动画四张图片时长误差在100毫秒之内,即9秒视频的误差在100毫秒之内;
定时任务最终采用的setTimeout;用过requestAnimationFrame测试,达不到定时效果,它跑完之后直接继续跑,如果要改成这个 需要去微调动画 “递归” 退出条件的增长量或减少量;
2、动画转视频 视频转码 合成音频 以及上传
动画转视频
参考api : MediaStream = canvas.captureStream(frameRate);
能将canvas画布上的动画转为视频流,问题是需要动画播放完(即动画多长转多长),考虑到用户不会等或进行其他操作,所以单独在其他项目渲染动画再转为视频;
视频转码
前端转码参考 FFmpeg
他的api run方法里面能直接使用 ffmpeg 的 转码命令(语法稍微不一样,空格变成逗号)
代码 (template-renderer项目)
//转MP4、合成音频async getMp4(blob) {let startTime = new Date()let file = new window.File(blob, 'webmVideo', {type: 'video/webm'})const { createFFmpeg, fetchFile } = FFmpegconst ffmpeg = createFFmpeg({log: true,// eslint-disable-next-line no-unused-varsprogress: ({ ratio }) => {// console.log(`Complete: ${(ratio * 100.0).toFixed(2)}%`)}})const { name } = fileawait ffmpeg.load()ffmpeg.FS('writeFile', name, await fetchFile(file))let musicBlob = await this.getMusic()//转码 webm => mp4await ffmpeg.run('-i', name, 'outputMp4Video.mp4')console.log('BBT 转码完成')//构建音频// let musicBlob = await this.getMusic()let fileMusic = new window.File(musicBlob, 'mp3Music', {type: 'audio/mpeg'})const nameMusic = 'mp3Music'ffmpeg.FS('writeFile', nameMusic, await fetchFile(fileMusic))console.log('BBT 加载音乐完毕')//剪切音乐let musicTime = Math.ceil(this.images.length * 2.25)musicTime = musicTime < 10 ? `0${musicTime}` : musicTime// # ffmpeg -i aa.mp3 -ss 00:01:12 -t 00:01:42 -acodec copy bb.mp3await ffmpeg.run('-i',nameMusic,'-ss','00:00:00','-t',`00:00:${musicTime}`,'-acodec','copy','mp3MusicNew.mp3')//加背景音乐// ffmpeg -i 1.mp3 -i 1.mp4 outputname.mp4await ffmpeg.run('-i','mp3MusicNew.mp3','-i','outputMp4Video.mp4','endMusicMp4Video.mp4')console.log('BBT 剪切背景音乐 合成音乐 结束')//最终数据const data = ffmpeg.FS('readFile', 'endMusicMp4Video.mp4')console.log('BBT 加载最终视频文件')// let byte = new Blob([data.buffer], {// type: 'video/mp4'// })let aTemp = document.createElement('a')aTemp.href = URL.createObjectURL(new Blob([data.buffer], {type: 'video/mp4'}))aTemp.download = '40Test.mp4'aTemp.click()const video = document.getElementById('video-mp4')video.src = URL.createObjectURL(new Blob([data.buffer], {type: 'video/mp4'}))let endTime = new Date()let mm = endTime.getTime() - startTime.getTime()console.log('视频时长:', this.videoDuration, ';转换时间:', mm / 1000)},//加载音乐资源getMusic() {let that = thisreturn new Promise(function(res, rej) {let musicBlob = []let xhr = new XMLHttpRequest()xhr.open('get', that.musicUrl, true)xhr.responseType = 'blob'xhr.onload = function() {if (xhr.status == 200) {musicBlob.push(xhr.response)console.log(musicBlob)res(musicBlob)} else {rej()}}xhr.send()})},
后端转码 使用的 javacv
参考博客 转码 合并音频 其他 JAVE2
上传
后台将最终视频文件上传到oss
3、项目功能简述
涉及项目:用户操作页面、后台、node服务(模拟浏览器项目)、renderer页面(渲染项目)
用户操作页面:让用户直观看到“视频”效果、实现暂停继续播放、音频同步播放暂停、视频制作请求后台
后台:接收请求、存/更新记录到数据库、转调服务(调node服务)、视频处理(视频转码音频合并)、上传视频到oss
node服务:模拟浏览器行为,通过url打开页面并调用其方法(打开renderer渲染页面,让其开始渲染动画)
renderer页面:渲染动画、将动画转为视频流然后发送给后台处理
动画代码示例
Canvas动画制作并转为视频合并音乐相关推荐
- 使用稿定设计如何给制作好的视频加音乐?
对视频进行在线制作时,给视频添加好听的背景音乐,可以增加视频的听觉冲击力,在一些原声视频中,很多人会将原声分离出来,然后再通过视频制作软件添加一些好听的背景音乐. 稿定设计软件是一款比较不错的在线编辑 ...
- 前端canvas动画如何转成mp4视频
本文原创:huanghaijin 项目背景 用户通过上传合适尺寸的图片,选着渲染动画的效果和音乐,可以预览类似幻灯片的效果,最后点击确认生成视频,可以放到头条或者抖音播放. 生成视频可能的方案 纯前端 ...
- java mp4视频转换成h5_前端canvas动画如何转成mp4视频的方法
用户通过上传合适尺寸的图片,选着渲染动画的效果和音乐,可以预览类似幻灯片的效果,最后点击确认生成视频,可以放到头条或者抖音播放. 生成视频可能的方案 纯前端的视频编码转换(例如WebM Encoder ...
- 十大经典三维动画制作软件
十大三维动画制作软件(转载) <侏罗纪公园>.<第五元素>.<泰坦尼克号><终结者3>这些电影想必大家都看过了吧,我们为这些影片中令人惊叹的特技镜头所打 ...
- 十大三维动画制作软件(转载)
<侏罗纪公园>.<第五元素>.<泰坦尼克号><终结者3>这些电影想必大家都看过了吧,我们为这些影片中令人惊叹的特技镜头所打动,当我们看着那些 异常逼真的 ...
- Unity TimeLine丨B.赛车过场动画制作及视频展示
观看视频请点我 TimeLine源文件:如有需要请留言邮箱 赛车过场动画制作步骤: 1.导入赛车插件,打开其Demo Scenes里的RCC City 2.新建TimeLine GameObject, ...
- php把视频合成画中画,视频画面合并软件-怎么把多个视频合并到一个视频画面里面,制作多画面视频播放效果...
视频画面合并软件-怎么把多个视频合并到一个视频画面里面,制作多画面视频播放效果 平时我们在网上经常可以看到很多视频同一个视频画面带有很多个不同的视频在同时播放,这是怎么做到的呢?这个也叫视频画中画,用 ...
- html怎么把字放在图片上而不把图片设为背景音乐,音乐相册制作 将多张照片加背景音乐制作成相册视频的方法...
电子相册就是将拍摄的照片制作成视频播放,小编最开始知道的制作电子相册的方法就是用怎么的狸窝PPT转换器制作,先用PPT制作成相册幻灯片,然后将ppt文件转换成视频,这样制作的电子相册更具个性,制作方法 ...
- python随风飘落怎么画_树叶飘落动画制作 如何制作树叶飘落的动画?视频画面添加树叶随风飘落的动画效果...
最近真是有一点秋的凉意了呢~每天早上起床走出房间的时候,就能感觉到有点凉凉的气息,真好,酷暑终于过去了,希望不要再炎热了,啊哈哈.对于秋天,相信大家先想到的就是那种漫天的落叶了吧~那种秋风阵阵,落叶缤 ...
最新文章
- 廉颇老矣,尚能饭否?响鼓重擂,上阵杀敌!
- 编程心法 之什么是MVP What is MVP development?
- vs.net web项目使用visual source safe进行源代码管理(转)
- (1) 漂亮的日期控件
- 深度学习之基于Tensorflow2.0实现AlexNet网络
- const和define 区别
- 前端面试汇总(Bootstrap框架)
- Mac/Windows Android Studio / Visual Studio Code/Eclipse /Xcode 操作 快捷键 :代码多行选中等 (开发利器)多
- 给页面加上loading加载效果
- 466.统计重复个数
- 几种反函数和差角公式的推导
- 黑白和彩色CCD摄像机成像原理简介
- 亚马逊账号关联因素有哪些?如何避免账号之间关联
- 获取Angular中的AngularJS功能
- 嵌入式软件工程师面试题收录(4)
- 【JZOJ 5426】【NOIP2017提高A组集训10.25】摘Galo
- 同步Socket 与 异步 Socket
- 权限绕过漏洞(越权漏洞)
- 透过同程艺龙财报看OTA的2021:复苏潮下行业或迎新一轮角逐赛
- 一种基于智能卡登录Windows系统的实现方式
热门文章
- Reptile:requests + BeautifulSopu 实现古诗词网三国名著下载
- 中英文混合按照首字母排序
- 什么是数据湖?为什么要数据湖?如何建湖?如何ETL?
- android studio找不到X21,不必苦等Android P,这些“新”功能其实早在vivo X21就已实现...
- 【华为机试题分析-C/C++】知识点分类总结
- 计算机专业就业职位介绍
- python tk教程_【转】【Python】Tkinter教程
- Java后端阿里云短信平台发送短信
- c语言 不定参数printf的实现
- 企业如何构建自己的SRM系统