【发布时间】:2013-11-28 02:09:55
【问题描述】:
我有一个带有画布覆盖的视频元素。然后我有一个绘图工具设置来绘制视频和一个保存按钮,该按钮从视频和画布中执行 drawImage 以保存复合帧。但是,第一次按保存时,我只从画布 drawImage 中得到结果,视频不显示。在随后的保存中,我收到了正确分层的两个图像。我认为这可能是加载视频图像的问题,但在我点击保存之前视频已完全加载,甚至可以推进帧并使其在第二次保存时正常工作。
这里是代码...
<div style="width:960px; height:540px; display:inline-block;">
<video id="video" src="media/_tmp/AA_017_COMP_v37.mov" width="960" height="540" ></video>
</div>
<canvas id="canvas" width="960" height="540" style="position:absolute; top:40px; left:9px; z-index:100;"></canvas>
<input type="button" value="save" id="btn" size="30" onclick="save()" style="float:left; padding:4px; margin-right:4px;" >
<div id="saved" style="border:1px solid #000; position:absolute; top:626px; left:10px; bottom:40px; width:958px; overflow:auto;">SAVED:</div>
function save() {
//COMP CANVAS OVER VIDEOFRAME
var video = document.getElementById("video");
var currentFrame = Math.floor((<?php echo $mov_frames ?> / video.duration) * video.currentTime);
var compCanvas = document.createElement('canvas');
compCanvas.width = video.width;
compCanvas.height = video.height;
compContext = compCanvas.getContext('2d');
compContext.drawImage(video, 0, 0);
compContext.drawImage(canvas, 0, 0);
var dataURL = compCanvas.toDataURL();
$("#saved").append('<div style="width:954px; border-bottom:1px solid #000; padding:2px 2px 0 2px;"><img id="compFrame_'+currentFrame+'" width="180" height="90" src="'+dataURL+'" />Frame: '+currentFrame+'</div>');
}
【问题讨论】:
-
你能提供一个显示问题的jsfiddle吗?
-
这是一个jsFiddle link jsFiddle 我不知道的唯一问题是跨浏览器视频链接不会绘制到画布上......但代码永远不会少。
-
你的代码是在 DOM 加载后才启动的吗?
-
保存函数存在于 $(document).ready 之外,但只有在页面完全加载后才会调用该函数。
-
1) 由于某些缓冲区交换问题,可能是一个错误的错误。你能确定“打印”的图像是看到的那个,而不是以前的吗?而且,你已经有了一个想法:2)在画布上播放视频怎么样?这样您就可以 100% 确定手头的图像。
标签: javascript html video canvas drawimage