如何生成高清晰度的视频?

作者站长头像
站长
· 阅读数 6

如何生成高清晰度的视频?这个是使用 echarts 生成的图表,数据实际上是不断变化的,也就是支持动态排序的柱状图。例如如果 D 的数据大于 A 时,就会和 A 交换位置,并且有交换动画。现在希望把实时效果转化为视频,但是发现使用屏幕录制出来的效果不太清晰。而 echarts 渲染出来的是 canvas(也可以使用 svg 进行渲染),可以提高配置时的设备像素比提升清晰度,有什么方法可以直接使用 canvas 去生成视频?

回复
1个回答
avatar
test
2024-07-02

导出视频使用的是RecordRTC.js插件,这个插件使用了html2canvas,所以还需要引入这个插件

<!DOCTYPE html>
<html lang="cmn-hans">

<head>
    <meta charset="utf-8">
    <meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1">
    <meta name="renderer" content="webkit">
    <title>echarts to gif</title>
    <style>
        html,body,#myCanvas{
            height: 100%;
            width: 100%;
            padding: 0;
            margin: 0;
        }
    </style>
</head>

<body>
    <div id="myCanvas"></div>
    <script type="text/javascript" src="https://cdn.bootcss.com/echarts/4.7.0/echarts-en.min.js"></script>
    <script src="https://cdn.bootcss.com/html2canvas/0.5.0-beta4/html2canvas.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/RecordRTC/5.5.9/RecordRTC.js"></script>
    <script src="https://cdn.bootcss.com/FileSaver.js/1.3.8/FileSaver.min.js"></script>
    <script>
        let $parent = document.getElementById('myCanvas')
        let myChart = echarts.init($parent);
        //这里的option就是echrts案例中的option,代码太多,就不贴了
        myChart.setOption(option);
        
        setTimeout(function(){
            //开始录制
            exportToVideo(5000)
        },500)
        
        function exportToVideo(time){
            //time 为录制时长 毫秒
            time = time || 0
            
            let $canvas = document.querySelector('#myCanvas canvas')
            
            var recordRTC = RecordRTC($canvas, {
                type: 'canvas'
            });
            //开始录制
            recordRTC.startRecording();
            
            setTimeout(function(){
                //录制结束
                recordRTC.stopRecording(function(videoURL) {
                    console.log(videoURL)
                
                    var recordedBlob = recordRTC.getBlob();
                    //recordRTC.getDataURL(function(dataURL) { });
                    saveAs(recordedBlob, "test.mp4");
                });
            }, time)
        }
    </script>
</body>

</html>

导出gif,可以使用gif.js插件,相关代码如下

<!DOCTYPE html>
<html lang="cmn-hans">

<head>
    <meta charset="utf-8">
    <meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1">
    <meta name="renderer" content="webkit">
    <title>echarts to gif</title>
    <style>
        html,body,#myCanvas{
            height: 100%;
            width: 100%;
            padding: 0;
            margin: 0;
        }
    </style>
</head>

<body>
    <div id="myCanvas"></div>
    <script type="text/javascript" src="https://cdn.bootcss.com/echarts/4.7.0/echarts-en.min.js"></script>
    <script type="text/javascript" src="https://cdn.bootcss.com/gif.js/0.2.0/gif.js"></script>
    <!--<script type="text/javascript" src="https://cdn.bootcss.com/gif.js/0.2.0/gif.worker.js"></script>-->
    <script src="https://cdn.bootcss.com/FileSaver.js/1.3.8/FileSaver.min.js"></script>
    <script>
        let $parent = document.getElementById('myCanvas')
        let myChart = echarts.init($parent);

        //这里的option就是echrts案例中的option,代码太多,就不贴了
        myChart.setOption( option );
        
        setTimeout(function(){
            //开始录制gif
            exportToGif(5000)
        }, 20)
        
        function exportToGif(time){
            var start = Date.now()
            //time 为录制时长 毫秒
            time = time || 0
            
            let $canvas = document.querySelector('#myCanvas canvas')
            
            function loop(){
                //这里使用requestAnimationFrame,一帧一帧的录制
                //requestAnimationFrame 添加太多,生成较慢
                window.requestAnimationFrame(function(){
                //setTimeout(function(){
                    // 核心方法,向gif中加一帧图像,参数可以是img/canvas元素,还可以从ctx中复制一帧
                    //gif.addFrame($canvas);
                    
                    // or a canvas element
                    gif.addFrame($canvas, {delay: 100});//一帧时长
                    
                    // or copy the pixels from a canvas context
                    //gif.addFrame(ctx, {copy: true});
                    
                    if(Date.now() - start >= time){
                        gif.render();//开始启动 导出gif
                    }else{
                        loop()
                    }
                //}, 50)//间隔越短,导出时间越长
                })
            }
            
            //创建一个GIF实例
            var gif = new GIF({
              workers: 2,//启用两个worker。
              quality: 10,//图像质量
              workerScript: './js/gif.worker.js'
            });
            
            gif.on('finished', function(blob) {//最后生成一个blob对象
                  //window.open(URL.createObjectURL(blob));
                  saveAs(blob, "test.gif");
            });
            
            loop()
        }
    </script>
</body>

</html>
https://segmentfault.com/q/1010000022153818
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容