4.11.3_视频处理
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>视频处理</title>
<style>
body{
background: #ddd;
}
.floatingControls{
position: absolute;
left: 75px;
top: 300px;
}
#canvas{
background: #fff;
border: thin solid #aaa;
}
#video{
display: none;
}
</style>
</head>
<body>
<video id="video" controls>
<source src="video/mov_bbb.mp4"></source>
<source src="video/mov_bbb.ogg"></source>
</video>
<canvas id="canvas" width="480" height="270"></canvas>
<div id="controls" class="floatingControls">
<input id="controlButton" type="button" value="播放" />
<input id="colorCheckbox" type="checkbox" checked="" />彩色图片
<input id="flipCheckbox" type="checkbox" />180度翻转
</div>
</body>
<script>
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
var offscreenCanvas = document.createElement('canvas');
var offscreenContext = offscreenCanvas.getContext('2d');
var video = document.getElementById('video');
var controlButton = document.getElementById('controlButton');
var flipCheckbox = document.getElementById('flipCheckbox');
var colorCheckbox = document.getElementById('colorCheckbox');
var imageData;
var poster = new Image();
poster.src = 'img/waterfall.jpg';
offscreenCanvas.width = canvas.width;
offscreenCanvas.height = canvas.height;
poster.onload = function(){
context.drawImage(poster,0,0);
};
controlButton.onclick = function(){
if(controlButton.value === '播放'){
startPlaying();
controlButton.value = '暂停';
}else{
stopPlaying();
controlButton.value = '播放';
}
}
function startPlaying(){
video.play();
requestAnimationFrame(nextVideoFrame);
}
function stopPlaying(){
video.pause();
}
function nextVideoFrame(){
if(video.ended){
controlButton.value = '播放';
}else{
offscreenContext.drawImage(video,0,0,offscreenCanvas.width,offscreenCanvas.height);
if(!colorCheckbox.checked){
removeColor();
}
if(flipCheckbox.checked){
drawFlipped();
}else{
context.drawImage(offscreenCanvas,0,0);
}
requestAnimationFrame(nextVideoFrame);
}
}
function removeColor(){
var imageData;
var length;
var data;
var average;
imageData = offscreenContext.getImageData(0,0,offscreenCanvas.width,offscreenCanvas.height);
data = imageData.data;
length = data.length;
for(var i=0 ; i<length;i+=4){
average = (data[i]+data[i+1]+data[i+2])/3;
data[i] = data[i+1] = data[i+2] = average;
}
offscreenContext.putImageData(imageData,0,0);
}
function drawFlipped(){
context.save();
context.translate(canvas.width/2,canvas.height/2);
context.rotate(Math.PI);
context.translate(-canvas.width/2,-canvas.height/2);
context.drawImage(offscreenCanvas,0,0);
context.restore();
}
</script>
</html>