js获取视频第一帧生成图片

摘要:
但客户的视频存储在直接上传的腾讯云COS对象中。如果它们存储在云点播中,我仍然可以获得封面截图的媒体信息,但现在除了一些文件信息外,我什么都无法获得。前端视频文件传输到后台。我首先将它们存储在本地,然后使用PHP视频插件生成图片并保存在本地。这两个文件一起上传到腾讯云COS后,当它们返回链接时,我会删除本地文件……嗯……这有点鸡肋,我也讨厌麻烦。我决定使用第二种曲线救国的方法。第二种方法是曲线救国。

好久没上来博客园都落灰了,最近太忙,今天搞的一个视频小程序,由于小程序性能问题,一次加载很多视频会卡,所以需要先展示图片,于是我在后端加了上传封面图的按钮。本来一切很自然,but...客户不愿意上传图片。他说“你知道要增加多少工作量吗”?wtf??好吧,我给你生成图片,不要你自己上传。

but客户的视频是直接上传的腾讯云的cos的对象储存的,他要是存到云点播我还有有法儿拿封面截图媒体信息啥的,但是现在我除了拿点儿文件信息也拿不到别的了。

脑海里闪出两个idea:

第一:迂回式。 前端视频文件传到后台,我先存在本地,然后用php的视频插件去生成图片保存在本地,完事儿两个一起上传到腾讯云cos,等他俩返回链接我再删掉本地的文件...emmmm...有点鸡肋,我也嫌麻烦,果断采用第二种方法曲线救国

第二:曲线救国式。既然不想用后端完成,那就走前端js,大概的流程应该是用户选择文件后生成blob预览,同时传到后台放到cos上,然后把video放到canvas上面做个快照,然后就能拿到图片预览

上面是废话,下面是重点

----------------------------------------------------------------------------------------------------------废话分割线--------------------------------------------------------------------------------------------------------

代码如下:

1、将用户选择的文件转为blob生成预览,uploadFile2是fromData上传文件的方法

        $('#file').on('change', function() {
            var files = this.files,
                video = $('#video').find('video'),
                videoURL = null,
                windowURL = window.URL || window.webkitURL;
            if(files && files[0]) {

                uploadFile2(files[0],1);
                videoURL = windowURL.createObjectURL(files[0]);
                $('#imgSmallView span').html('请等待图片生成');
                $('#video video').attr('src', videoURL);
                $('#video video').trigger('click');
                setTimeout(function() {
                    createIMG(files[0].name.split('.')[0]+'.png');
                }, 3500);
            }
        }).trigger('change');

2、生成图片

        function createIMG(name) {
            var scale = 0.35,
                video = $('#video').find('video')[0],
                canvas = document.createElement("canvas");

            canvas.width = video.videoWidth * scale;
            canvas.height = video.videoHeight * scale;
            var flag = true;
            for(var flag = true; flag; ) {
                if(canvas.width > 400) {
                    canvas.width *= 0.9;
                    canvas.height *= 0.9;
                } else {
                    flag = false;
                }
            }
            canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);
            saveImage(canvas, name);
        }

3、保存图片预览

  第一步把刚才画出来的转成base64

  第二步把base64转为file送到后台上传

  前端同时生成预览

        function saveImage(_canvas, _name) {
            var imagebase64 = _canvas.toDataURL('image/png').replace('image/png', 'image/octet-stream');
            var imgURL = image.getFileFromBase64(imagebase64, 'imgName');
            console.log(imgURL);
            uploadFile2(imgURL,2)
            $('#imgSmallView span').html('图片生成完成,可以进行下一步操作');
        }

本来不打算转base64,但是叭直接传给cos他返回的图片是空的,无奈只能手动转成file

        var image= {
            /* 将图片(路径)转换为Base64 */
            getBase64FromImageURL(url, callback) {
                var canvas = document.createElement('canvas'),
                    ctx = canvas.getContext('2d'),
                    img = new Image;
                img.crossOrigin = 'Anonymous';
                img.onload = function () {
                    canvas.height = img.height;
                    canvas.width = img.width;
                    ctx.drawImage(img, 0, 0);
                    var base64URL = canvas.toDataURL('image/png');
                    callback(base64URL);
                    canvas = null;
                };
                img.src = url;
            },
            /* 将base64转换为file类型 */
            getFileFromBase64(base64URL, filename) {
                var arr = base64URL.split(','),
                    mime = arr[0].match(/:(.*?);/)[1],
                    bstr = atob(arr[1]),
                    n = bstr.length,
                    u8arr = new Uint8Array(n);
                while (n--) {
                    u8arr[n] = bstr.charCodeAt(n);
                }
                // alert(mime)
                return new File([u8arr], filename, {type: 'image/png'});
            }
        }

经过三个小时的摸索,终于成功了,虽然代码也是东拼西凑这一点儿那儿一点儿看过来的,不过好歹是完成了客户“偷懒”的需求,开熏!

免责声明:文章转载自《js获取视频第一帧生成图片》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Selenium Grid + Maven + TestNG + Jenkins 完成Selenium 分布式并发测试FreeRTOS中断优先级配置(重要)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何修改iframe内的页面的元素的样式。。。。

方法一: 直接通过设置backgroundColor的颜色即可:<!DOCTYPE html><html><head><script>function changeStyle(){var x=document.getElementById("myframe");var y=(x.contentWindow |...

Python web前端 06 运算符 循环

Python web前端 06 运算符 循环 一、运算符 #JS六大数据类型 #number 数字 #string 字符串 #boolean 布尔型 #function 函数 #undefined 未定义:一个变量声明之后没有复制就是未定义 #object 对象 在JS里面null属于对象类型,但是它不具有很多对象的共性,所以很多资料将他归为单...

JS 滚动条滚动到指定元素触发

JS 版 <!DOCTYPE html> <html> <head> <style type="text/css">#showIt { 200px; height: 200px; background-color: red;...

远程连接ubuntu的MongoDB遇到的坑

首先连接不上,先查看云服务器上的安全组是否添加了对应的端口 如果打开了,那么久查看MongoDB是否允许远程连接 # mongod.conf # for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-optio...

NodeJs实现下载Excel文件

nodejs作为一门新的语言,报表功能也不是十分完善。 (1).js-xlsx: 目前 Github 上 star 数量最多的处理 Excel 的库,支持解析多种格式表格XLSX / XLSM / XLSB / XLS / CSV,解析采用纯js实现,写入需要依赖nodejs或者FileSaver.js实现生成写入Excel,可以生成子表Excel,功能强...

前端小白之每天学习记录----js简单的组件封装

设计模式:是解决问题的模板 关于设计模式,可以阅读汤姆大叔的博文http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html 这里简单介绍两种设计模式: 1.单例模式:单例就是保证一个类只有一个实例       eg:在JavaScript里,实现单例的方式有很多种,其中最简单的一个方式是使用对象...