video用canvas实现截图和上传

本文介绍了如何使用canvas从video元素中截取图像并将其以base64编码的方式上传到服务器。首先在HTML中设置video和canvas元素,然后在JavaScript中使用drawImage方法绘制视频到canvas,并通过toDataURL方法获取图像数据。最后,通过POST请求将数据发送到服务器,服务器端使用BASE64Decoder解码并保存到指定路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开通博客这么久一直没有写什么,现在对自己在学习中用到的方法总结,方便自己也希望能帮助到别人。

我之前在再项目中实现了利用canvas对video进行截图并保存,我的思路是通过canvas的drawImage方法绘制截图,然后通过canvas.toDataURL('image/png');方法保存为图像。图像为“data:image/png;base64,iVBORw0KGgoAAAAN......”这样的字符串,经过post传输方式传到服务器,将“data:image/png;base64,iVBORw0KGgoAAAANSU......"截取为”iVBORw0KGgoAAAANSUhEUgAAAe“ 字符串,再用BASE64Decoder解码结合FileOutputStream保存到服务器重指定路径。具体代码如下:

1.前台页面中合适位置写入:

<!-设置video和canvas标签,video中controls="ture" : 带播放控件,loop="loop" 循环播放,autoplay="autoplay" : 加载后自动播放,height,width:高和宽

canvas:style中设置画布样式,我根据自己需要不显示-->

<video id="media" src="../${sessionScope.danchapter.chContent}" controls="ture" loop="loop"   height="100%" width="100%" autoplay="autoplay">视频走丢了。。</video>
      <canvas style="display:none"></canvas>

2.js函数中截图并传到服务器

function jietu(){
var video = document.getElementById("media");//获取前台要截图的video对象,
var canvas = document.querySelectorAll('canvas')[0];//获取前台的canvas对象,用于作图
var ctx = canvas.getContext('2d');//设置canvas绘制2d图,
var width = 480;//设置canvas宽
var height = 270;//设置canvas高
canvas.width = width;
canvas.height = height;
ctx.drawImage(video, 0, 0, width, height);//将video视频绘制到canvas中
var images = canvas.toDataURL('image/png');//canvas的api中的toDataURL()保存图像
$.post("comment_shengcheng",{images:images},function(data){//将数据发以post方式,发送到服务器,"comment_shengcheng":struts2的通配方式(Action名_处理方法名)
  if(parseInt($.trim(data))==1){//传回数据做判断是否成功
   console.info("视屏保存成功");
  }else{
   console.info("视频保存失败");
  }
 });
}

3.我使用的struts2中action方式,如果是servlet方式思想一样。

public String shengcheng(){
byte[] buffer;//图像转换的目的字节数组
String yuliu1="upload/screen_" + new Date().getTime() + ".png";//对应服务器中保存文件的名字
String ab=images.substring(22);//images为图片字符串数据,通过spring方式获取,在这里截去字符串中”data:image/png;base64,“,使其格式正确
BASE64Decoder base64=new BASE64Decoder();  //新建64位解码器
try {
buffer = base64.decodeBuffer(ab);//64位解码到字节数组中
//写进文件  创建一个向具有指定名称的文件中写入数据的输出文件流。创建一个新 FileDescriptor 对象来表示此文件连接。
String sdPath=ServletActionContext.getServletContext().getRealPath("");//获得服务器中项目上一层路径,即是web的根路径,这里用的tomcat。
FileOutputStream fos=new FileOutputStream(new File(sdPath.substring(0,sdPath.lastIndexOf("\\"))+"/"+yuliu1)); //设置好保存路径,创建文件输出流。
fos.write(buffer);  //写入
fos.flush();  //刷新
fos.close();  //关闭
fos=null;//释放

} catch (IOException e) {
e.printStackTrace();
}

}

以上是我的操作,实现方式比较简单,希望大家多指点。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值