เล่นไฟล์เสียงอัตโนมัติบน iPad ด้วย HTML5


89

ฉันกำลังพยายามรับไฟล์เสียงเพื่อเล่นอัตโนมัติใน Safari บน iPad ถ้าฉันไปที่เพจโดยใช้ Safari บน Mac ก็ใช้ได้ บน iPad การเล่นอัตโนมัติไม่ทำงาน


1
นี่ไม่ใช่คำตอบ แต่เป็นเพียงข้อสังเกต เมื่อฉันใส่ WireShark ในการเชื่อมต่อกับ iPad ฉันสังเกตเห็นว่ามันจะไม่เล่นอัตโนมัติ แต่ก็ยังดาวน์โหลดไฟล์ Wave อยู่ดี HTTP Get แรกจะขอเพียง 2 ไบต์แรกของไฟล์ แต่จากนั้น iPad จะขอไฟล์ Wave ที่เหลือในคำขอ Get เพิ่มเติม สิ่งที่แม้แต่คนแปลกหน้าก็คือเมื่อคุณคลิกที่ปุ่ม 'เล่น' ของส่วนประกอบเสียง iPad จะโหลดไฟล์ Wave อีกครั้ง
Javamann

คำตอบ:


34

อัพเดท:นี่เป็นการแฮ็กและใช้งานไม่ได้อีกต่อไปบน IOS 4.X ขึ้นไป อันนี้ใช้ได้กับ IOS 3.2.X.

มันไม่เป็นความจริง. Apple ไม่ต้องการเล่นวิดีโอและเสียงอัตโนมัติบน IPad เนื่องจากมีปริมาณการใช้งานสูงที่คุณสามารถใช้บนเครือข่ายมือถือได้ ฉันจะไม่ใช้การเล่นอัตโนมัติสำหรับเนื้อหาออนไลน์ สำหรับไซต์ HTML แบบออฟไลน์เป็นคุณลักษณะที่ยอดเยี่ยมและนั่นคือสิ่งที่ฉันเคยใช้

นี่คือวิธีแก้ "javascript fake click": http://www.roblaplaca.com/examples/html5AutoPlay/

คัดลอกและวางรหัสจากเว็บไซต์:

<script type="text/javascript"> 
        function fakeClick(fn) {
            var $a = $('<a href="#" id="fakeClick"></a>');
                $a.bind("click", function(e) {
                    e.preventDefault();
                    fn();
                });

            $("body").append($a);

            var evt, 
                el = $("#fakeClick").get(0);

            if (document.createEvent) {
                evt = document.createEvent("MouseEvents");
                if (evt.initMouseEvent) {
                    evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
                    el.dispatchEvent(evt);
                }
            }

            $(el).remove();
        }

        $(function() {
            var video = $("#someVideo").get(0);

            fakeClick(function() {
                video.play();
            });
        });

        </script> 

นี่ไม่ใช่แหล่งที่มาของฉัน ฉันเคยพบสิ่งนี้มาแล้วและทดสอบรหัสบน IPad และ iPhone ด้วย IOS 3.2.X.


1
นี่เป็นวิธีแก้ปัญหาอื่น: codeblog.co/getting-autoplay-working-on-iosฉันเพิ่งตรวจสอบว่าใช้งานได้บน iPad ที่ใช้ iOS 3.2
Ciryon

49
อย่าเสียเวลากับสิ่งนี้เพราะมันใช้ไม่ได้กับ iOS 4+ อีกต่อไป
jcampbell1

106

ฉันขอย้ำด้วยว่าสาเหตุที่คุณไม่สามารถทำเช่นนี้ได้คือการตัดสินใจทางธุรกิจที่ Apple ทำไม่ใช่การตัดสินใจทางเทคนิค ไม่มีเหตุผลทางเทคนิคที่สมเหตุสมผลสำหรับ Apple ในการปิดใช้งานเสียงจากเว็บแอปบน iPod Touch นั่นคืออุปกรณ์ WiFi เท่านั้นไม่ใช่โทรศัพท์ที่อาจต้องเสียค่าแบนด์วิดท์ที่มีราคาแพงดังนั้นข้อโต้แย้งดังกล่าวจึงไม่มีประโยชน์สำหรับอุปกรณ์นั้น พวกเขาอาจบอกว่าพวกเขากำลังช่วยในการจัดการเครือข่าย WiFi แต่ปัญหาใด ๆ เกี่ยวกับแบนด์วิดท์ในเครือข่าย WiFi ของฉันเป็นปัญหาของฉันไม่ใช่ของ Apple

นอกจากนี้หากสิ่งที่พวกเขาใส่ใจจริงๆคือการป้องกันการใช้แบนด์วิดท์ที่ไม่ต้องการและมากเกินไปพวกเขาจะจัดเตรียมการตั้งค่าเพื่อให้ผู้ใช้สามารถเลือกใช้เสียงเว็บแอปได้ นอกจากนี้พวกเขาจะทำบางอย่างเพื่อ จำกัด เว็บไซต์ไม่ให้ใช้แบนด์วิดท์ที่เท่ากันด้วยวิธีอื่น แต่ไม่มีข้อ จำกัด ดังกล่าว เว็บไซต์สามารถดาวน์โหลดไฟล์ขนาดใหญ่ในพื้นหลังซ้ำแล้วซ้ำอีกและ Apple ก็ไม่สนใจเรื่องนั้น และสุดท้ายฉันเชื่อว่าเสียงนั้นสามารถดาวน์โหลดได้ดังนั้นจึงไม่มีการบันทึกแบนด์วิดท์จริง! Apple ไม่อนุญาตให้เล่นโดยอัตโนมัติโดยไม่มีการโต้ตอบกับผู้ใช้ทำให้ไม่สามารถเล่นเกมได้ซึ่งแน่นอนว่าเป็นเจตนาที่แท้จริงของพวกเขา

Apple ปิดกั้นเสียงเนื่องจากพวกเขาเริ่มสังเกตเห็นว่าแอพ HTML5 สามารถทำได้เช่นเดียวกับแอพเนทีฟหากไม่เป็นเช่นนั้น หากคุณต้องการเสียงใน Web Apps คุณต้องล็อบบี้ Apple เพื่อหยุดการต่อต้านการแข่งขันเช่น Microsoft ไม่มีปัญหาทางเทคนิคที่สามารถแก้ไขได้ที่นี่


มันไม่เหมือนกันสำหรับ Android?
Rune Jeppesen

1
@Rune Jeppesen ไม่ฉันมีแอป PhoneGap / Cordova ซึ่งมีเครื่องเล่นเสียงและทำงานได้อย่างสมบูรณ์บน Android เหตุผลเดียวที่ฉันมาถึงหัวข้อนี้ที่นี่ใน StackOverflow คือข้อ จำกัด ของ iOS เกี่ยวกับการเล่นเสียง
Ulysses Alves

ตอนนี้ Chrome สำหรับ Android และสำหรับเดสก์ท็อปมีนโยบายคล้ายกับ iOS
Ore4444

29

Apple ปฏิเสธมาตรฐานเว็บ HTML5 จำนวนมากบนอุปกรณ์ iOS ของตนอย่างน่ารำคาญด้วยเหตุผลทางธุรกิจหลายประการ ท้ายที่สุดแล้วคุณไม่สามารถโหลดล่วงหน้าหรือเล่นไฟล์เสียงอัตโนมัติก่อนเหตุการณ์สัมผัสได้โดยจะเล่นทีละเสียงเท่านั้นและไม่รองรับ Ogg / Vorbis อย่างไรก็ตามฉันพบวิธีแก้ปัญหาที่ดีอย่างหนึ่งเพื่อให้คุณควบคุมเสียงได้มากขึ้นเล็กน้อย

<audio id="soundHandle" style="display:none;"></audio>

<script type="text/javascript">

var soundHandle = document.getElementById('soundHandle');

$(document).ready(function() {
    addEventListener('touchstart', function (e) {
        soundHandle.src = 'audio.mp3';
        soundHandle.loop = true;
        soundHandle.play();
        soundHandle.pause();
    });
});

</script>

โดยทั่วไปคุณจะเริ่มเล่นไฟล์เสียงในกิจกรรมสัมผัสแรกจากนั้นคุณจะหยุดเล่นชั่วคราวทันที ตอนนี้คุณสามารถใช้คำสั่ง soundHandle.play () และ soundHandle.pause () ตลอด Javascript ของคุณและควบคุมเสียงโดยไม่มีเหตุการณ์สัมผัส หากคุณสามารถจับเวลาได้อย่างสมบูรณ์เพียงแค่ให้หยุดชั่วคราวหลังจากที่เสียงจบลง แล้วครั้งต่อไปที่คุณเล่นอีกครั้งมันจะวนกลับไปที่จุดเริ่มต้น สิ่งนี้จะไม่ช่วยแก้ปัญหาทั้งหมดที่ Apple ทำที่นี่ แต่เป็นทางออกเดียว


ฉันยังไม่ได้ลอง แต่ถ้ามันใช้งานได้จริงนี่ยอดเยี่ยมมาก
Courtsimas

3
แปลกใจที่มีคนไม่สนใจเรื่องนี้มากขึ้น
aoeu256

ตอนนี้ยังใช้งานได้ไหม ดูเหมือนว่าฉันจะสามารถทำให้มันทำงานได้ ...
zillaofthegods

@MastaBaba นี่น่าจะเป็นคำตอบที่ได้รับการยอมรับ ทำไม? มันไม่ตอบคำถามเพราะนี่คือสิ่งที่ OP ขอ: ฉันกำลังพยายามรับไฟล์เสียงเพื่อเล่นอัตโนมัติใน Safariและคำตอบนี้ไม่ได้ช่วยในการเล่นอัตโนมัติ
เดบิว

23

สำหรับ iOS 4.2.1 การคลิกปลอมหรือเคล็ดลับ. load () จะไม่ทำงานเพื่อเล่นเสียงอัตโนมัติบนอุปกรณ์ iOS ใด ๆ ตัวเลือกเดียวที่ฉันรู้คือให้ผู้ใช้ดำเนินการคลิกและเริ่มเล่นในตัวจัดการเหตุการณ์คลิกโดยไม่ต้องตัดการเรียก. play () ในทุกสิ่งที่ไม่ตรงกัน (ajax, setTimeout เป็นต้น)

ใครบางคนช่วยบอกฉันทีว่าฉันเข้าใจผิด ฉันมีช่องโหว่ในการทำงานสำหรับทั้ง iPad และ iPhone ก่อนการอัปเดตล่าสุดและดูเหมือนว่าจะปิดไปแล้ว


5
ฉันสามารถตรวจสอบได้ว่าฉันมีรหัสที่ใช้งานได้เพื่อเล่นเสียงอัตโนมัติโดยไม่มีการแทรกแซงของผู้ใช้ทั้งบน iPad และ iPod touch ก่อนหน้า 4.2.1 ฉันเพิ่งอัปเดต iPad ของฉันเป็น 4.2.1 ในวันนี้ (ระหว่างการทดสอบตัวโหลดเสียงล่วงหน้าเมื่อมันเกิดขึ้น) และดูด้วยความสยองขวัญขณะที่มันหยุดทำงาน
Jason Kester

2
ใน<video>4.2.1 ฉันได้ตรวจสอบแล้วว่าตราบใดที่สิ่ง.load()นั้น.play()มาในตัวจัดการการคลิก / แตะแบบซิงโครนัสมันจะใช้งานได้ มิฉะนั้นจะล้มเหลว
N Rohler

1
ดูเหมือนว่าการควบคุมการเขียนโปรแกรมของสื่อ (เสียงและวิดีโอ) องค์ประกอบถูกเปิดใช้งานหลังจากที่โต้ตอบกับผู้ใช้ต่อองค์ประกอบสื่อ กล่าวคือถ้าคุณมีองค์ประกอบเสียง A และ B และคุณเริ่มเล่น A ผ่านรหัสภายในขอบเขตของตัวจัดการเหตุการณ์คลิก (หรือสัมผัส) ก็จะใช้งานได้ แต่นั่นไม่ได้หมายความว่าคุณสามารถเริ่มเล่น B ได้ในภายหลังนอกขอบเขตของตัวจัดการเหตุการณ์คลิก ปฏิบัติต่อองค์ประกอบสื่อใน iOS เป็นแหล่งข้อมูลเดี่ยวและสลับแหล่งในอินสแตนซ์เดียวแทนที่จะคูณอินสแตนซ์ตามแหล่งที่มา
Tim Erickson

10

ฉันยืนยันว่าเสียงไม่ทำงานตามที่อธิบายไว้ (อย่างน้อยบน iPad ที่ใช้ 4.3.5) ปัญหาเฉพาะคือเสียงจะไม่โหลดด้วยวิธีอะซิงโครนัส (ajax เหตุการณ์จับเวลา ฯลฯ ) แต่จะเล่นได้หากโหลดไว้ล่วงหน้า ปัญหาคือการโหลดจะต้องอยู่ในเหตุการณ์ที่ผู้ใช้ทริกเกอร์ ดังนั้นหากคุณสามารถมีปุ่มสำหรับผู้ใช้เพื่อเริ่มการเล่นคุณสามารถทำสิ่งต่อไปนี้:

function initSounds() {
    window.sounds = new Object();
    var sound = new Audio('assets/sounds/clap.mp3');
    sound.load();
    window.sounds['clap.mp3'] = sound;
}

จากนั้นในการเล่นเช่นในคำขอ ajax คุณสามารถทำได้

function doSomething() {
    $.post('testReply.php',function(data){
        window.sounds['clap.mp3'].play();
    }); 
}

ไม่ใช่วิธีแก้ปัญหาที่ดีที่สุด แต่อาจช่วยได้โดยเฉพาะอย่างยิ่งการรู้ว่าผู้ร้ายคือฟังก์ชันโหลดในเหตุการณ์ที่ไม่ได้ถูกกระตุ้นโดยผู้ใช้

แก้ไข: ฉันพบคำอธิบายของ Apple และมีผลกับ iOS 4+: http://developer.apple.com/library/safari/#documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html


นี่คือคำตอบระดับทอง คุณสามารถเติมวัตถุเสียงด้วยหลายเสียง และหลังจาก ajax โทรในกรณีความสำเร็จ / ข้อผิดพลาดจะเล่นตามที่คุณต้องการ ใช้ได้กับฉันในทุกอุปกรณ์! tnx ใหญ่ !!!
Andris

7

ลองเรียกเมธอด. load () ก่อนเมธอด. play () บนแท็กเสียงหรือวิดีโอ ... ซึ่งจะเป็น HTMLAudioElement หรือ HTMLVideoElement ตามลำดับ นั่นเป็นวิธีเดียวที่จะใช้ได้กับ iPad สำหรับฉัน!


ตามเอกสารของนักพัฒนาแอปเปิลทั้ง. load หรือ. play จะไม่ทำงานยกเว้นเมื่อผู้ใช้ทริกเกอร์
Jeffrey Van Alstine

5

เล่นอัตโนมัติไม่ทำงานบน iPad หรือ iPhone สำหรับแท็กวิดีโอหรือเสียง นี่เป็นข้อ จำกัด ที่กำหนดโดย Apple เพื่อประหยัดแบนด์วิดท์ของผู้ใช้


5

สำหรับฉันแล้วดูเหมือนว่าคำตอบสำหรับคำถามนี้คือ (อย่างน้อยก็ตอนนี้) ที่บันทึกไว้อย่างชัดเจนในเอกสารSafari HTML5 :

ผู้ใช้ควบคุมการดาวน์โหลดผ่านเครือข่ายเซลลูล่าร์

ใน Safari บน iOS (สำหรับอุปกรณ์ทั้งหมดรวมถึง iPad) ซึ่งผู้ใช้อาจอยู่ในเครือข่ายเซลลูลาร์และถูกเรียกเก็บเงินต่อหน่วยข้อมูลการโหลดล่วงหน้าและการเล่นอัตโนมัติจะถูกปิดใช้งาน ไม่มีการโหลดข้อมูลจนกว่าผู้ใช้จะเริ่มต้น ซึ่งหมายความว่าเมธอด JavaScript play () และ load () จะไม่ทำงานเช่นกันจนกว่าผู้ใช้จะเริ่มเล่นเว้นแต่เมธอด play () หรือ load () จะถูกทริกเกอร์โดยการกระทำของผู้ใช้ กล่าวอีกนัยหนึ่งคือปุ่ม Play ที่เริ่มโดยผู้ใช้จะทำงาน แต่เหตุการณ์ onLoad = "play ()" ไม่ทำงาน

นี่เล่นหนัง: <input type="button" value="Play" onClick="document.myMovie.play()">

สิ่งนี้ไม่ได้ทำอะไรบน iOS: <body onLoad="document.myMovie.play()">


2

งงงวยกับเรื่องนี้ในขณะที่พัฒนาเว็บแอปต้นแบบอย่างรวดเร็วภายใต้ iOS4.2 (รุ่น dev) วิธีแก้ปัญหาค่อนข้างง่าย โปรดทราบว่าคุณไม่สามารถมีแท็กในหน้า HTML ของคุณได้คุณจำเป็นต้องแทรกแท็กลงในเอกสารแบบไดนามิก (โปรดทราบว่าตัวอย่างนี้ใช้ Prototype 1.7 สำหรับความยุ่งเหยิงของ Javascript เพิ่มเติม):

this.soundFile = new Element("audio", {id: "audio-1", src: "audio-1.mp3", controls: ""});
document.body.appendChild(this.soundFile);
this.soundFile.load();
this.soundFile.play();

เนื่องจากคุณไม่ได้ตั้งค่าคอนโทรลเลอร์จึงไม่จำเป็นต้องทำอะไรให้ยุ่งยากกับ CSS เพื่อซ่อน / วางตำแหน่งไว้นอกหน้าจอ

ดูเหมือนว่าจะทำงานได้อย่างสมบูรณ์


2

Apple ไม่รองรับมาตรฐานทั้งหมด แต่มีวิธีแก้ปัญหาชั่วคราว เหตุผลของพวกเขาคือความแออัดของเครือข่ายเซลลูลาร์อาจเป็นเพราะคุณจะเข้าสู่หน้าที่เล่นเสียงแบบสุ่ม พฤติกรรมนี้จะไม่เปลี่ยนแปลงเมื่ออุปกรณ์ใช้ wifi อาจจะเป็นเพราะความสม่ำเสมอ อย่างไรก็ตามหน้าเหล่านั้นมักเป็นความคิดที่ไม่ดีอยู่แล้ว คุณไม่ควรพยายามใส่ซาวด์แทร็กในทุกหน้าเว็บ นั่นเป็นสิ่งที่ผิด :)

html5 เสียงจะเล่นหากเริ่มต้นเนื่องจากการกระทำของผู้ใช้ ไม่นับการโหลดหน้าเว็บ ดังนั้นคุณต้องปรับโครงสร้างเว็บแอปของคุณให้เป็นแอปแบบ All-in-one-page แทนที่จะเป็นลิงก์ที่เปิดเพจที่เล่นเสียงคุณต้องใช้ลิงก์นั้นเพื่อเล่นในเพจปัจจุบันโดยไม่ต้องเปลี่ยนเพจ กฎ "การโต้ตอบกับผู้ใช้" นี้ใช้กับเมธอด html5 ที่คุณสามารถเรียกใช้องค์ประกอบเสียงหรือวิดีโอ การโทรจะส่งกลับโดยไม่มีผลใด ๆ หากเริ่มทำงานโดยอัตโนมัติในการโหลดหน้าเว็บ แต่จะทำงานเมื่อถูกเรียกจากตัวจัดการเหตุการณ์


1

วิธีแก้ปัญหาของฉันเรียกใช้จากเหตุการณ์สัมผัสจริงในเมนูก่อนหน้า พวกเขาไม่ได้บังคับให้คุณใช้อินเทอร์เฟซผู้เล่นเฉพาะแน่นอน สำหรับจุดประสงค์ของฉันสิ่งนี้ใช้ได้ดี หากคุณไม่มีอินเทอร์เฟซที่ใช้งานอยู่แสดงว่าคุณกำลังบั๊ก บางทีคุณอาจลองเอียงเหตุการณ์หรืออะไร ...


1

หากคุณสร้างองค์ประกอบเสียงโดยใช้:

var a = new Audio("my_audio_file.wav");

และเพิ่มsuspendผู้ฟังเหตุการณ์ผ่าน:

a.addEventListener("suspend", function () {console.log('suspended')}, false);

จากนั้นโหลดไฟล์ลงใน Safari บนมือถือ (iPad หรือ iPhone) คุณจะเห็นข้อความ "ระงับ" ให้ลงชื่อเข้าใช้ในคอนโซลนักพัฒนาซอฟต์แวร์ ตามข้อกำหนด HTML5 หมายความว่า "ตัวแทนผู้ใช้ไม่ได้ตั้งใจดึงข้อมูลสื่อในขณะนี้ แต่ไม่มีการดาวน์โหลดทรัพยากรสื่อทั้งหมด"

การเรียกใช้ a.load () ที่ตามมาทดสอบเหตุการณ์ "canplay" จากนั้นใช้ a.play () ดูเหมือนจะเป็นวิธีที่เหมาะสมสำหรับการเรียกใช้เสียงโดยอัตโนมัติ


ฉันลองแล้ว แต่ดูเหมือนจะไม่ได้ผล มีอะไรอัพเดตไหม? sandbox.coolaj86.info/html5-audio-tag-ios4.html
coolaj86

0

ทำงานร่วมกับ jQuery ทดสอบบน Ipad v.5.1.1

$('video').get(0).play();

คุณต้องต่อท้าย / ลบองค์ประกอบวิดีโอออกจากหน้า


3
ไม่ทำงานบน iPad 1 iOS 5.1.1 ... แม้ว่าจะทำงานบน iPod 6.0 และ iPhone
morgan_il

0

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

var mobile = /iPad|iPhone|iPod|android/.test(navigator.userAgent) && !window.MSStream;
if (mobile) {
    $('body').on('touchstart click doubleclick keydown', function() {
        $("audio[autoplay='autoplay']").each(
            function(){
                this.play();
                this.removeAttribute('autoplay');
            });
    });
}

0

ดูเหมือนว่าจะได้ผล:

<html>
<title>
iPad Sound Test  - Auto Play
</title>
</head>
<body>
<audio id="audio" src="mp3test.mp3" controls="controls" loop="loop">
</audio>
<script type="text/javascript"> 
    window.onload = function() {
        var audioPlayer = document.getElementById("audio");
        audioPlayer.load();
        audioPlayer.play();
    };
    </script> 

</body>
</html>

ดูการใช้งานจริงที่นี่: http://www.johncoles.co.uk/ipad/test/1.html (ที่เก็บถาวร)

สำหรับ iOS 4.2 สิ่งนี้ใช้ไม่ได้อีกต่อไป ขออภัย.


@ NisseEngströmสำหรับฉันดูเหมือนว่าไฟล์ mp3 จะไม่ถูกเก็บถาวรเช่นกันดังนั้นการแก้ไขลิงก์ที่เก็บถาวรจึงค่อนข้างสงสัย
Goodbye StackExchange

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