2011-09-06 11 views
30

Zastanawiam się, czy istnieje jakiś prosty sposób na uzyskanie tego efektu, bez potrzeby użycia kodu backendu do wyodrębnienia ramki, zapisz ją jako plik jpg i bazę danych gdzieś.Dynamicznie używając pierwszej klatki jako plakatu w wideo HTML5?

Efekt, w którym pierwsza klatka filmu po prostu wyświetla się jako plakat po załadowaniu wideo, byłaby bardzo pomocna (działałaby tylko wtedy, gdyby przeglądarka mogła oczywiście odtwarzać wideo, co może być nieco inne niż poster tradycyjnie działa, ale to nie jest problemem.

Odpowiedz

19

jest Popcorn.js plugin o nazwie Popcorn.capture który pozwoli Ci tworzyć plakaty z dowolnej klatki wideo HTML5.

jest to ograniczenie, które narzuca przeglądarka, która zabrania odczytywania danych pikseli żądanych zasobów w różnych domenach (przy użyciu interfejsu API obszaru roboczego do zapisywania bieżącej wartości wartości a rama). Źródło wideo musi być hostowane w tej samej domenie, co skrypt i strona html, która żąda jej, aby to podejście działało.

Kod stworzyć plakat przy użyciu tej wtyczki jest bardzo prosta:

// This block of code must be run _after_ the DOM is ready 
// This will capture the frame at the 10th second and create a poster 
var video = Popcorn("#video-id"); 

// Once the video has loaded into memory, we can capture the poster 
video.listen("canplayall", function() { 

    this.currentTime(10).capture(); 

}); 
+0

Wygląda na to, czego potrzebuję. Nie można popcornu samemu zadziałać niestety .. Pobieranie 'Uncaught Error: INVALID_STATE_ERR: DOM Exception 11 popcorn.js: 389 Popcorn.extend.Popcorn.forEach.ret popcorn.js: 389' za każdym razem, gdy to nazywam. – Damon

+0

Wygląda na to, że nie chcesz czekać na załadowanie filmu. Zaktualizowałem powyższy przykład kodu, aby poczekać, a następnie ustawić plakat. – Rick

+1

dzięki .. to działa. w dużej mierze i tak ... byłem pod wrażeniem z dokumentów, że 'this.capture ({at: 1}). currentTime (0);' chwyciłby plakat z 1 sekundy, a następnie umieścił go na początku , ale pozostawia to na 1 sekundę. Czy masz jakieś doświadczenie z tym? – Damon

6

Można ustawić preload='auto' na elemencie wideo załadować pierwszą klatkę wideo automatycznie.

+0

Tylko słowo porady: wstępne ładowanie oznacza, że ​​wideo może zostać pobrane automatycznie bez działania użytkownika. To właśnie dzieje się domyślnie w Chrome, Firefox i IE na komputerze. Dlatego upewnij się, że nie pogorszy to zadowolenia użytkowników z Twojej strony. – Louhike

+1

Dobrze, chociaż tak jest tylko na pulpicie, ponieważ jest to wskazówka, a nie dyrektywa. Nieco przestarzały, ale zobacz https://www.stevesouders.com/blog/2013/04/12/html5-video-preload/ –

8

Ostatnio zrobiłem to dla niedawnego projektu, który działa na komputerach i urządzeniach mobilnych. Sztuczka polegała na tym, żeby działało na iPhone'ie.

Ustawienie preload=metadata działa na komputerach stacjonarnych i urządzeniach z systemem Android, ale nie na telefonie iPhone.

W przypadku iPhone'ów musiałem ustawić go na autoplay, aby obraz plakatu pojawiał się automatycznie przy pierwszym załadowaniu. iPhone zapobiega automatycznemu odtwarzaniu wideo, ale w rezultacie pojawia się obraz plakatu.

Musiałem zrobić czek na iPhone'a za pomocą odpowiedzi Pavana znalezionej tutaj. Detect iPhone Browser. Następnie użyj odpowiedniego tagu wideo z lub bez autoplay w zależności od urządzenia.

var agent = navigator.userAgent; 
var isIphone = ((agent.indexOf('iPhone') != -1) || (agent.indexOf('iPod') != -1)) ; 

$videoTag = ""; 
if(isIphone()) { 
    $videoTag = '<video controls autoplay preload="metadata">'; 
} else { 
    $videoTag = '<video controls preload="metadata">'; 
} 
+1

Ta odpowiedź wyjaśnia, dlaczego problem się pojawia i zapewnia obejście.Pamiętaj, że w systemie iOS 10 atrybut autoplay może zostać zaakceptowany, jeśli spełnione są pewne warunki. Proponuję więc, aby wszyscy natychmiast wstrzymali wideo, aby zapobiec rzeczywistemu autoodtwarzaniu. –

+0

@Alessandro możesz pokazać kod, jak możemy sobie z tym poradzić w ios 10 byłoby świetnie Dzięki – Mourice

+1

coś jak 'var wideo = document.createElement (" wideo "); video.controls = true; video.preload = "metadane"; if (isIphone) {video.autoplay = true; video.pause(); } ' –

Powiązane problemy