前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >视频截图并上传

视频截图并上传

作者头像
Jimmy_is_jimmy
发布2022-09-26 16:44:01
1.8K0
发布2022-09-26 16:44:01
举报
文章被收录于专栏:call_me_R

本文,我们来谈谈,我们对视频进行截图之后,预览没问题之后,进行上传,我们应该怎么做呢?

思路:

  1. 获取视频当前画面的信息
  2. 通过 canvas 绘制当前的视频画面,并形成 base64 的数据
  3. 通过接口上传到服务器,这里可以采用下面的两种方式
  4. 直接将 base64 作为数据传递给后端,后端进行转文件存储
  5. 前端将 base64 数据转文件数据后传递给后端,后端进行文件存储

下面,我们通过 angular 来实现下:

获取视频信息

代码语言:javascript
复制
public video: any = null;
public videoWidth: number = 0;
public videoHeight: number = 0;

public getVideoInfo(): void {
  this.video = document.getElementById('video');
  this.videoWidth = this.video.videoWidth;
  this.videoHeight = this.video.videoHeight;
}

上面通过 dom 节点获取视频,然后获取视频的宽度和高度。

生成 base64

代码语言:javascript
复制
public canvas: any = null;

getScreenshotsVideoBase64(): string {
  this.canvas = document.createElement('canvas');
  this.canvas.width = this.videoWidth;
  this.canvas.height = this.videoHeight;
  const ctx = this.canvas.getContext("2d");
  
  ctx.drawImage(this.video, 0, 0, this.videoWidth, this.videoHeight);
  
  const base64 = this.canvas.toDataURL('image/jpeg');
  
  return base64
}

我们首先创建一个 canvas 画布,并设置了画笔的大小 widthheight,之后创建上下文 ctx(也就是创建了画笔🖌️)。然后我们将当前 video 的画面绘制 drawImage 到画布上面。最后,生成 base64 数据并返回。

上传

我们获取到了 base64,那么此时我们上传给到后端处理数据了。

base64 上传
代码语言:javascript
复制
public submit():void {
  this.videoScreenshotService.postVideoScreenshot({
    base64: this.getScreenshotsVideoBase64()
  }).subscribe({
    next: (res: any) => {
      console.log(res);
    },
    error: (error: any) => {
      console.log(error);
    }
  })
}

这里我们新开一个服务,将 base64 作为 body 参数传递过去。该服务的内容可如下:

代码语言:javascript
复制
import { UrlService } from '@services/url.service';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';

export class VideoScreenshotService {
  constructor(
    public http: HttpClient,
    public urlService: UrlService
  ) { }
  
  // 添加视频截图
  public postVideoScreenshot(data: any): Observable<any> {
    return this.http.post(`${ this.urlService.screenShotUrl() }`, {
      base64: data.base64
    });
  }
}

当然,这一步,我们可以将 base64 赋值给 imgsrc 属性,来预览图片效果

嗯,我们可以采用另一种方式给到后端处理。

生成文件上传

我们需要将 base64 转换成文件。我们先将其转换成 blob

代码语言:javascript
复制
// base64 转 blob
public getBlob(canvas: any): any {
  let data = canvas.toDataURL('image/png', 1);
  data = data.split(',')[1];
  data = window.atob(data);

  const ia = new Uint8Array(data.length);
  for(let i = 0; i < data.length; i++) {
    ia[i] = data.charCodeAt(i);
  }
  // 返回 blob 对象
  return new Blob([ia], {
    type: 'image/png'
  })
}

然后我们就可以将 blob 对象转换成文件:

代码语言:javascript
复制
const blobData = this.getBlob(this.canvas);
// 生成
const blobToFile = new window.File([blobData], this.videoTitle, { type: 'image/*' });

然后我们就可以将文件上传到后端:

代码语言:javascript
复制
public submit():void {
  const blobData = this.getBlob(this.canvas);
  // 生成和上传文件流
  const blobToFile = new window.File([blobData], this.videoTitle, { type: 'image/*' });
  const form_data = new FormData();
  form_data.append('file', blobToFile);
  form_data.append('snapshot', JSON.stringify({
    title: this.videoTitle, // 截图的标题
    remark: this.videoRemark, // 截图的备注
    snapshotTime: this.selectedStartMoment.valueOf() // 截图的时间
  }));
  
  this.videoScreenshotService.postVideoScreenshot(form_data).subscribe({
      next: (res: any) => {
        console.log(res);
      },
      error: (error: any) => {
        console.log(error);
      }
    })
}

相关的服务可写成下面👇:

代码语言:javascript
复制
// 添加视频截图
public postVideoScreenshot(formData: any): Observable<any> {
  return this.http.post(`${ this.urlService.screenShotUrl() }`, formData);
}

往期精彩推荐

如果读者觉得文章还可以,不防一键三连:关注➕点赞➕收藏

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 获取视频信息
  • 生成 base64
  • 上传
    • base64 上传
      • 生成文件上传
      • 往期精彩推荐
      相关产品与服务
      文件存储
      文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档