การเล่นวิดีโออัตโนมัติไม่ทำงานในเบราว์เซอร์เดสก์ท็อป Safari และ Chrome


135

ฉันใช้เวลาค่อนข้างมากในการพยายามหาสาเหตุว่าทำไมวิดีโอถึงฝังตัวอยู่ที่นี่:

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

เริ่มเล่นโดยอัตโนมัติเมื่อโหลดเพจใน FireFox แต่ไม่สามารถเล่นอัตโนมัติในเบราว์เซอร์ที่ใช้ Webkit สิ่งนี้เกิดขึ้นในบางเพจแบบสุ่มเท่านั้น จนถึงตอนนี้ฉันไม่สามารถหาสาเหตุได้ ฉันสงสัยว่ามีแท็กที่ไม่ได้ปิดหรือ JS ขนาดใหญ่ที่สร้างโดย CMS editors


บางครั้งมันใช้งานได้หรือไม่ หรือไม่ทำงานเลย ... นี่คือตัวอย่างw3schools.com/tags/tryit.asp?filename=tryhtml5_video_autoplayที่ฉันตรวจสอบด้วย chrome และใช้งานได้
tanaydin

ในบางเพจใช้งานไม่ได้เลย
Adam Bubela

เมื่อเผชิญกับปัญหาเดียวกันทำงานได้ดีเมื่อสัปดาห์ก่อนและไม่มีการเปลี่ยนแปลงใด ๆ ก็หยุดทำงาน อาจเป็นการอัปเดตเบราว์เซอร์น่ารำคาญมากที่ต้องเล่นแท็กวิดีโอทั้งหมดด้วยตนเองผ่านทางจาวาสคริปต์
bingeScripter

ไม่ทำงานสำหรับฉันใน Chrome
Bob the Builder

คำตอบ:


264

การแก้ไขที่ดีที่สุดที่ฉันจะได้รับคือการเพิ่มรหัสนี้หลังจากไฟล์ </video>

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

... ไม่สวย แต่ได้ผล

อัปเดต เมื่อเร็ว ๆ นี้เบราว์เซอร์จำนวนมากสามารถเล่นวิดีโอโดยอัตโนมัติโดยปิดเสียงดังนั้นคุณจะต้องเพิ่มmutedแอตทริบิวต์ให้กับแท็กวิดีโอด้วย

<video autoplay muted>
...
</video>

1
หรือจะเขียนโค้ดด้วย jQuery $("videoID").get(0).play(); stackoverflow.com/questions/4646998/…
Penguin

8
หรือแบบนี้:$("video[autoplay]").each(function(){ this.play(); });
Martin

2
ยังคงมีปัญหาหากไม่ได้ปิดเสียงdevelopers.google.com/web/updates/2017/09/…
dovid

6
สิ่งนี้จะไม่ทำงานอีกต่อไปหากไม่มีการโต้ตอบกับผู้ใช้ AFAIK
webkit


94

หลังจากใช้ jQuery play()หรือ DOM maniupulation ตามที่คำตอบอื่นแนะนำแล้วมันยังไม่ทำงาน (วิดีโอไม่ได้เล่นอัตโนมัติ) ใน Chrome สำหรับ Android (เวอร์ชัน 56.0)

ตามนี้โพสต์ในdevelopers.google.comจาก Chrome 53 ตัวเลือกเล่นอัตโนมัติเป็นที่ยอมรับโดยเบราว์เซอร์หากวิดีโอถูกปิด

ดังนั้นการใช้autoplay mutedแอตทริบิวต์ในแท็กวิดีโอจึงทำให้วิดีโอสามารถเล่นอัตโนมัติในเบราว์เซอร์ Chrome จากเวอร์ชัน 53 ได้

ข้อความที่ตัดตอนมาจากลิงค์ด้านบน:

การเล่นอัตโนมัติแบบปิดเสียงสำหรับวิดีโอได้รับการสนับสนุนโดย Chrome สำหรับ Android ในเวอร์ชัน 53 การเล่นจะเริ่มต้นโดยอัตโนมัติสำหรับองค์ประกอบวิดีโอเมื่อได้รับการดูหากทั้งสองอย่างautoplayและmutedตั้งค่าไว้ [... ]

<video autoplay muted>
    <source src="video.webm" type="video/webm" />
    <source src="video.mp4" type="video/mp4" />
</video>
  • Safari รองรับการเล่นอัตโนมัติแบบปิดเสียงบน iOS 10 และใหม่กว่า
  • การเล่นอัตโนมัติไม่ว่าจะปิดเสียงหรือไม่ก็ตาม Firefox และ UC Browser รองรับ Android อยู่แล้วพวกเขาไม่ได้บล็อกการเล่นอัตโนมัติทุกประเภท

3
ฉันมีปัญหานี้ใน Safari 11 ที่วิดีโอพื้นหลัง (ไม่มีเสียง) ไม่เล่นโดยอัตโนมัติ เพิ่มmutedและautoplayทำเคล็ดลับ ขอบคุณ!
dmbaughman

1
แล้วทำไมการเล่นอัตโนมัติพร้อมเปิดเสียงจึงใช้งานได้กับ youtube? มันได้ผลตั้งแต่เริ่มก่อตั้งเว็บไซต์
Xavier

32

เกิดขึ้นที่ Safari และ Chrome บนเดสก์ท็อปไม่ชอบการจัดการ DOM รอบ ๆ แท็กวิดีโอ ซึ่งจะไม่เริ่มการทำงานของลำดับการเล่นเมื่อมีการตั้งค่าแอตทริบิวต์การเล่นอัตโนมัติแม้ว่าเหตุการณ์การเล่นผ่านจะเริ่มทำงานเมื่อ DOM รอบแท็กวิดีโอมีการเปลี่ยนแปลงหลังจากการโหลดหน้าเว็บครั้งแรก โดยทั่วไปฉันมีปัญหาเดียวกันจนกว่าฉันจะลบ. wrap () jQuery รอบ ๆ แท็กวิดีโอและหลังจากนั้นก็เล่นอัตโนมัติตามที่คาดไว้


2
เรียกได้ว่าใช้ไม่ได้กับ. wrap () อย่างไรก็ตามเท่าที่ฉันบอกได้รหัสต้องการ. get (0) เพื่อทำงาน: $ ("# vid"). get (0) .play ();
mattsoave

3
@mattsoave .get(0)หรือเพียง$('#vid')[0].play()
pmrotule

ตุลาคม 2017 วิดีโอไม่เล่นอัตโนมัติทั้งๆที่แอตทริบิวต์ในแท็กยังคงเป็นปัญหาใน Safari การใช้ [0] .play () ตามคำแนะนำของ mattsoave / pmrotule ช่วยแก้ปัญหาได้
Don Cullen

25

Google เพิ่งเปลี่ยนนโยบายสำหรับการเล่นวิดีโออัตโนมัติจึงต้องเป็นเช่นนั้น muted

คุณสามารถตรวจสอบได้ที่นี่

ดังนั้นเพียงแค่เพิ่มปิดเสียง

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

จอห์น Pallett ของความคิดเห็นเกี่ยวกับนโยบายใหม่ เขาเป็นผู้จัดการผลิตภัณฑ์ของ Google Chrome และสื่อ Muter
Doomjunky

24

สำหรับฉันปัญหาคือmutedต้องเพิ่มแอตทริบิวต์ภายในvideoแท็ก เช่น:

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

ใช้งานได้กับ Chrome รุ่นล่าสุดบน Windows8
vladkras

บน Crome ถ้าฉันเพิ่มปิดเสียงปิดเสียง ฉันไม่ต้องการสิ่งนี้
lisarko8077

18

Chrome ไม่อนุญาตให้เล่นวิดีโอโดยเปิดเสียงโดยอัตโนมัติดังนั้นอย่าลืมเพิ่มmutedแอตทริบิวต์ให้กับvideoแท็กเช่นนี้

<video width="320" height="240"  autoplay muted>
  <source src="video.mp4" type="video/mp4">
</video>

3
นั่นไม่ได้เพิ่มอะไรใหม่ คำตอบที่ได้รับการยอมรับแล้วกล่าวถึงนี้ นอกจากนี้คำตอบที่สองยังกล่าวถึงรายละเอียด
Samuel Philipp

12

ตอนนี้ฉันได้รับปัญหาเดียวกันกับวิดีโอของฉัน

<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>

หลังจากค้นหาฉันพบวิธีแก้ปัญหา:

หากฉันตั้งค่าแอตทริบิวต์ "โหลดล่วงหน้า" เป็น "จริง" วิดีโอจะเริ่มต้นตามปกติ


เบราว์เซอร์จะละเว้นแอตทริบิวต์พรีโหลดหากมีการเล่นอัตโนมัติ
Sedat Başar

9

การเพิ่มรหัสด้านล่างที่ด้านล่างของหน้าได้ผลสำหรับฉัน ฉันไม่รู้ว่าทำไมมันถึงได้ผล :(

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

2
สาเหตุเป็นเพราะคุณกำลังรอให้วิดีโอโหลดภายในบัฟเฟอร์จากนั้นจึงเล่น
Joseph Briggs


5

var video = document.querySelector('video'); video.muted = true; video.play()

เพียงวิธีนี้ช่วยฉัน<video autoplay muted ...>...</video>ไม่ได้ผล ...


3

ไม่มีคำตอบอื่นใดที่เหมาะกับฉัน วิธีแก้ปัญหาของฉันคือกระตุ้นให้เกิดการคลิกบนวิดีโอ แฮ็ค (เนื่องจากการหมดเวลาที่จำเป็น) แต่ก็ใช้งานได้ดี:

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

ไม่มีอะไรทำงานบน Chrome ที่ใช้ได้ผลสำหรับฉันเช่นกัน ด้วย. play () แก้ไข (แฮ็ก) ด้านบนฉันได้รับ "Uncaught (ในสัญญา) DOMException: คำขอ play () ถูกขัดจังหวะด้วยการเรียกให้หยุดชั่วคราว ()" ในคอนโซล มีฟังก์ชั่น jQuery อื่น ๆ อีกสองสามอย่างในหน้านี้ดังนั้นคิดว่าตัวจับเวลาจะทำให้ Chrome มีเวลาเพียงพอในการจัดการตัวเอง มันได้ผล ฉันตั้งเวลา 0.5 วินาทีใน $ (เอกสาร) พร้อม ()
จาก Orbonia

3

เมื่อเร็ว ๆ นี้เราได้แก้ไขปัญหาที่คล้ายกันกับวิดีโอแบบฝังและพบว่าแอตทริบิวต์การเล่นอัตโนมัติและปิดเสียงไม่เพียงพอสำหรับการนำไปใช้งานของเรา

เราได้เพิ่มแอตทริบิวต์ "playinline" ที่สามลงในโค้ดและได้แก้ไขปัญหาสำหรับผู้ใช้ iOS

การแก้ไขนี้เฉพาะสำหรับวิดีโอที่จะเล่นแบบอินไลน์ จากhttps://webkit.org/blog/6784/new-video-policies-for-ios/ :

ใน iPhone ตอนนี้องค์ประกอบต่างๆจะได้รับอนุญาตให้เล่นแบบอินไลน์และจะไม่เข้าสู่โหมดเต็มหน้าจอโดยอัตโนมัติเมื่อการเล่นเริ่มต้นขึ้น องค์ประกอบที่ไม่มีคุณสมบัติ playinline จะยังคงต้องใช้โหมดเต็มหน้าจอสำหรับการเล่นบน iPhone เมื่อออกจากโหมดเต็มหน้าจอด้วยท่าทางบีบนิ้วองค์ประกอบที่ไม่มีการเล่นอินไลน์จะยังคงเล่นแบบอินไลน์



2

ลองสิ่งนี้:

    <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>

นี่คือวิธีที่ฉันทำตามปกติ การวนรอบการควบคุมและการเล่นอัตโนมัติไม่จำเป็นต้องมีค่าที่เป็นคุณลักษณะบูลีน


2

เนื่องจากตอนนี้ Chrome ป้องกันการเล่นอัตโนมัติในวิดีโอ html5 ดังนั้นโดยค่าเริ่มต้นจะไม่อนุญาตให้เล่นอัตโนมัติ เราจึงสามารถเปลี่ยนการตั้งค่านี้ได้โดยใช้การตั้งค่าสถานะโครเมียม เป็นไปไม่ได้สำหรับกรณีปกติดังนั้นฉันจึงหาวิธีแก้ไขอื่น ทำงานได้สมบูรณ์แบบ ... (เพิ่มพรีโหลด = "อัตโนมัติ")

<video autoplay preload="auto" loop="loop" muted="muted" id="videoBanner" class="videoBanner">
<source src="banner-video.webm" type="video/webm">
<source src="banner-video.mp4" type="video/mp4">
<source src="banner-video.ogg" type="video/ogg">

var herovide = document.getElementById('videoBanner');
       herovide.autoplay=true;
       herovide.load();  

2

ใช้เวลาสองชั่วโมงในการลองใช้วิธีแก้ปัญหาทั้งหมดที่กล่าวมาข้างต้น

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉันในที่สุด:

var vid = document.getElementById("myVideo");
vid.muted = true;

1

ใน Safari Iphone เมื่อเนยอยู่ในระดับต่ำและ iPhone อยู่ในโหมดพลังงานต่ำระบบจะไม่เล่นอัตโนมัติแม้ว่าคุณจะมีคุณสมบัติดังต่อไปนี้: เล่นอัตโนมัติ, วนซ้ำ, ปิดเสียง, เล่นอินไลน์บนแท็ก html ของวิดีโอ

เดินไปรอบ ๆ ฉันพบว่าการทำงานคือการมีเหตุการณ์ท่าทางของผู้ใช้เพื่อกระตุ้นการเล่นวิดีโอ:

document.body.addEventListener("touchstart", function () {
    var allVideos = document.querySelectorAll('video');
    for (var i = 0; i < allVideos.length; i++) {
        allVideos[i].play();
    }
},{ once: true });

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับท่าทางของผู้ใช้และนโยบายวิดีโอสำหรับ iOS ได้ในเว็บไซต์:

https://webkit.org/blog/6784/new-video-policies-for-ios/


0

ฉันมีกรณีที่มันเกี่ยวข้องกับลำดับของประเภทไฟล์ที่แตกต่างกัน ลองเปลี่ยนดูว่าช่วยได้ไหม


0

ฉันเริ่มเล่นวิดีโอที่มองเห็นได้ทั้งหมด แต่โทรศัพท์รุ่นเก่าทำงานได้ไม่ดี ตอนนี้ฉันเล่นวิดีโอหนึ่งที่ใกล้ตรงกลางหน้าต่างมากที่สุดและหยุดส่วนที่เหลือชั่วคราว วานิลลา JS. คุณสามารถเลือกอัลกอริทึมที่คุณต้องการได้

//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

ฉันแก้ปัญหาเดียวกันกับ

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

คุณต้องเปิดวิดีโอหลังจากที่แสดงเพจแล้ว


0

ลองเปลี่ยน autoPlayเป็นautoplay.

ดูเหมือนว่าจะพิจารณาตัวพิมพ์เล็กและใหญ่ในบางครั้ง แปลกมากเพราะมันใช้งานได้autoplayสำหรับฉัน แต่ถ้าฉันรวมไว้ด้วยcontrols

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.