如何生成高清晰度的视频?
这个是使用 echarts 生成的图表,数据实际上是不断变化的,也就是支持动态排序的柱状图。例如如果 D 的数据大于 A 时,就会和 A 交换位置,并且有交换动画。现在希望把实时效果转化为视频,但是发现使用屏幕录制出来的效果不太清晰。而 echarts 渲染出来的是 canvas(也可以使用 svg 进行渲染),可以提高配置时的设备像素比提升清晰度,有什么方法可以直接使用 canvas 去生成视频?
回复
1个回答
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
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容