canvas - 以快速的方式将画布捕获到视频
问题描述
我正在捕获包含视频、图像和文本等内容的画布,但我每帧捕获每一帧,onseeked
在将视频搜索到所需帧后使用事件捕获下一帧。但这需要很长时间。
有没有办法更快地捕捉画布?例如使用 GPU 加速或专用软件。
编辑 :
function download() {
const blob = new Blob(recordedBlobs, {type: 'video/webm'});
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.style.display = 'none';
a.href = url;
a.download = 'test.webm';
document.body.appendChild(a);
a.click();
setTimeout(() => {
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}, 100);
}
function handleDataAvailable(event) {
if (event.data && event.data.size > 0) {
recordedBlobs.push(event.data);
}
}
function handleStop(event) {
console.log('Recorder stopped: ', event);
const superBuffer = new Blob(recordedBlobs, {type: 'video/webm'});
document.querySelector('video').src = window.URL.createObjectURL(superBuffer);
}
function stopRecording() {
mediaRecorder.stop();
console.log('Recorded Blobs: ', recordedBlobs);
document.querySelector('video').controls = true;
}
function startRecording() {
videos.forEach(element =>{
element.play();
});
var stream = document.querySelector('canvas').captureStream(30);
let options = {mimeType: 'video/webm'};
recordedBlobs = [];
try {
mediaRecorder = new MediaRecorder(stream, options);
} catch (e0) {
console.log('Unable to create MediaRecorder with options Object: ', e0);
try {
options = {mimeType: 'video/webm,codecs=vp9'};
mediaRecorder = new MediaRecorder(stream, options);
} catch (e1) {
console.log('Unable to create MediaRecorder with options Object: ', e1);
try {
options = 'video/vp8'; // Chrome 47
mediaRecorder = new MediaRecorder(stream, options);
} catch (e2) {
alert('MediaRecorder is not supported by this browser.\n\n' +
'Try Firefox 29 or later, or Chrome 47 or later, ' +
'with Enable experimental Web Platform features enabled from chrome://flags.');
console.error('Exception while creating MediaRecorder:', e2);
return;
}
}
}
mediaRecorder.onstop = handleStop;
mediaRecorder.ondataavailable = handleDataAvailable;
mediaRecorder.start(100); // collect 100ms of data
console.log('MediaRecorder started', mediaRecorder);
const startTime = getTime();
let nextExpTime = startTime;
var curTime = null;
const onTimer = () => {
videos.forEach(element =>{
let dureeTotale = element.duration; // Durée de la vidéo en cours
if(frameNum == 1){
element.play();
element.pause();
}
// let seek = ((frameNum % (dureeTotale * 30 +1)) / 30); // Si dépassement, retour à 0 secondes;
let framerate = numFrames / dureeTotale;
if ((element.currentTime * framerate) === numFrames){
stopRecording();
download();
// capturer.stop();
// capturer.save(showVideoLink);
clearInterval(timer);
return;
}
})
};
onTimer();
const timer = setInterval(onTimer, 0);
}
}
解决方案
推荐阅读
- html - 有时不会触发DIV内的Ionic 4 App点击事件
- api - Strava - 如何检测运行/活动中的暂停
- javascript - Google 云端硬盘电子表格超出了最长执行时间
- python - 附加到python中的列表列表
- swift - 防止在闭包的参数上保留/释放快速关闭?
- java - 从数组中删除学生的问题会产生错误
- switch-statement - 如何在 switch 语句中进行计算?
- asp.net - Visual Studio 19 在添加引用时抛出错误
- javascript - 每次我在新标签页中打开时,VueJS 都会要求登录
- python-3.x - SeleniumPython3.x 我该如何处理这个元素?