2013-07-26 6 views
11

के बाद पहली बार मैं आईओएस 6 के तहत एचटीएमएल 5 में वेबकिटऑडियो कॉनटेक्स्ट का उपयोग कर एक छद्म ऑडियो विरूपण बग के साथ संघर्ष कर रहा हूं। यह अन्य परिस्थितियों में हो सकता है, लेकिन एकमात्र तरीका मैं कर सकता हूं डिवाइस को पावर साइकलिंग के बाद मेरे पृष्ठ की पहली विज़िट पर 100% रेपो मिलता है। ऐसा लगता है कि यदि आप इस पर जाने से पहले किसी भी ऑडियो-सक्षम पृष्ठ पर जाते हैं, तो समस्या नहीं होगी।आईओएस 6 (आईफोन 5) पर वेबकिट ऑडियो डिस्टॉर्ट्स पावर साइकलिंग

विरूपण केवल webkitAudioContext.decodeAudioData() द्वारा उत्पन्न ऑडियो के साथ होता है और फिर webkitAudioContext.createBufferSource() के माध्यम से खेला जाता है। WebkitAudioContext.createMediaElementSource() विकृत का ऑडियो प्लेबैक होगा।

क्या मुझे कुछ प्रारंभिक चरण याद आ रहा है?

<!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 &quot;Loading...&quot; below to change to 
       &quot;Start&quot;.</li> 
      <li>Tap &quot;Start&quot;.</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> 

नोट:: यहाँ कोड और एचटीएमएल अपनी संपूर्णता में है कि मैं एक बग रिपोर्ट के रूप में एप्पल को प्रस्तुत (लेकिन कोई जवाब नहीं मिला है) है शरीर पाठ चलता है यह केवल iOS 6.1.4 पर होता है, लेकिन मेरा मतलब है यह कहने के लिए कि समस्या केवल इस स्थिति में पावर साइकलिंग पर होती है। मैंने आईपैड मिनी पर 6.1.3 के तहत भी समस्या का अनुभव किया है, लेकिन बिजली साइकलिंग पर नहीं।

संपादित करें: कुछ चीजें मैंने कोशिश की है ... बफर स्रोत के निर्माण को रोकें कोई फर्क नहीं पड़ता। .mp3 फ़ाइल उत्पन्न करने के लिए विभिन्न ट्रांसकोडर्स का उपयोग करके यह कोई फर्क नहीं पड़ता। पहली ध्वनि के रूप में फेंकने वाली चुप्पी बजाना कोई फर्क नहीं पड़ता क्योंकि पृष्ठ को फिर से लोड होने तक प्रत्येक डिकोडऑडियो डेटा के लिए विरूपण जारी रहता है। यदि CreateMediaElementSource और createBufferSource स्रोत एक ही पृष्ठ में मिश्रित होते हैं, केवल createBufferSource ऑडियो (decodeAudioData का उपयोग करके) विकृत हो जाएगा। जब मैं विफलता मामले और गैर-विफलता मामले में request.response.byteLength की जांच करता हूं, तो वे वही हैं, जो XMLHttpRequest गलत डेटा नहीं लौटा रहा है, हालांकि मुझे लगता है कि डेटा का भ्रष्टाचार एमपी 3 शीर्षलेख को नुकसान पहुंचाएगा और प्रस्तुत करेगा वैसे भी unplayable फ़ाइल।

विफलता की स्थिति और विफलता की स्थिति के बीच एक अवलोकन अंतर है। केवल पढ़ने योग्य मान संदर्भ.sampleRate विफलता स्थिति में 48000 और गैर-विफलता स्थिति में 44100 होगा। (फिर भी विफलता स्थिति गैर-विफलता स्थिति की तुलना में कम पिच लगता है।) केवल एक चीज जो मेरे साथ होती है वह एक हैक है जिसमें मैं जावास्क्रिप्ट के माध्यम से पृष्ठ को रीफ्रेश करता हूं यदि ब्राउज़र पर 48000 पता चला है जो 44100 की रिपोर्ट करनी चाहिए, लेकिन यह गंभीर उपयोगकर्ता है स्क्रीनिंग और भविष्य के सबूत नहीं, जो मुझे परेशान करता है।

उत्तर

7

मुझे HTML5 वीडियो के साथ एक संबंधित बग मिला और मुझे लगता है कि मैंने समस्या की जड़ खोज ली है।
मैंने देखा कि यदि आप <video> टैग का उपयोग कर एक वीडियो चलाते हैं, तो यह संदर्भ.sampleRate मान सेट करता है जो वीडियो के ऑडियो को एन्कोड किया गया था। ऐसा लगता है जैसे आईओएस सफारी के पास एक वैश्विक नमूना है जो यह सब कुछ के लिए उपयोग करता है। इस देखने के लिए, निम्न प्रयास करें:

// Play a video with audio encoded at 44100 Hz 
video.play(); 

// This will console log 44100 
var ctx = new webkitAudioContext(); 
console.log(ctx.sampleRate); 

// Play a video with audio encoded at 48000 Hz 
video2.play(); 

// This will console log 48000 
var ctx = new webkitAudioContext(); 
console.log(ctx.sampleRate); 

यह वैश्विक नमूना दर पृष्ठ लोड में कायम रखना प्रकट होता है और टैब और ब्राउज़र उदाहरणों के बीच साझा किया जाता है। तो, एक और टैब में एक यूट्यूब वीडियो खेलना आपके सभी डीकोडेड ऑडियो तोड़ सकता है।

ऑडियो एक विकृत दर पर डीकोड होने पर विकृत हो जाता है और दूसरे पर खेला जाता है।

  1. डिकोड ऑडियो और स्टोर बफर
  2. इस तरह के एक वीडियो या ऑडियो फ़ाइल
  3. प्ले बफर (विकृत)

मैं नहीं जानता कि खेलने के रूप में नमूना दर बदलने के लिए, कुछ करो ठंड शुरू होने के बाद यह क्यों हो रहा है। अगर मुझे लगता है कि यह सफारी इस ग्लोबल नमूना दर को तब तक शुरू नहीं करता है जब तक कि आप इसे इस्तेमाल करने का प्रयास न करें।

समस्या अभी भी आईओएस 7 पर है, इसलिए मुझे नहीं लगता कि कोई फिक्स जल्द ही आ रहा है। हम एक समय में हैक के साथ फंस गए हैं जैसे एक बदली गई नमूना दर की जांच करना।

+2

यह अभी भी आईओएस 8. –

+1

पर एक मुद्दा साथ ही 9.2.1 (के रूप में नवीनतम संस्करण है इस लेखन के) –

8

मुझे आईओएस 9.2 पर भी इसी तरह की समस्याएं आ रही हैं।

<video> टैग के बिना भी, ठंडे बूट के बाद पृष्ठ पर ऑडियो चलाने पर प्लेबैक विकृत हो जाता है। एक रीलोड के बाद, यह ठीक काम करता है।

प्रारंभिक AudioContext डिफ़ॉल्ट रूप से 48 केएचजेज़ लगता है, जहां विकृति हो रही है (यहां तक ​​कि हमारे ऑडियो के साथ 48 केएचजे नमूना दर पर भी)। जब प्लेबैक ठीक से काम कर रहा है, AudioContext की नमूना दर 44.1 केएचजेज़ है।

मुझे एक वर्कअराउंड मिला: प्रारंभिक ध्वनि चलाने के बाद AudioContext को फिर से बनाना संभव है। नव निर्मित AudioContext में सही नमूना दर प्रतीत होती है। ऐसा करने के लिए:

// inside the click/touch handler 
var playInitSound = function playInitSound() { 
    var source = context.createBufferSource(); 
    source.buffer = context.createBuffer(1, 1, 48000); 
    source.connect(context.destination); 
    if (source.start) { 
     source.start(0); 
    } else { 
     source.noteOn(0); 
    } 
}; 

playInit(); 
if (context.sampleRate === 48000) { 
    context = new AudioContext(); 
    playInit(); 
} 
+0

मेरे लिए काम करता है, धन्यवाद! आईओएस वेब ऑडियो को अनब्लॉक करने के लिए इसे प्रारंभिक स्पर्श एंड हैंडलर में रखें। –

+0

यह वास्तव में मेरी मदद करता है! बहुत बहुत धन्यवाद – iownthegame

संबंधित मुद्दे