2016-03-09 13 views
5

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) 
} 
+0

* İş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

+0

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

+0

Neden iki video öğenizden çapraz geçiş yapmıyorsunuz? –

cevap

0

Birinci seçenek Tek bir çağrı için iki getImageData() s azaltmaktır. Tam bitmap'i alın, ardından RGB verisine işaret eden ve ikincisi mat verilerinin başlangıcına kadar iki işaretçi kullanın. İkinci seçenek webm video formatını kullanmayı düşünmektir. Bu, support for alpha channel BUT'a sahiptir ve şu anda yalnızca Chrome tarayıcısında (ve daha yeni Opera düşünürken) desteklenmektedir.