以 60 fps 从 canvas 捕获帧
Capture frames from a canvas at 60 fps
大家好,我有一个 canvas 可以用来编写相当复杂的动画。假设我想以每秒 60 帧的速度截取 canvas 的屏幕截图。 canvas 不必实时播放,我只需要它每秒捕获 60 帧,这样我就可以将屏幕截图发送到 FFmpeg 并制作视频。我知道我可以使用 canvas.toDataURL
但我如何顺利地捕捉帧?
如果您在浏览器中将 lottie-web 用于 After Effects 内容,请使用此代码暂停视频和 lottie 动画。比起截图并使用 Whammy 编译一个 webm 文件,你可以通过 ffmpeg 运行 获得你想要的输出。
generateVideo(){
const vid = new Whammy.fromImageArray(this.captures, 30);
vid.name = "project_id_238.webm";
vid.lastModifiedDate = new Date();
this.file = URL.createObjectURL(vid);
},
async pauseAll(){
this.pauseVideo();
if(this.animations.length){
this.pauseLotties()
}
this.captures.push(this.canvas.toDataURL('image/webp'));
if(!this.ended){
setTimeout(()=>{
this.pauseAll();
}, 500);
}
},
async pauseVideo(){
console.log("curretTime",this.video.currentTime);
console.log("duration", this.video.duration);
this.video.pause();
const oneFrame = 1/30;
this.video.currentTime += oneFrame;
},
async pauseLotties(){
lottie.freeze();
for(let i =0; i<this.animations.length; i++){
let step =0;
let animation = this.animations[i].lottie;
if(animation.currentFrame<=animation.totalFrames){
step = animation.currentFrame + animation.totalFrames/30;
}
lottie.goToAndStop(step, true, animation.name);
}
}
大家好,我有一个 canvas 可以用来编写相当复杂的动画。假设我想以每秒 60 帧的速度截取 canvas 的屏幕截图。 canvas 不必实时播放,我只需要它每秒捕获 60 帧,这样我就可以将屏幕截图发送到 FFmpeg 并制作视频。我知道我可以使用 canvas.toDataURL
但我如何顺利地捕捉帧?
如果您在浏览器中将 lottie-web 用于 After Effects 内容,请使用此代码暂停视频和 lottie 动画。比起截图并使用 Whammy 编译一个 webm 文件,你可以通过 ffmpeg 运行 获得你想要的输出。
generateVideo(){
const vid = new Whammy.fromImageArray(this.captures, 30);
vid.name = "project_id_238.webm";
vid.lastModifiedDate = new Date();
this.file = URL.createObjectURL(vid);
},
async pauseAll(){
this.pauseVideo();
if(this.animations.length){
this.pauseLotties()
}
this.captures.push(this.canvas.toDataURL('image/webp'));
if(!this.ended){
setTimeout(()=>{
this.pauseAll();
}, 500);
}
},
async pauseVideo(){
console.log("curretTime",this.video.currentTime);
console.log("duration", this.video.duration);
this.video.pause();
const oneFrame = 1/30;
this.video.currentTime += oneFrame;
},
async pauseLotties(){
lottie.freeze();
for(let i =0; i<this.animations.length; i++){
let step =0;
let animation = this.animations[i].lottie;
if(animation.currentFrame<=animation.totalFrames){
step = animation.currentFrame + animation.totalFrames/30;
}
lottie.goToAndStop(step, true, animation.name);
}
}