Autor Zpráva
JardaB
Profil
Zdravím, vytvořil jsem si jednoduchou hru, kde se mi ve smyčce spouští zvuk. Na webu vše jede, ale v mobilu ticho.. Poradí někdo proč? Nebo jak na to aby to i v mobilu šlapalo?
testoval jsem

audio.canPlayType("audio/mpeg"); 
i v mobilu vrací probably

kousek mého kodu:

var audioPipak = new Audio("wav/alarm.mp3");
audioPipak.loop = true;
audioPipak.volume = 0.5;

if(typeof audioPipak != 'undefined') {
            audioPipak.play();
           }



tak to testuji na holé stránce a funguje... problém bude někde v kodu jinde.. divné ale že v pc přes prohlížeč ok ale mobil nic. V prohlížeči si mohu zapnout konzoli a vidím chyby, v mobilu nevím zda tohle nějak jde
weroro
Profil
Ja v práci debugujem takto: developers.google.com/web/tools/chrome-devtools/remote-debugging
Podobne sa to robí aj pre iOS.
JardaB
Profil
Tohle je na mě už moc složité.. :D ale asi mi nic jiného nezbude..


Nalezl jsem zdroj problému, ale jelikož v JS dělám chvíli, nevím jak to řešit..

následující funguje i v mobilu:
<script>
var audio = new Audio("wav/alarm.mp3");
audio.loop = true;
audio.volume = 0.5;
</script>

<a href="#" onclick="audio.play();">Play</a> | 
<a href="#" onclick="audio.pause();">Stop</a>

ale když chci zvuk spustit rovnou a ne kliknutím, tak již v mobilu nejde

<script>
var audio = new Audio("wav/alarm.mp3");
audio.loop = true;
audio.volume = 0.5;
audio.play();
</script>
<a href="#" onclick="audio.pause();">Stop</a>
Keeehi
Profil
Zkus toto:
<script>
var audio = new Audio("wav/alarm.mp3");
audio.loop = true;
audio.volume = 0.5;
audio.addEventListener("canplay", function() {
    audio.play();
});
</script>
<a href="#" onclick="audio.pause();">Stop</a>
To by mělo zapnout přehrávání ve chvíli, kdy si prohlížeč myslí, že má už dostatek stažených dat.

Je teoreticky ale možné, že automatické přehrávání mobilní prohlížeče aktivně blokují, jelikož to bývá velmi otravné.
JardaB
Profil
To mě taky napadlo, ale asi to nebude ten problém.. Vyzkoušel jsem a nefunguje ani tvé řešení. Audio má pár kb, v prohlížeči zvuk jede v mobilu ne.. testováno na více zařízeních.

tvoje řešení sem dal sem, pokud chce někdo otestovat z mobilu myfish.cz/vr/audio.php
weroro
Profil
Skúšal si to pomocou značky <audio> ? Nie je to elegantné ale čisto teoreticky by to mohlo fungovať ak nastavíš značke atribút autoplay.
Môžeš túto značku generovať pomocou JS.
JardaB
Profil
nezobrazí náhodou tag <audio> i panel přehrávání? Nezkoušel jsem, ale měl jsem právě zato, že tohle je určeno na trochu jiný charakter přehrávání..
weroro
Profil
Controls je možné vypnúť.
JardaB
Profil
vyzkoušeno, vytvořil jsem následovně:

<script>
var audio = document.createElement('audio');
audio.src = 'wav/tuk.wav';
audio.play();
</script>

také nefunguje, jen v prohlížeči ano :D
Přijde mi jako by nějak mobil podporu tohoto vypínal přčemž
audio.canPlayType("audio/mpeg"); 
vrací propably
weroro
Profil
Skús to takto. Vycucal som si to z prsta ale možno motyka vystrelí. :-)
var MobilePlay = function () {

    /** @type {MobilePlay} */
    var self = this;

    /** @type {null} */
    this.source = null;

    /** @type {AudioContext|webkitAudioContext|null} */
    this.context = null;

    /**
     * @param {String} file
     * @returns {void}
     */
    var loadFile = function (file) {
        var soundXhr = new XMLHttpRequest();
        soundXhr.open('GET', file);
        soundXhr.responseType = 'arraybuffer';
        soundXhr.addEventListener('load', function (r) {
            self.context.decodeAudioData(
                soundXhr.response,
                function (buffer) {
                    self.source.buffer = buffer;
                    self.source.connect(self.context.destination);
                    self.source.loop = false;
                });
            self.play();
        });
        soundXhr.send();
    };

    /**
     * @returns {void}
     */
    this.play = function () {
        this.source.start(0);
    };

    /**
     * @param {String} file
     * @returns {void}
     */
    this.init = function (file) {
        this.context = new (window.AudioContext || window.webkitAudioContext)();
        this.source = this.context.createBufferSource();
        loadFile(file);
    };
};
(new MobilePlay()).init('wav/tuk.wav');
Audio súbor musí byť na tej istej doméne ako script, kvôli cross-origin.
JardaB
Profil
Mno paráda, takhle bych potřeboval cucat taky.. Tohle jede... jen v tom kodu se ve všem nevyznám, proto nevím jak k tomu dodělat pauzu..
V čem je tedy pro vysvětlení základní problém u toho mého kodu?


Přehlédl jsem tvou poslední pozn. za sciptem.. zkusím se v tom trochu pohrabat.. díky
weroro
Profil
Tvoje riešenie nefungovalo preto lebo už ako spomenul Keeehi, mobilné zariadenia defaultne blokujú automatické spúšťanie zvuku.
Moje riešenie (Web Audio API) je iba akési obídenie tejto reštrikcie a ak robíš hru, nie je toto riešenie vhodné. Pri vývoji hier sa používajú iné techniky Audio for Web games
JardaB
Profil
To by mě opravdu nenapadlo, že mobilní zařízení budou blokovat automatické spouštění hudby.. Neprogramuji vyloženě složitou hru, ale jistá oznamovací akce vyžadovala spuštění alarmu a tato akce má být náhodná, tedy ji nespouští uživatel kliknutím např., což asi bude právě tento problém. Mrknu později na ten článek a kouknu jak se to řeší i když tvé řešení funguje...

Jelikož na začátek toho mám s JS až nad hlavu, položím ještě jednu otázku, nelze opravdu nějak v JS nasimulovat akci ( např. kliknutí) a poté spustit ten zvuk?
Keeehi
Profil
JardaB:
nelze opravdu nějak v JS nasimulovat akci
Samotnou akci JS vyvolat jde. Ale jsem si téměř jistý, že tvůrci mobilních prohlížečů na toto mysleli a ověřují, zda akce vycházela od uživatele, nebo ji vyvolal JS.
JardaB
Profil
rozumím to mi taky došlo, že to nelze... Prozatím použiju kod, který funguje, jen prosím o radu, jak zvuk stopnout, když v kodu nastavím self.source.loop = true;
Chápu zatím jen část toho kodu, tak nechci nadmíru experimentovat... Děkuji
JardaB
Profil
Vyřešeno kompromisem, což mi stačí... z prohlížeče běží alarm dokud klient nevypne nebo neuběhne požadovaná doba a při detekci mobilního zařízení zazní jen tón, který není ve smyčce.
Sem se v tom scriptu babral dlouho a pak mi došlo, nevím tedy zda správně, že pokud spustím zvuk ve smyčce viz. var MobilePlay = function (), tak jej už není jak zastavit uživatelem

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: