iPadでHTML5を使用してオーディオファイルを自動再生する


88

iPadのSafariでオーディオファイルを自動再生しようとしています。MacでSafariを使用してページにアクセスしても問題ありません。iPadでは、自動再生は機能しません。


1
これは答えではなく単なる観察です。iPadへの接続にWireSharkを配置すると、自動再生されないことに気付きましたが、いずれにせよWaveファイルがダウンロードされています。最初のHTTP Getはファイルの最初の2バイトを要求するだけですが、iPadはさらにいくつかのGet要求でWaveファイルの残りの部分を要求します。さらに奇妙なのは、オーディオコンポーネントの[再生]ボタンをクリックすると、iPadが再びWaveファイルをリロードすることです。
Javamann、2011

回答:


34

更新:これはハックであり、IOS 4.X以降では動作しません。これはIOS 3.2.Xで動作しました。

それは真実ではない。Appleは、モバイルネットワークで使用できるトラフィックの量が多いため、iPadでビデオとオーディオを自動再生したくありません。オンラインコンテンツには自動再生を使用しません。オフラインHTMLサイトの場合、これは優れた機能であり、これを使用してきました。

これは「JavaScriptの偽のクリック」ソリューションです: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のコードをテストしました。


1
これが別の回避策です:codeblog.co/getting-autoplay-working-on-iosこれがiOS 3.2のiPadで動作することを確認しました。
Ciryon

49
iOS 4以降では機能しないため、時間を無駄にしないでください
jcampbell1 '20

104

また、これができないのは、Appleが行ったビジネス上の決定であり、技術的な決定ではないことも強調しておきます。つまり、AppleがiPod Touch上のWebアプリからのサウンドを無効にする合理的な技術的根拠はありませんでした。これはWiFiデバイスのみであり、高額な帯域幅の料金が発生する可能性のある電話ではないため、そのデバイスに対する議論のメリットはありません。彼らはWiFiネットワーク管理を手助けしていると言うかもしれませんが、私のWiFiネットワークの帯域幅に関する問題はAppleの問題ではなく、私の問題です。

また、彼らが本当に気にかけているのが不要で過剰な帯域幅の消費を防ぐことだった場合、ユーザーがWebアプリのサウンドをオプトインできるようにする設定を提供します。また、Webサイトが同等の帯域幅を他の方法で消費するのを制限するために何かをします。しかし、そのような制限はありません。Webサイトはバックグラウンドで巨大なファイルを何度もダウンロードする可能性があり、Appleはそれについてあまり気にしませんでした。そして最後に、サウンドはとにかくダウンロードできると思うので、帯域幅は実際には保存されません!Appleは、ユーザーの操作なしで自動的にプレイすることを許可しないため、ゲームで使用できなくなります。

Appleは、HTML5アプリがネイティブアプリと同等かそれ以上ではないことに気づき始めたため、サウンドをブロックしました。Webアプリでサウンドを使いたい場合は、MicrosoftのようにAppleに対抗しないように働きかける必要があります。ここで修正できる技術的な問題はありません。


Androidでも同じではありませんか?
Rune Jeppesen 2016

1
@Rune Jeppesenいいえ。私はオーディオプレーヤーを備えたPhoneGap / Cordovaアプリを使用しており、Androidで完全に動作します。StackOverflowでこのトピックに到達した唯一の理由は、オーディオ再生に関するiOSの制限です。
Ulysses Alves

今では、クロームのAndroid用とデスクトップ用のiOSに似たポリシーを持っています
Ore4444

28

Appleは、さまざまなビジネス上の理由により、iOSデバイスの多くのHTML5 Web標準をうっとうしく拒否しています。最終的に、タッチイベントの前にサウンドファイルをプリロードしたり自動再生したりすることはできません。一度に1つのサウンドしか再生せず、Ogg / Vorbisをサポートしていません。ただし、オーディオをもう少し制御できるようにするための気の利いた回避策が1つ見つかりました。

<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()コマンドを使用して、タッチイベントなしでオーディオを制御できます。完璧にタイミングを合わせることができる場合は、サウンドが終わった直後にポーズを入れてください。その後、もう一度再生すると、最初に戻ります。これはAppleがここで行ったすべての混乱を解決するわけではありませんが、それは1つの解決策です。


私はまだこれを試していませんが、実際に機能する場合、これは素晴らしいです。
12

3
より多くの人がこれに興味がないと驚いた。
aoeu256 2014年

これはまだ機能していますか?私はこれを機能させることができるように見えることができます...
zillaofthegods '21 / 04/17

@MastaBaba これは受け入れられる答えになるはずです。どうして?これはOPが要求するものであるため、質問には回答しません。Safariでオーディオファイルを自動再生しようとしていますが、この回答は自動再生には役立ちません。
2017

23

iOS 4.2.1以降では、偽のクリックも.load()トリックもiOSデバイスでオーディオを自動再生するようには機能しません。私が知っている唯一のオプションは、ユーザーが実際にクリックアクションを実行し、.play()呼び出しを非同期(ajax、setTimeoutなど)でラップせずにクリックイベントハンドラーで再生を開始することです。

誰かが間違っていると誰か教えてください。私は最新のアップデートの前にiPadとiPhoneの両方に抜け穴があり、それらはすべて閉じられているように見えます。


5
4.2.1より前のiPadとiPod touchの両方で、ユーザーの介入なしにオーディオを自動再生するコードが機能していることを確認できます。今日、iPadを4.2.1にアップデートし(オーディオプレローダーをテストしている最中に)、動作しなくなったのを恐怖で見ていました。
Jason Kester、2010

2
上の<video>4.2.1で、私は長いほどいることを確認した.load()後、.play()内に入る同期クリック/タップハンドラ、それが動作します。それ以外の場合は失敗します。
N Rohler、2011

1
メディア要素(オーディオおよびビデオ)のプログラムによる制御は、メディア要素ごとのユーザー操作後に有効になるようです。つまり、オーディオ要素AとBがあり、クリック(またはタッチ)イベントハンドラーのスコープ内でコードを介してAの再生を開始した場合、それは機能します。ただし、後でクリックイベントハンドラのスコープ外でBの再生を開始できるという意味ではありませ。iOSのメディア要素をシングルトンとして扱い、インスタンスをソースで乗算するのではなく、1つのインスタンスでソースを交換します。
Tim Erickson、2011

9

オーディオが説明どおりに機能していないことを確認しました(少なくとも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 !!!
Andris

7

オーディオタグまたはビデオタグの.play()メソッドの前に.load()メソッドを呼び出してみてください...それぞれHTMLAudioElementまたはHTMLVideoElementになります。それが私にとってiPadで動作する唯一の方法でした!


アップルの開発者ドキュメントによると、ユーザーによってトリガーされた場合を除いて、.loadも.playも機能しません。
Jeffrey Van Alstine、2016年

5

自動再生は、iPadまたはiPhoneのビデオまたはオーディオタグでは機能しません。これは、ユーザーの帯域幅を節約するためにAppleが設定した制限です。


5

この質問への答えは(少なくとも今は)Safari HTML5ドキュメントに明確に文書化されているようですです:

セルラーネットワークを介したダウンロードのユーザーコントロール

iOS上のSafari(iPadを含むすべてのデバイス)で、ユーザーがセルラーネットワーク上にあり、データユニットごとに課金される場合、プリロードと自動再生は無効になります。ユーザーが開始するまで、データは読み込まれません。つまり、ユーザーのアクションによってplay()またはload()メソッドがトリガーされない限り、ユーザーが再生を開始するまで、JavaScriptのplay()およびload()メソッドも非アクティブになります。つまり、ユーザーが開始した再生ボタンは機能しますが、onLoad = "play()"イベントは機能しません。

これは映画を再生します: <input type="button" value="Play" onClick="document.myMovie.play()">

これはiOSでは何もしません: <body onLoad="document.myMovie.play()">


2

iOS4.2(開発ビルド)で簡単なプロトタイプWebアプリを開発している間、これに戸惑いました。解決策は実際には非常に簡単です。HTMLページにタグが既にあるように見えないことに注意してください。実際には、タグを動的にドキュメントに挿入する必要があります(この例では、追加のJavascriptの煩わしさのためにプロトタイプ1.7を使用しています)。

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に移行してもこの動作は変わりません。ちなみに、これらのページは通常、とにかく悪い考えです。すべてのWebページにサウンドトラックを配置するべきではありません。それは間違っています。:)

html5オーディオは、ユーザーアクションの結果として開始された場合に再生されます。ページの読み込みはカウントされません。したがって、オールインワンページのアプリになるようにWebアプリを再構築する必要があります。オーディオを再生するページを開くリンクの代わりに、ページを変更せずに現在のページで再生するには、そのリンクが必要です。この「ユーザー操作」ルールは、オーディオまたはビデオ要素で呼び出すことができるhtml5メソッドに適用されます。呼び出しは、ページの読み込み時に自動的に発生した場合は何の影響もなく戻りますが、イベントハンドラーから呼び出されたときに機能します。


1

私の解決策は、前のメニューの実際のタッチイベントからトリガーすることです。もちろん、特定のプレーヤーインターフェイスの使用を強制するものではありません。私の目的のために、これはうまくいきます。使用する既存のインターフェースがない場合は、困惑しています。多分あなたはティルトイベントか何かを試すことができます...


1

以下を使用してAudio要素を作成する場合:

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

Ipad v.5.1.1でテストされたjQueryで動作します

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

ページからビデオ要素を追加/削除する必要があります。


3
iPad 1 iOS 5.1.1では動作しません... iPod 6.0およびiPhoneでは動作します
morgan_il

0

これを処理するために、自動再生でHTMLオーディオ要素をトリガーしてbody要素にオーディオをトリガーできるすべてのイベントのイベントハンドラーを1回再生するようにアタッチしました。

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ömmp3ファイルもアーカイブされていないように思えるので、このアーカイブリンクの編集はまったく意味がありません。
Goodbye StackExchange 2017

@FrankerZ:mp3リンクはありますか?私は逃しました。ありがとう。
NisseEngström2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.