Ho avuto difficoltà con un bug di distorsione audio elusivo utilizzando webkitAudioContext in HTML5 su iOS 6. Può accadere in altre circostanze, ma l'unico modo che posso ottenere una repro al 100% è la prima volta che visita la mia pagina dopo aver spento il dispositivo. Sembra che se visiti una pagina con capacità audio prima di visitare questa, il problema non si verificherà.WebKit L'audio distorce su iOS 6 (iPhone 5) la prima volta dopo il power cycling
La distorsione avviene solo per l'audio generato da webkitAudioContext.decodeAudioData() e quindi riprodotto tramite webkitAudioContext.createBufferSource(). La riproduzione audio di webkitAudioContext.createMediaElementSource() sarà non distorsione.
Mi manca un passaggio di inizializzazione? Ecco il codice HTML e nella sua interezza che ho presentato ad Apple come un bug report (ma non ho ricevuto alcuna risposta):
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
var buffer = null;
var context = null;
var voice = null;
function load_music(file) {
context = new webkitAudioContext();
voice = context.createBufferSource();
var request = new XMLHttpRequest();
request.onload = function() {
context.decodeAudioData(request.response, function(result) {
buffer = result;
document.getElementById("start").value = "Start";
});
};
var base = window.location.pathname;
base = base.substring(0, base.lastIndexOf("/") + 1);
request.open("GET", base + file, true);
request.responseType = "arraybuffer";
request.send(null);
}
function start_music() {
if (!buffer) {
alert("Not ready yet");
return;
}
voice.buffer = buffer;
voice.connect(context.destination);
voice.noteOn(0);
document.getElementById("compare").style.display = "block";
}
</script>
</head>
<body onload="load_music('music.mp3')">
<p>This is a simple demo page to reproduce a <strong>webkitAudio</strong>
problem occurring in Safari on iOS 6.1.4. This is a stripped down demo
of a phenomenon discovered in our HTML5 game under development,
using different assets.</p>
<p><u>Steps to reproduce:</u></p>
<ol>
<li>Power cycle <strong>iPhone 5 with iOS 6.1.4</strong>.</li>
<li>Launch Safari immediately, and visit this page.</li>
<li>Wait for "Loading..." below to change to
"Start".</li>
<li>Tap "Start".</li>
</ol>
<p><u>Issue:</u></p>
<p>Audio will be excessively distorted and play at wrong pitch. If
another audio-enabled web site is visited before this one, or this
site is reloaded, the audio will fix. The distortion only happens on
the first visit after cold boot. <strong>To reproduce the bug, it is
critical to power cycle before testing.</strong></p>
<p>This bug has not been observed on any other iOS version (e.g. does
not occur on iPad Mini or iPod 5 using iOS 6.1.3).</p>
<input id="start" type="button" value="Loading..." onmousedown="start_music()" />
<span id="compare" style="display:none;"><p><a href="music.mp3">Direct link</a> to audio file, for
comparison.</p></span>
</body>
</html>
Nota: il testo del corpo suggerisce che questo si verifica solo su iOS 6.1.4, ma voglio dire per dire che il problema si verifica solo con il power cycling in questa situazione. Ho riscontrato il problema anche su iPad Mini alla versione 6.1.3, ma non sul ciclo di alimentazione.
Modifica: alcune cose che ho provato ... Il rinvio della creazione della sorgente del buffer non fa differenza. L'uso di transcoder diversi per generare il file .mp3 riprodotto non fa differenza. Riproduzione del silenzio "a perdere" poiché il primo suono non fa alcuna differenza poiché la distorsione continua per ogni decodifica del suono AudioData finché la pagina non viene ricaricata. Se le origini createMediaElementSource e createBufferSource sono miste nella stessa pagina, solo l'audio createBufferSource (utilizzando decodeAudioData) verrà distorto. Quando controllo request.response.byteLength nel caso di errore e nel caso di non fallimento, sono uguali, suggerendo che XMLHttpRequest non restituisca dati errati, anche se penserei che il danneggiamento dei dati danneggerebbe l'intestazione MP3 e renderizzerebbe il file comunque non riproducibile.
C'è una differenza osservabile tra la condizione di errore e la condizione di non fallimento. Il valore di sola lettura context.sampleRate sarà 48000 nello stato di errore e 44100 nello stato di non fallimento. (Eppure lo stato di errore suona più basso dello stato di non fallimento.) L'unica cosa che mi viene in mente è un hack in cui aggiorno la pagina tramite JavaScript se 48000 viene rilevato su un browser che dovrebbe segnalare 44100, ma questo è grave screening e non molto a prova di futuro, il che mi rende nervoso.
E 'ancora un problema su IOS 8. –
Così come 9.2.1 (la versione più recente come di questa scrittura) –