ChatGPT解决这个技术问题 Extra ChatGPT

使用 HTML5 在 iPad 上自动播放音频文件

我正在尝试让音频文件在 iPad 上的 Safari 中自动播放。如果我在 Mac 上使用 Safari 访问该页面,那很好。在 iPad 上,自动播放不起作用。

这不是一个答案,而只是一个观察。当我将 WireShark 连接到 iPad 时,我注意到它不会自动播放,但仍会下载 Wave 文件。第一个 HTTP Get 只请求文件的前 2 个字节,然后 iPad 在更多 Get 请求中请求 Wave 文件的其余部分。更奇怪的是,当您单击音频组件的“播放”按钮时,iPad 会再次重新加载 Wave 文件。

R
Rick M

我还想强调,你不能这样做的原因是 Apple 做出的商业决策,而不是技术决策。也就是说,苹果在 iPod Touch 上禁用网络应用程序的声音没有合理的技术理由。那只是一个 WiFi 设备,而不是可能会产生昂贵的带宽费用的电话,因此该论点对该设备的价值为零。他们可能会说他们正在帮助 WiFi 网络管理,但是我的 WiFi 网络上的任何带宽问题都是我关心的,而不是 Apple 的。

此外,如果他们真正关心的是防止不必要的、过多的带宽消耗,他们将提供一个设置以允许用户选择加入网络应用程序的声音。此外,他们会采取措施限制网站通过其他方式消耗同等带宽。但是没有这样的限制。一个网站可以在后台一遍又一遍地下载巨大的文件,而苹果可能不太关心这一点。最后,我相信无论如何都可以下载声音,因此实际上没有保存任何带宽!苹果只是不允许它们在没有用户交互的情况下自动播放,这使得它们无法用于游戏,这当然是它们的真正意图。

Apple 屏蔽了声音,因为他们开始注意到 HTML5 应用程序可以与原生应用程序一样强大,甚至更多。如果您想在 Web 应用程序中使用声音,您需要游说 Apple 停止像 Microsoft 那样反竞争。这里没有可以解决的技术问题。


Android不一样吗?
@Rune Jeppesen 不。我有一个带有音频播放器的PhoneGap/Cordova 应用程序,它在Android 上完美运行。我在 StackOverflow 中谈到这个话题的唯一原因是 iOS 对音频播放的限制。
现在它适用于 Android 和桌面的 Chrome 具有类似于 iOS 的策略
a
andrewb

更新:这是一个 hack,它不再适用于 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> 

这不是我的来源。我前段时间发现了这个,并在带有 IOS 3.2.X 的 iPad 和 iPhone 上测试了代码。


这是另一种解决方法:codeblog.co/getting-autoplay-working-on-ios 我刚刚验证这适用于装有 iOS 3.2 的 iPad。
不要浪费你的时间,因为它不再适用于 iOS 4+
k
kaleazy

出于各种商业原因,Apple 令人讨厌地在其 iOS 设备上拒绝了许多 HTML5 网络标准。最终,您无法在触摸事件之前预加载或自动播放声音文件,它一次只播放一种声音,并且不支持 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>

基本上,您在第一次触摸事件时开始播放音频文件,然后立即暂停。现在,您可以在整个 Javascript 中使用 soundHandle.play() 和 soundHandle.pause() 命令,并在没有触摸事件的情况下控制音频。如果你可以完美地计时,只需在声音结束后立即暂停。然后下次再次播放时,它会循环回到开头。这并不能解决苹果在这里造成的所有混乱,但它是一种解决方案。


我还没有尝试过,但如果它真的有效,那就太棒了。
很惊讶更多的人对此不感兴趣。
这仍然有效吗?我似乎能够让它发挥作用......
@MastaBaba 这应该是公认的答案。为什么?它没有回答这个问题,因为这是 OP 要求的:我正在尝试让一个音频文件在 Safari 中自动播放,而这个答案对自动播放没有帮助。
D
David Gouldin

从 iOS 4.2.1 开始,假点击和 .load() 技巧都不能在任何 iOS 设备上自动播放音频。我知道的唯一选择是让用户实际执行单击操作并在单击事件处理程序中开始播放,而不将 .play() 调用包装在任何异步(ajax、setTimeout 等)中。

如果我弄错了,请告诉我。在最近的更新之前,我在 iPad 和 iPhone 上都有工作漏洞,而且所有这些漏洞看起来都已经被关闭了。


我可以验证我的代码在 iPad 和 iPod touch(4.2.1 之前)上无需用户干预即可自动播放音频。我今天刚刚将我的 iPad 更新到 4.2.1(在测试我的音频预加载器的过程中),并惊恐地看着它停止工作。
在带有 4.2.1 的 <video> 上,我已验证只要 .load() 然后 .play() 进入 同步 点击/点击处理程序,它就可以工作。否则,它会失败。
似乎在每个媒体元素的用户交互之后启用了媒体(音频和视频)元素的编程控制。即,如果您有音频元素 A 和 B,并且您通过单击(或触摸)事件处理程序范围内的代码开始播放 A,则它可以工作。但这并不意味着您以后可以在单击事件处理程序范围之外开始播放 B。将 iOS 中的媒体元素视为单例并在一个实例上交换源,而不是将实例与源相乘。
J
Jacob Mouka

我确认音频没有像描述的那样工作(至少在运行 4.3.5 的 iPad 上)。具体问题是音频不会以异步方法(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!!!
B
Brian Brown

尝试在音频或视频标签上的 .play() 方法之前调用 .load() 方法......这将分别是 HTMLAudioElement 或 HTMLVideoElement。对我来说,这是它在 iPad 上工作的唯一方式!


根据苹果开发者文档,.load 和 .play 都不起作用,除非由用户触发。
A
Andrew

自动播放在 iPad 或 iPhone 上不能用于视频或音频标签。这是 Apple 为节省用户带宽而设置的限制。


A
Adrian

在我看来,这个问题的答案(至少现在)清楚地记录在 Safari HTML5 docs 上:

用户通过蜂窝网络控制下载

在 iOS 上的 Safari(适用于所有设备,包括 iPad)中,用户可能在蜂窝网络上并按数据单位收费,预加载和自动播放被禁用。在用户启动数据之前不会加载数据。这意味着 JavaScript play() 和 load() 方法在用户开始播放之前也是不活动的,除非用户操作触发了 play() 或 load() 方法。换句话说,用户启动的播放按钮有效,但 onLoad="play()" 事件无效。

这会播放电影:<input type="button" value="Play" onClick="document.myMovie.play()">

这在 iOS 上没有任何作用:<body onLoad="document.myMovie.play()">


J
Jon Jardine

在 iOS4.2 (dev build) 下开发快速原型 web 应用程序时对此感到困惑。解决方案其实很简单。请注意,您的 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 做任何棘手的事情来隐藏它/将其放置在屏幕外。

这似乎完美无缺。


b
bmidgley

Apple 不完全支持该标准,但有一种解决方法。他们的 justification 是蜂窝网络拥塞,可能是因为您将登陆播放随机音频的页面。当设备连接 wifi 时,这种行为不会改变,可能是为了保持一致性。顺便说一句,这些页面通常是个坏主意。您不应该尝试在每个网页上放置配乐。那是错误的。 :)

如果作为用户操作的结果启动,则将播放 html5 音频。加载页面不算数。因此,您需要将 Web 应用程序重组为一个多合一页面应用程序。您需要该链接在当前页面上播放它,而不是打开一个播放音频的页面的链接,而不需要更改页面。此“用户交互”规则适用于您可以在音频或视频元素上调用的 html5 方法。如果它们在页面加载时自动触发,则调用返回没有任何效果,但在从事件处理程序调用时它们会起作用。


C
Cameron

如果您使用以下方法创建音频元素:

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
L
Luke Stanley

我的解决方案是从先前菜单中的真实触摸事件触发。他们当然不会强迫您使用特定的播放器界面。就我的目的而言,这很好用。如果您没有要使用的现有界面,那您就大错特错了。也许你可以尝试倾斜事件或其他东西......


A
Adrian

适用于 jQuery,在 Ipad v.5.1.1 上测试

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

您必须从页面中附加/删除视频元素。


不适用于 iPad 1 iOS 5.1.1 ... 虽然适用于 iPod 6.0 和 iPhone
A
Andrew Hancox

我通过将允许您触发音频的所有事件的事件处理程序附加到 body 元素来处理此问题,该 body 元素触发任何具有自动播放功能的 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');
            });
    });
}

N
Nisse Engström

这似乎有效:

<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 (Archived)

从 iOS 4.2 开始,这不再有效。对不起。


@NisseEngström 在我看来,mp3 文件也没有存档,所以这个存档链接编辑很没有意义。
@FrankerZ:有 mp3 链接吗?我错过了。谢谢。