Sayfamda, döngüsel bir video oynatım var. Oynat'a basarken, bunun üstünde başka bir video maskelenir ve yavaşça görünür. Kısacası, başka video ile bir video maskeleme am (siyah/beyaz maske Tuval tarafından alphadata dönüştü)Kanvas - Diğer videolardan alfa verileri içeren maskeleme videosu yavaş
The tutorial is adapted from here
Bu çalışır, ancak geçiş/video tüm pikseller yoluyla tuval döngü çünkü yavaş inanılmaz . Bunu gerçekleştirmenin başka bir yolu üzerinde herhangi bir işaretçi var mı, yoksa süreci hızlandırıyor mu?
A working demo of this code can be found here
HTML:
//Buffer canvas (stacked video's: result + alpha mask)
<canvas style="display:none" width="1920" height="2160" id="buffer">
</canvas>
//Output canvas (combines mask with video)
<canvas class="video__output " width="1920" height="1080" id="output">
</canvas>
//buffer canvas uses this video to extract data
<video class="" id="video" preload="auto" style="display:none" >
<source src="assets/video/masking.mp4" type='video/mp4;codecs="avc1.42E01E"' />
</video>
//Video loop always playing
<video poster="assets/video/poster_desktop.jpg" class="video--top loop" autoplay loop>
<source src="assets/video/loop.mp4" type='video/mp4; codecs="avc1.42E01E"' />
</video>
JS:
function processFrame() {
buffer.drawImage(video, 0, 0);
//Get alphadata
let image = buffer.getImageData(0, 0, width, height),
imageData = image.data,
alphaData = buffer.getImageData(0, height, width, height).data;
//Loop through pixels, replace data with alpha channel
for (let i = 3, len = imageData.length; i < len; i = i + 4) {
imageData[i] = alphaData[i-1];
}
//Output to second canvas
output.putImageData(image, 0, 0, 0, 0, width, height);
requestAnimationFrame(processFrame)
}
* İşlemi önemli ölçüde hızlandırın * Muhtemelen ... 'getImageData' sadece yavaştır. 2 video üzerinde eşzamanlı olarak yapmak slooooooow! Daha iyi performans için en azından maskeleme videosunu ve muhtemelen her iki videoyu önceden işlemeniz gerekir. – markE
Ayrıca, video piksellerini işlerken hızı önemli ölçüde artırmanın bir yolu video kalitesini düşürmektir. Öncelikle daha küçük çizin, şeffaflık işini yapın ve bir yere kaydedin (ikinci bir tuval gerekebilir). Tam boyutlu video karesini yeniden çizin, 'globalCompositeOperation' öğesini "source-in" konumuna getirin ve son olarak küçük şeffaf olanı yeniden çizin. orijinal ölçekte. Burada, alfa maskesinin sınırındaki bazı sağlam kenarlarla tam bir kaliteli videonuz var, ancak videolar için çok önemli değil. [Bu gönderiyi oku.] (Http://stackoverflow.com/questions/33687775/33727707#33727707) – Kaiido
Neden iki video öğenizden çapraz geçiş yapmıyorsunuz? –