2013-08-01 25 views
22

Spędziłem sporo czasu próbuje dowiedzieć się, dlaczego film osadzony jak tutaj:Wideo Auto Play nie działa w Safari i Chrome przeglądarce pulpitu

<video height="256" loop="true" autoplay="autoplay" controls="controls" id="vid"> 
     <source type="video/mp4" src="video_file.mp4"></source> 
     <source type="video/ogg" src="video_file.ogg"></source> 
</video> 

rozpoczyna odtwarzanie automatycznie po załadowaniu strony w FireFox, ale ale nie można zrobić autoodtwarzania w przeglądarkach opartych na Webkit. Stało się tak tylko na niektórych losowych stronach. Do tej pory nie mogłem znaleźć przyczyny. Podejrzewam pewne niezamknięte znaczniki lub rozległe JS utworzone przez edytory CMS.

+0

czy czasem działa? lub w ogóle nie działa ... Oto przykład http://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_video_autoplay, który sprawdzam za pomocą chrome i działa. – tanaydin

+0

Na niektórych stronach nie działa wcale –

Odpowiedz

30

Najlepszym fix mogę dostać się dodanie tego kodu tuż po </video>

<script> 
    document.getElementById('vid').play(); 
</script> 

... nie całkiem, ale jakoś działa.

+0

thx for hack (: – HddnTHA

+1

Lub możesz kodować za pomocą jQuery '$ (" videoID "). Get (0) .play();' http://stackoverflow.com/questions/4646998/play-pause-html-5-video-using-jquery – Penguin

+2

Lub w ten sposób: '$ (" wideo [autoplay] "). Each (function() {this.play();});' – Martin

0

Spróbuj tego:

<video height="256" loop autoplay controls id="vid"> 
    <source type="video/mp4" src="video_file.mp4"></source> 
    <source type="video/ogg" src="video_file.ogg"></source> 

ten sposób normalnie zrobić. Pętla, sterowanie i autoodtwarzanie nie wymagają wartości, bo są atrybutami boolowskimi.

+0

Niestety to nie zadziałało w moim przypadku albo –

6

Właśnie teraz dostać ten sam problem z moim filmie

<video preload="none" autoplay="autoplay" loop="loop"> 
    <source src="Home_Teaser.mp4" type="video/mp4"> 
    <source src="Home_Teaser" type="video/webm"> 
    <source src="Home_Teaser.ogv" type="video/ogg"> 
</video> 

Po poszukiwaniach znalazłem rozwiązanie:

Jeżeli ustawić „preload” atrybuty na „true” wideo zacznij normalnie

0

Miałem przypadek, który miał coś wspólnego z kolejnością różnych typów plików. Spróbuj go zmienić i sprawdź, czy to pomaga.

27

Zdarza się, że Safari i Chrome na pulpicie nie lubią manipulacji DOM wokół tagu wideo. Nie wystrzelą kolejności odtwarzania, gdy atrybut autoplay zostanie ustawiony na , nawet, jeśli zdarzenie canplaythrough wystrzelono, gdy DOM wokół tagu wideo zmienił się po wczytaniu strony początkowej. Zasadniczo miałem ten sam problem, dopóki nie usunąłem jQuery .wrap() wokół tagu wideo, a następnie autoodtwarzanie zgodnie z oczekiwaniami.

+0

To rozwiązało to dla mnie.Dziękuję – DShults

+0

Dziękuję !! To jest jedyna rzecz, która zadziałała dla mojego w Chrome – Collins

+1

Dobre wywołanie, że nie działa z .wrap(). , o ile wiem, kod wymaga .get (0) do pracy: $ ("# vid"). get (0) .play(); – mattsoave

2

Żadna z pozostałych odpowiedzi nie sprawdziła się u mnie. Moim obejściem było wywołanie kliknięcia samego filmu wideo; hacky (ze względu na wymagany limit czasu), ale działa dobrze:

function startVideoIfNotStarted() { 
    $(".id_of_video_tag").ready(function() { 
     window.setTimeout(function(){ 
      videojs("id_of_video_tag").play() 
     }, 1000); 
    }); 
} 
$(startVideoIfNotStarted); 
+0

Nic nie działało też w Chrome. Z naprawą .play() (hack) powyżej otrzymałem "Uncaught (in Promise) DOMException: żądanie play() zostało przerwane przez wywołanie pause()." w konsoli. Na stronie było kilka innych funkcji jQuery, więc pomyślałem, że timer dałby Chrome wystarczająco dużo czasu, by się samemu posortować. Zadziałało. Ustawiłem sekundowy zegar w $ (dokument) .ready() –

5

Dodanie poniższego kodu u dołu strony działało dla mnie. Nie wiem, dlaczego to działa :(

setTimeout(function(){ 
    document.getElementById('vid').play(); 
},1000); 
+0

dzięki !!!!!!!!! – HollerTrain

+0

powodem jest to, że czekasz, aż film zostanie załadowany w buforze, a następnie go zagrasz. –

11

Po użyciu jQuery play() lub DOM maniupulation sugerowane przez innych odpowiedzi, nie było nadal działa (wideo nie został autoodtwarzanie) w Chrome dla Androida (wersja 56,0) .

Jak na ten post w developers.google.com, Od Chrome 53, opcja autoodtwarzania jest przestrzegana przez przeglądarkę, jeśli film jest wyciszony.

Więc za pomocą autoplay muted attribu tes w tagu wideo umożliwia autoodtwarzanie wideo w przeglądarkach Chrome od wersji 53.

Wyciąg z powyższego linku:

Wyciszony autoodtwarzania dla wideo jest obsługiwany przez Chrome dla Androida od wersji 53. Odtwarzanie rozpocznie się automatycznie za pomocą elementu wideo raz przychodzi do widzenia, gdy oba są autoplay i muted ustaw [...]

<video autoplay muted> 
    <source src="video.webm" type="video/webm" /> 
    <source src="video.mp4" type="video/mp4" /> 
</video> 
  • Wyciszony autoodtwarzania jest obsługiwany przez Safari na iOS 10 i późniejszych.
  • Autoodtwarzanie, bez względu na to, czy jest wyciszone czy nie, jest już obsługiwane w systemie Android przez przeglądarkę Firefox i przeglądarkę UC: nie blokują żadnego rodzaju autoodtwarzania.
+1

Miałem ten problem w Safari 11, gdzie wideo w tle (bez dźwięku) nie grałoby automatycznie. Dodanie 'wyciszonego' i' autoplay' zrobiło lewę. Dzięki! – dmbaughman

+0

posortowałem to dla mnie, dzięki! –

2

Dla mnie problemem było to, że atrybut muted potrzebne do dodania w tagu video. Np .:

<video width="1920" height="1980" src="video/Night.mp4" 
type="video/mp4" frameborder="0" allowfullscreen autoplay loop 
muted></video>` 
0

Zacząłem od wyświetlania wszystkich widocznych filmów, ale stare telefony nie działały dobrze. Teraz odtwarzam jedno wideo, które znajduje się najbliżej środka okna i zatrzymuję resztę. Vanilla JS. Możesz wybrać preferowany algorytm.

//slowLooper(playAllVisibleVideos); 
slowLooper(playVideoClosestToCenter); 

function isVideoPlaying(elem) { 
    if (elem.paused || elem.ended || elem.readyState < 2) { 
     return false; 
    } else { 
     return true; 
    } 
} 
function isScrolledIntoView(el) { 
    var elementTop = el.getBoundingClientRect().top; 
    var elementBottom = el.getBoundingClientRect().bottom; 
    var isVisible = elementTop < window.innerHeight && elementBottom >= 0; 
    return isVisible; 
} 
function playVideoClosestToCenter() { 
    var vids = document.querySelectorAll('video'); 
    var smallestDistance = null; 
    var smallestDistanceI = null; 
    for (var i = 0; i < vids.length; i++) { 
     var el = vids[i]; 
     var elementTop = el.getBoundingClientRect().top; 
     var elementBottom = el.getBoundingClientRect().bottom; 
     var elementCenter = (elementBottom + elementTop)/2.0; 
     var windowCenter = window.innerHeight/2.0; 
     var distance = Math.abs(windowCenter - elementCenter); 
     if (smallestDistance === null || distance < smallestDistance) { 
      smallestDistance = distance; 
      smallestDistanceI = i; 
     } 
    } 
    if (smallestDistanceI !== null) { 
     vids[smallestDistanceI].play(); 
     for (var i = 0; i < vids.length; i++) { 
      if (i !== smallestDistanceI) { 
       vids[i].pause(); 
      } 
     } 
    } 
} 
function playAllVisibleVideos(timestamp) { 
    // This fixes autoplay for safari 
    var vids = document.querySelectorAll('video'); 
    for (var i = 0; i < vids.length; i++) { 
     if (isVideoPlaying(vids[i]) && !isScrolledIntoView(vids[i])) { 
      vids[i].pause(); 
     } 
     if (!isVideoPlaying(vids[i]) && isScrolledIntoView(vids[i])) { 
      vids[i].play(); 
     } 
    } 
} 
function slowLooper(cb) { 
    // Throttling requestAnimationFrame to a few fps so we don't waste cpu on this 
    // We could have listened to scroll+resize+load events which move elements 
    // but that would have been more complicated. 
    function repeats() { 
     cb(); 
     setTimeout(function() { 
      window.requestAnimationFrame(repeats); 
     }, 200); 
    } 
    repeats(); 
} 
0

I rozwiązać ten sam problem z,

$(window).on('pageshow',function(){ 
    var vids = document.querySelectorAll('video'); 
    for (var i = 0; i < vids.length;){ 
     vids[i].play(); 
    } 
}) 

Trzeba uruchomić wideo po stronie zostały pokazane.

Powiązane problemy