2011-01-14 11 views
9

Sadece Chrome'da çalışan bir uygulama üzerinde çalışıyorum.Bir html5 videosunun src'sini krom ya da sızıntı belleğini bozmadan javascript aracılığıyla nasıl değiştiririm?

Kaynağı oynatma videosundan değiştirebilmem gerekir.

$fullscreenVideo.get(0).src = '/video/' + name + '.mp4'; // crash here 
$fullscreenVideo.get(0).load(); 
$fullscreenVideo.get(0).play(); 

birkaç defa ama benim krom (denenmiş beta & dev kanallar) çalışır kilitleniyor biter (tepkisiz hale sayfa):

Kullandığım javascript (& jQuery) src niteliğini değiştirmek için.

i ile son kod bloğu prepending yeni bir unsur oluşturmayı denerseniz:

$fullscreenVideo.remove(); 
$fullscreenVideo = $('<video id="video-fullscreen" width="800" height="600" loop="loop"></video>').appendTo("#page-fullscreen > div.fullscreen"); 

hiç geri aşağı almadan 20Mo tarafından her videonun anahtar artış RAM.

Chrome crash en src güncellemesini izlemek/engellemek için bir yol var mı? Boş belleği zorlamak için bir yol var mı?

+0

Eğer 'load' çalıştırırsanız ve' play 'çalıştırmazsanız ne olur? Belki oyundan önce bir gecikme ihtiyacı var ... –

+0

Yüklemeden veya oynatmadan önce src özniteliği güncellemesinde çöküyor. Öncesinde biraz gecikme eklemeye çalıştım ama hiçbir şeyi değiştirmedim. – Olivier

+1

İlk olarak, temizlemek için '.src = ''' eklerseniz ne olur? – Blindy

cevap

2

Aynı problem oldum.
Bazı forunlarda, bellek sızıntısı olan bir krom hatası olduğunu okudum (bazı insanlar sadece krom 8'de ve krom 6'da iyi çalıştığını söylüyor, ancak ben test etmedim).

Ayrıca bir uyku kullanarak yardımcı olduğunu okudum. Denedim ve doğrudur, değiştirmeden önce bir uyku koyarsam, yük at() çarpı sayısını azaltır. Ancak birçok değişiklikten sonra çökmeye devam ediyor. Daha sonra, setTimeout'u kullanmayı denedim (uykudan farklı olarak, CPU'yu kirletmez, kromsuz çalışmasına izin vermez).

Ve şimdi çalışıyor. Kodumun yardımcı olup olmadığını görmeye çalışın.

var videoChangingPending = false; 
function changeMovieSource(url, title){ 

     var $video = $('#video'); 
     try { 
      document.getElementById('video').src = url; 
     } 
     catch (e) { 
      alert(e); 
     }  

     $video.attr('autoplay', 'true'); 
     $video.data('currentTitle', title); 

     document.getElementById('video').load(); 

     videoChangingPending = false; 
}  

function startPlayer(url, title) { 

     if(videoChangingPending == true) 
      return; 



     document.getElementById('video').pause(); 


     videoChangingPending = true; 
     var changeMovieCallback = function(){ changeMovieSource(url, title);} 
     var t = setTimeout(changeMovieCallback, 800); 

} 
1

İlk yolun iyi çalışması gerektiğini varsayalım ve Chrome'un <video> uygulamasının hala buggy olduğunu varsayıyorum. Hata rapor forumlarında bunu belirtmekten çekinmeyin.

+0

+1 Bir hata olması gerektiğini kabul ediyorum, ama yine de bir sorun bilseydim yine de hoş olurdu –

+0

Maalesef henüz video etiketlerine ihtiyaç duymadım. Ancak sitenizde ne kadar erken konuşursanız, o kadar hızlı bir şekilde sabitlenecektir! – Blindy

0

Tüm yaptığım, video etiketini kaldırmak ve daha sonra geçerli bir URL'yi "anında" eklemek için bu sorunu yaşıyordum.

+0

ama bu durumda, ram sızıntı yapmıyor mu? – Olivier

2

Tüm bu cevaplardan nefret ettim çünkü çok kısa ya da diğer çerçevelere güvendiler.

http://jsfiddle.net/mattdlockyer/5eCEu/2/

HTML:

<video id="video" width="320" height="240"></video> 

JS:

var video = document.getElementById('video'); 
var source = document.createElement('source'); 

source.setAttribute('src', 'http://www.tools4movies.com/trailers/1012/Kill%20Bill%20Vol.3.mp4'); 

video.appendChild(source); 
video.play(); 

setTimeout(function() { 
    video.pause(); 

    source.setAttribute('src', 'http://www.tools4movies.com/trailers/1012/Despicable%20Me%202.mp4'); 

    video.load(); 
    video.play(); 
}, 3000); 
İşte

Chrome'da çalışan, bunu yapmanın "bir" vanilya JS yolu, diğer tarayıcılarda test etmek için lütfen

İlgili konular