Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用H5的video标签播放视频,拍照保存和上传

使用H5的video标签播放视频,拍照保存和上传

作者头像
张云飞Vir
发布于 2021-04-27 08:25:22
发布于 2021-04-27 08:25:22
2.1K00
代码可运行
举报
文章被收录于专栏:写代码和思考写代码和思考
运行总次数:0
代码可运行

播放视频

HTML <video> 元素 用于在HTML或者XHTML文档中嵌入媒体播放器,用于支持文档内的视频播放

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<video controls width="250">

    <source src="/media/cc0-videos/flower.webm"
            type="video/webm">

    <source src="/media/cc0-videos/flower.mp4"
            type="video/mp4">

    Sorry, your browser doesn't support embedded videos.
</video>

对视频截图(拍照)

通过canvas 来对正在视频截图,即在 canas 上绘制 video 标签内的视频图像,然后 使用 canvas.toDataURL() 方法输出 base64 文本描述的图像。

canvas.toDataURL() 方法返回一个包含图片展示的 data URI 。默认为 PNG 格式。图片的分辨率为96dpi。文本以“data:image/png”开头

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        var canvas = document.createElement("canvas");
        canvas.width = video.videoWidth * scale;
        canvas.height = video.videoHeight * scale;
        canvas.getContext('2d')
           .drawImage(video, 0, 0, canvas.width, canvas.height);
        var img = document.createElement("img");
        //console.log(canvas.toDataURL());
        //方法返回一个包含图片展示的 data URI 。默认为 PNG 格式。图片的分辨率为96dpi
        img.src = canvas.toDataURL();
        $output.prepend(img);

将对视频拍照的图片保存到本地

简单来说就是创建一个隐藏的link 标签,补充它的属性,在点击它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        //下面是保存到 本地的方法
        var link = document.getElementById('link');
        link.setAttribute('download', 'img_.png');
        link.setAttribute('href', canvas.toDataURL("image/png").replace("image/png", "image/octet-stream"));
        link.click();

将拍照后的base64 图片上传到后台

前端代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  //下面是 上传的方法
        //删除字符串前的提示信息 "data:image/png;base64,"
        var data = canvas.toDataURL();
        var img_base64 = data.substring(22);
        $.ajax({type:"POST", url: "/uploadfile", data: { data: img_base64, name: 'file' }, success:
             function (){
               $output.prepend("upload done!");
             }
         });
      };

接收图片的后端代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @description:
 * @author: zhangyunfei
 * @date: 2021/4/25 19:22
 */
@RestController
@RequestMapping()
public class UploadFileController {
    public static final String IMAGE_STORE_DIR = "/Users/zhangyunfei/Downloads/video/public";
    private static final String TAG = UploadFileController.class.getSimpleName();

    @PostMapping(value = "/uploadfile", name = "接收上传文件")
    public String cleanAlarm(String name, String data) {
        LogUtil.d(TAG, "name=%s, data=%s", name, data);
        saveFile(data);
        return "ok";
    }

    private void saveFile(String data) {
        try {
            Base64.Decoder decoder = Base64.getDecoder();
            byte[] bytes1 = decoder.decode(data);
            String fileName = UUID.randomUUID().toString() + ".png";
            File path = new File(IMAGE_STORE_DIR, fileName);
            FileOutputStream writer = new FileOutputStream(path);
            writer.write(bytes1);
            writer.close();
            LogUtil.d(TAG, "## 保存文件成功,路径=%s", path.getPath());
        } catch (IOException e) {
            e.printStackTrace();
            LogUtil.d(TAG, "## 保存文件失败,%s", e);
        }
    }

附录

补充:准备一个mp4的视频源 后端采用java实现,首先准备一个 mp4 的视频文件。新建一个springboot 工程,将 某个文件夹映射为静态资源目录,代码如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class ResourceConfig {
    private static final String TAG = "## ResourceConfig";

    // 图片URL 路径映射的 根
    public static final String IMAGE_PATH_PATTERNS = "/img";
    public static final String IMAGE_STORE_DIR = "/Users/zhangyunfei/Downloads/video/public";

    public ResourceConfig() {
        LogUtil.d(TAG, "instance !");
    }

    @Bean
    public WebMvcConfigurer resourceConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addResourceHandlers(ResourceHandlerRegistry registry) {
                // 将整个 img 文件配置成静态资源
                String pathPatterns = IMAGE_PATH_PATTERNS + "/**";
                String locations = "file:" + IMAGE_STORE_DIR + "//";
                registry.addResourceHandler(pathPatterns)
                        .addResourceLocations(locations);

                LogUtil.d(TAG, "## 静态资源路径映射:%s --> %s", pathPatterns, locations);
            }
        };
    }
}

补充:最后贴出完整的前端代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html>
<head>
  <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>

  <script type="text/javascript">

    $(document).ready(function(){
      let $output, video;
      let scale = 1;// 控制 图片的缩放比率

      var initialize = function() {
        $output = $("#output");
        video = $("#video").get(0);
        $("#capture").click(captureImage);
      };

      var captureImage = function(){
        console.log("video.videoWidth=%s, video.videoHeight=%s",video.videoWidth,video.videoHeight)

        var canvas = document.createElement("canvas");
        canvas.width = video.videoWidth * scale;
        canvas.height = video.videoHeight * scale;
        canvas.getContext('2d')
           .drawImage(video, 0, 0, canvas.width, canvas.height);
        var img = document.createElement("img");
        //console.log(canvas.toDataURL());
        //方法返回一个包含图片展示的 data URI 。默认为 PNG 格式。图片的分辨率为96dpi
        img.src = canvas.toDataURL();
        $output.prepend(img);

        //下面是保存到 本地的方法
        //var link = document.getElementById('link');
        //link.setAttribute('download', 'img_.png');
        //link.setAttribute('href', canvas.toDataURL("image/png").replace("image/png", "image/octet-stream"));
        //link.click();

        //下面是 上传的方法
        //删除字符串前的提示信息 "data:image/png;base64,"
        var data = canvas.toDataURL();
        var img_base64 = data.substring(22);
        $.ajax({type:"POST", url: "/uploadfile", data: { data: img_base64, name: 'file' }, success:
             function (){
               $output.prepend("upload done!");
             }
         });
      };

      initialize();

    });
  </script>
</head>

<body>
    <video id="video" controls autoplay>
      <source src="http://localhost:8080/img/hmbb.mp4"/>
       您的浏览器不支持 video 标签。
    </video>
    <p/>
    <button id="capture">Capture</button>
    <div id="output"></div
    <!-- 故意不显示这个按钮 -->
    <a id="link" style="display:none">保存图片</a>
</body>

</html>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
TSINGSEE青犀视频开发EasyWasmPlayer H265播放器如何实现视频截图
在我们做视频开发的过程中,会遇到不少需求,其中视频截图就是一个比较常见的需求,因此TSINGSEE青犀视频不管是在设计视频平台还是视频播放器的时候,我们都会在原有开发的基础上对视频截图进行一些功能拓展。
TSINGSEE青犀视频
2021/02/03
7940
h5页面实现扫码功能
后端参考文章 https://blog.csdn.net/qq_37924224/article/details/109582507
用户6379025
2022/12/26
1.7K0
Web端拍照的另一种实现方式
上篇文章大致总结了成为技术负责人需要的能力。今天本来聊一下web端的拍照方案方案。web端的拍照方案大致有以下两种,一是我们比较常见的图片上传的方案<input type="file" capture=camera/>可以调起摄像头。另外一种就不太常见了,利用webrtc的api方法navigator.mediaDevices.getUserMedia。
terrence386
2022/07/14
5100
如何用 WebRTC 给自己拍照?
最近一直在看 WebRTC 的用法,也学了一下音视频流的东西,今天就跟大家分享一个好玩的小实战吧——给自己拍照。
写代码的海怪
2022/03/29
9950
如何用 WebRTC 给自己拍照?
Web实战:如何进行视频截图
由于前段时间事情比较多,文章的更新就给耽误了,项目需要上线经常加班,再加上自己的一些学习计划,一晃就是一个多月,没有更新文章。
六小登登
2019/06/19
1.4K0
50行代码搞定OneCode摄像头插件:快速定制实战指南
在工业监控、人脸识别等场景中,摄像头集成是常见需求。本文将以OneCode平台的xui.UI.Camera组件为例,展示如何用50行核心代码实现一个功能完备的摄像头插件,涵盖设备访问、视频流显示和拍照功能,并提炼OneCode插件开发的核心要素。
onecode
2025/07/06
710
Electron音视频相关
比如我的耳机既能听声音又有麦克风,那么获取到的音频输入和音频输出设备的groupId就会是一样的。
码客说
2021/02/04
2.5K1
神奇canvas 带你实现魔法摄像头
我们用手机的摄像头自拍,很容易实现 简单的自拍效果,如复古、黑白等等。其实我们使用web端的JavaScript也是可以实现的。接下来就带领小伙伴实现一个魔法摄像头。并且提供了截图下载功能。
万少
2025/02/10
1520
神奇canvas 带你实现魔法摄像头
如何使用JavaScript访问设备摄像头(前后)
在这篇文章中,我将向您展示如何通过 JavaScript 在网页上访问设备的摄像头,并支持多种浏览器,而无需外部库。
张张
2020/06/10
12.1K1
视频截图并上传
本文,我们来谈谈,我们对视频进行截图之后,预览没问题之后,进行上传,我们应该怎么做呢?
Jimmy_is_jimmy
2022/09/26
2.1K0
# 前端图片压缩方案
先通过 js 中 img 构造函数,实例化 img 对象,后将图片的路径给转移到中,再建立一个 canvas 画布,后对画布进行各方面的数值的设置。
九旬
2023/10/19
3070
富媒体在客服IM消息通信中的秒发实践
客服一站式平台旨在为得物生态内的客服域服务人员提供一站式的服务办公平台。我们有多条业务线,客服在和用户聊天的过程中,有很多场景需要发送富媒体。跟普通的文本传输相比,富媒体可以直观的让用户了解到消息内容,但是在传输过程中也面临着文件大、内存消耗大、传输过程漫长等问题。
得物技术
2022/08/09
1.6K1
富媒体在客服IM消息通信中的秒发实践
web H5摄像头-Media-Recorder-API-Demo
media-recorder-api <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>拍照2</title> </head> <body> <div style="display: block"> <button id="take" >拍照</button> <button onclick="upload()" >保存照片</button> <button
2021/11/08
5840
canvas视频截帧
Promise博客:https://vampireachao.gitee.io/2021/12/04/Promise/
阿超
2022/09/28
6720
canvas视频截帧
来了!新一代 App 视觉增强辅助方案它真的来了!
17世纪之前,欧洲人认为天鹅都是白色的,但忽然有一天,人们看到了第一只黑天鹅,随着这个黑天鹅的出现,人们认知彻底坍塌,一切秩序都面临着推倒重建。
开发者技术前线
2020/11/23
6220
来了!新一代 App 视觉增强辅助方案它真的来了!
get两个js小技能——JS截取视频第一帧&图片转Base64
背景 由于开发之前做的VisualDrag拖拽模板优化的时候,拖拽进去的图片、视频文件等需要进行截图作为封面,目前采用的截图方法是htme2canvas,使用canvas进行的截图操作,所以就会遇到这样的问题,视频和图片图床简单的使用标签加入canvas画布里面无法正确的截图成功。最后采取的措施就是将图片转为base64画入canvas,将视频截取第一帧图片,然后画进canvas,最后进行截图,最后经过折腾,这个方法好像成功了,写这篇博客进行记录下。 JS截取视频第一帧 截取视频的第一帧作为视频的封面
不愿意做鱼的小鲸鱼
2023/03/23
7.1K0
get两个js小技能——JS截取视频第一帧&图片转Base64
前端H5生成海报
最近项目需要涉及到前端海报合成分享功能,前端靠不上只能自己上... 现学现卖 相关链接
北溟有鱼QAQ
2022/09/16
5630
前端图片压缩
HTMLCanvasElement.toDataURL() 方法返回一个包含图片展示的 data URI 。
码客说
2022/12/01
3K0
【Web技术】907- 前端图片最优化压缩方案
上传图片/视频/文件是我们经常会遇到的问题,但是一旦图片过大就会导致不好的操作体验。图片上传是前端中常见的的业务场景。无论是前台还是后台,适当的对图片进行压缩处理, 可以显著的提升用户体验。而在后台管理系统中,图片压缩不仅仅能够提升后台管理员操作体验,更是可以防止后台设置过大的图片导致前台图片加载过久,从而影响用户体验。
pingan8787
2021/04/07
1K0
【Web技术】907- 前端图片最优化压缩方案
图片旋转后保存到数据库
tianyawhl
2024/04/30
3620
相关推荐
TSINGSEE青犀视频开发EasyWasmPlayer H265播放器如何实现视频截图
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验