2010-02-08 14 views
40

AKTUALIZACJA: Ok, chociaż nie rozwiązałem dokładnie tego problemu, ale wymyśliłem pracę, która rozwiązuje mój największy problem ... doświadczenie użytkownika.Problem z pobieraniem wideo HTML5

Po pierwsze wideo nie zaczyna się ładować, dopóki widz nie kliknie przycisku odtwarzania, więc zakładam, że informacja o czasie trwania nie była dostępna do pobrania (nie wiem, jak rozwiązać ten konkretny problem) chociaż zakładam, że wymagałoby to po prostu załadowania metadanych wideo niezależnie od filmu, ale nie wiem nawet, czy to możliwe).

Aby obejść fakt, że nie ma danych o czasie trwania, postanowiłem ukryć informacje o czasie trwania (i właściwie całą kontrolę) do momentu, aż włączysz grę.

Wiem ... oszukuje. Ale na razie sprawia mi to przyjemność :)

To powiedziawszy ... jeśli ktoś wie, jak załadować metadane wideo oddzielnie od pliku wideo ... proszę udostępnij. Myślę, że powinno to całkowicie rozwiązać ten problem.


Pracuję nad budowaniem odtwarzacza wideo HTML5 z niestandardowym interfejsem, ale mam pewne problemy z wyświetlaniem informacji o czasie trwania wideo.

Moje HTML jest naprawdę proste (patrz niżej)

<video id="video" poster="image.jpg" controls>  
    <source src="video_path.mp4" type="video/mp4" /> 
    <source src="video_path.ogv" type="video/ogg" /> 
</video> 
<ul class="controls"> 
<li class="time"><p><span id="timer">0</span> of <span id="duration">0</span></p></li> 
</ul> 

A javascript Używam dostać i wstawić czas jest

var duration = $('#duration').get(0); 
var vid_duration = Math.round(video.duration); 
duration.firstChild.nodeValue = vid_duration; 

Problemem jest to nic się nie dzieje. Wiem, że plik wideo zawiera dane dotyczące czasu trwania, ponieważ jeśli używam domyślnych elementów sterujących, wyświetla się dobrze.

Ale prawdziwy Najdziwniejsze jest to, czy mogę umieścić alert (czas trwania) w moim kodu jak tak

alert(duration); 
var vid_duration = Math.round(video.duration); 
duration.firstChild.nodeValue = vid_duration; 

następnie działa w porządku (minus przykry alert, że wyskakuje). Wszelkie pomysły, co się tutaj dzieje lub jak mogę to naprawić?

+1

Do jakiej przeglądarki używasz HTML5? Nie wszystkie przeglądarki obsługują HTML5. –

+1

Nie sądzę, że jest to problem z przeglądarką. Korzystam z najnowszej wersji przeglądarki Firefox/Webkit/Chrome, aby ją przetestować. – drebabels

+1

Możesz zgłosić czas trwania za pomocą nagłówka HTTP "X-Content-Duration". Przeglądarka może wykonać żądanie "HEAD", aby zebrać te informacje przed pobraniem wideo. https://developer.mozilla.org/en/Configuring_servers_for_Ogg_media – TRiG

Odpowiedz

27

Problem jest w przeglądarkach WebKit; metadane wideo są ładowane po filmie, więc nie są dostępne podczas działania JS. Musisz zapytać o atrybut readyState; ma serię wartości od 0 do 4, informujących o stanie wideo; po wczytaniu metadanych otrzymasz wartość 1.

Więc trzeba zrobić coś takiego:

window.setInterval(function(t){ 
    if (video.readyState > 0) { 
    var duration = $('#duration').get(0); 
    var vid_duration = Math.round(video.duration); 
    duration.firstChild.nodeValue = vid_duration; 
    clearInterval(t); 
    } 
},500); 

Nie testowane tego kodu, ale powinna ona (lub coś podobnego) działa.

Więcej informacji na temat atrybutów elementów multimedialnych można znaleźć na stronie developer.mozilla.org.

+0

Awesome ... to działa idealnie. Dzięki za pomoc. – drebabels

+9

Zobacz poniżej odpowiedź @Mikushi dla znacznie czystszego rozwiązania – hellosmithy

3

Jest to modyfikacja kodu

var duration = document.getElementById("duration"); 
var vid_duration = Math.round(document.getElementById("video").duration); 
//alert(vid_duration); 
duration.innerHTML = vid_duration; 
//duration.firstChild.nodeValue = vid_duration; 

nadzieję, że to pomaga.

Wygląda na to, że używasz IE, dlaczego nie chcesz użyć metody document.getElementById do pobrania obiektu wideo?

+1

Hej dzięki za odpowiedź. Niestety to nie działa ... Wciąż mam ten sam problem, bez wywoływania alertu ... Czas trwania wideo nie zostaje wciągnięty (pojawia się tylko jako 0) A ja nie Naprawdę mam powód, aby nie używać getElementById ... Po prostu lubię selektory jQuery, więc używałem ich. – drebabels

+1

Masz 2 źródła wideo w jednym tagu wideo, czy możesz umieścić każde źródło pod 1 tagiem wideo i sprawdzić, czy to działa? –

140

uwagi, że:

var myVideoPlayer = document.getElementById('video_player'); 
myVideoPlayer.addEventListener('loadedmetadata', function() { 
    console.log(myVideoPlayer.duration); 
}); 

zostanie wywołany gdy przeglądarka otrzymał wszystkie dane meta z filmu.

[edytuj] Od tamtej pory lepszym rozwiązaniem byłoby, aby słuchać „durationchange” zamiast „loadedmetadata”, które mogą być zawodne, jako takich:

myVideoPlayer.addEventListener('durationchange', function() { 
    console.log('Duration change', myVideoPlayer.duration); 
}); 
+12

Dzięki, o wiele czystszy sposób niż zaakceptowana odpowiedź (imo). –

+7

Zamiast nieprzerwanego odpytywania, jak w zaakceptowanej odpowiedzi, ten jest wywoływany, gdy tylko wideo wie, że ma dostępne metadane. Znacznie czystszy. – Silvia

+0

jak wstawić czas trwania uzyskany z tego na zakres? – Batman

0

I napotkał ten sam problem: nie można odczytać czas trwania filmu wideo, $('video')[0].duration zawsze powrócić NaN, odniosłem przyjętej odpowiedź @stopsatgreen i zmień kod tak, aby zmieścił się w zwykłym przypadku, to naprawdę działa.

var video = $('video')[0]; 
var t = setInterval(function() { 
    if(video.readyState > 0) { 
     var duration = video.duration; 
     console.log(duration); 
     clearInterval(t); 
    } 
}, 500); 

Kod jest bardzo prosty i naprawdę działa, dlatego zamieszczam tę odpowiedź i mam nadzieję, że pomoże ona większej liczbie osób.