2009-08-04 7 views
7

मुझे फ्लैश AS3 में ध्वनि को लूप करने के साथ कुछ समस्याएं हैं, जब मैं ध्वनि को लूप को बताता हूं तो मुझे ऑडियो के अंत/शुरुआत में थोड़ी देर हो जाती है।ध्वनि फ्लैश के रूप में लूपिंग के लिए पसंदीदा विधि AS3

ऑडियो सही ढंग से फिसल गया है और गेराज बैंड पर एक अंतर के बिना खेलेंगे।

मुझे पता है कि फ्लैश में सामान्य रूप में ध्वनि के साथ मुद्दों, एन्कोडिंग के साथ कीड़े और अशुद्धियों SOUND_COMPLETE घटना के साथ

(और एडोब इन मुद्दों में से उनके हैंडलिंग के साथ शर्मिंदा होना चाहिए) मैं का उपयोग करने की कोशिश की है कि साउंड क्लास पर प्ले विधि में लूप तर्क में बनाया गया है और SOUND_COMPLETE ईवेंट पर भी प्रतिक्रिया करता है, लेकिन दोनों देरी का कारण बनते हैं।

लेकिन क्या कोई भी किसी भी ध्यान देने योग्य अंतर के बिना ध्वनि को लूप करने के लिए एक तकनीक के साथ आया है?

+0

अरे, ब्रायन, मैं देख रहा हूँ आपने ब्रांडेन के जवाब को स्वीकार कर लिया है, लेकिन क्या आप मुझे बता सकते हैं कि मर्सर का समाधान काम करता है या नहीं? क्या तुमने कोशिश की? यदि मैं इसकी मदद कर सकता हूं तो मैं SAMPLE_DATA ईवेंट का उपयोग करने का सहारा नहीं लेगा ... – aaaidan

+0

हम्म, मैं अपने प्रश्न का उत्तर दे सकता हूं: नहीं। किसी ईवेंट में कॉलिंग प्ले .OUND_COMPLETE ईवेंट हैंडलर कम से कम ओएस एक्स, एफपी 10 पर अंतर को खत्म नहीं करता है। – aaaidan

+0

असल में, Event.SOUND_COMPLETE ईवेंट विधि वास्तव में काम कर सकती है। जिस फ़ाइल का मैं उपयोग कर रहा था, वह शुरुआत और अंत में छोटा अंतर था। – aaaidan

उत्तर

7

यदि आप फ़्लैश प्लेयर 10 का उपयोग कर सकते हैं तो सबसे विश्वसनीय विधि, नए नमूनाडेटाएन्ट। सैम्पले_DATA ईवेंट का उपयोग करना है।

विशेष रूप से, आप जो करना चाहते हैं उसे सबसे पहले ध्वनि को तुरंत चालू करना है, फिर बाइटएरे में एन्कोड किए गए कच्चे पीसीएम डेटा में ध्वनि को परिवर्तित करने के लिए नई निकासी विधि का उपयोग करें। फिर आप एक नया साउंड ऑब्जेक्ट बना सकते हैं, और इसके नमूनाडेटाइवेंट .AMPLE_DATA ईवेंट को सुनने के लिए सेटअप कर सकते हैं। जब उस घटना को बुलाया जाता है तो आप बाइटएरे से डेटा के 2-8k (कम राशि विलम्ब को कम कर देता है, लेकिन श्रव्य कलाकृतियों की संभावना को बढ़ाता है) दबाएगा। आप बस यह सुनिश्चित कर लेंगे कि जब आप बाइटएरे के अंत को बंद कर देते हैं तो आप बस शुरुआत में लूप करेंगे।

यह विधि सुनिश्चित करता है कि आपके पास पूरी तरह से अंतहीन प्लेबैक होगा।

+1

यह एक शानदार सुविधा है और इससे कुछ भयानक चीजें संभव हो गई हैं (जैसे होब्नोक्स), लेकिन यह शर्म की बात है कि किसी को ध्वनि लूप को आसानी से चलाने के लिए निम्न स्तर के बाइट मैनिपुलेशन का सहारा लेना चाहिए। प्लेयर और ध्वनि एपीआई में ऑडियो समर्थन बड़ा समय चूसना। –

+1

यह बहुत बुरा है, लेकिन ये समस्याएं इस तथ्य में झूठ बोलती हैं कि फ्लैश प्लेयर ध्वनि इंजन वास्तव में पुराना है, और केवल एक अपडेट की आवश्यकता है, जो खिलाड़ी 11 में आना चाहिए। –

+0

निश्चित रूप से play() :) को कॉल करने से अधिक शामिल है :) लेकिन एक निर्धारिक समाधान की तरह लगता है। मैं इसे ब्रैंडन का प्रयास करूंगा और उस पर वापस आऊंगा। –

1

यहां बताया गया है कि आईडी ने यह कितना ध्यान दिया, बिना किसी देरी के। मुख्य अनुप्रयोग:

package { 

import flash.display.MovieClip; 
import flash.events.*; 
import flash.utils.*; 

public class MainApp extends MovieClip { 
    private var player:Player; 
    .......... 

    public function MainApp() { 
     ....... 
     player = new Player(); 
     player.addEventListener(Player.EVENT_SOUND_COMPLETED, handleSoundCompleted); 
     ...... 
    } 

    private function handleSoundCompleted(event:Event):void { 
     player.setPosition(0); 
     player.play(); 
    } 

    ................. 

प्लेयर वर्ग:

package { 

import flash.events.*; 
import flash.media.*; 
import flash.net.*; 

public class Player extends EventDispatcher { 

    private var sound:Sound; 
    private var channel:SoundChannel; 
    private var position:Number; 

    static const SOUND_VOLUME:Number = 0.75; 
    static const EVENT_SOUND_COMPLETED:String = "SOUND_COMPLETED"; 

    public function Player() { 

     // init 
     sound = new ThemeSong(); 
     position = 0; 

     // listeners 
     sound.addEventListener(IOErrorEvent.IO_ERROR, function(event:Event){trace(event)}); 

     trace("Player initialized..."); 
    } 

    public function play():void { 
     channel = sound.play(position); 
     channel.soundTransform = new SoundTransform(SOUND_VOLUME); 
     channel.addEventListener(Event.SOUND_COMPLETE, function(event:Event){dispatchEvent(new Event(EVENT_SOUND_COMPLETED));}); 
     trace("Player playing.."); 
    } 

    public function pause():void { 
     if (channel != null) { 
      channel.stop(); 
      position = channel.position; 
     } 
     trace("Player paused.."); 
    } 

    public function setPosition(pos:Number):void { 
     position = pos; 
    } 

    public function getPosition():Number { 
     if (channel == null) { 
      return 0; 
     } else { 
      return channel.position; 
     } 
    } 
} 
} 

आप कहा कि एमपी 3 फ़ाइल शुरुआत/अंत में कोई देरी नहीं है, लेकिन मैं audacity साथ इसे खोलने की सलाह देते हैं, और सुनिश्चित करें कि कोई देरी न हो ।

+0

हे वहाँ मर्सर, यह अनिवार्य रूप से जिस दृष्टिकोण का उपयोग कर रहा है, उम्मीद है कि यह हर बार ध्वनि पूर्ण होने पर ऑडियो को फिर से स्थिति में नहीं रखेगा। मैं इसे जाने दूंगा और देखता हूं कि यह कैसे काम करता है। धन्यवाद –

+0

अरे मर्सर, मैंने अभी यह कोशिश की है और अंतराल संगीत को लूप करने के लिए भी ध्यान देने योग्य है। अपना कोड साझा करने के लिए धन्यवाद, वैसे! – aaaidan

+0

ओह वास्तव में, इसे उलट दें। यह हो सकता है कि यह विधि काम करता है। जिस ध्वनि का मैं उपयोग कर रहा था वह शुरुआत और अंत में छोटे अंतर था। चीयर्स – aaaidan

3

this guy के अनुसार, आपको संगीत लूप को WAV के रूप में आयात करना होगा, और फ्लैश आईडीई स्वयं एमपी 3 को संपीड़ित कर देगा। फ्लैश का उपयोग आयातित एमपी 3 डेटा का मतलब है कि यह नहीं जानता कि इसे ठीक से कैसे लूप करें।

5

एमपी 3 की गैपलेस लूपिंग प्रारूप के काम के तरीके के कारण तुच्छ नहीं है। थोड़ा सा सरल करने के लिए; ध्वनि कई फ्रेमों पर लगाई जाती है, यह संख्या मनमाने ढंग से नहीं चुनी जा सकती है, इसके बजाय कुछ पैडिंग (चुप्पी के साथ) की आवश्यकता होती है। एमपी 3 में कितना पैडिंग जोड़ा गया था, यह संग्रह करने का कोई तरीका नहीं है, इसलिए फाइल एन्कोड होने के बाद यह जानकारी खो जाती है।

फ्लैश आईडीई इस मेटाडेटा को एम्बेड करके इसके आसपास मिलता है, और आप भी कर सकते हैं। आपको बस यह जानने की जरूरत है कि एन्कोडर द्वारा कितना विलंब जोड़ा जाता है।

आंद्रे मिशेल explains this way better than I can on his blog

1

मैं इस महान उपकरण का उपयोग: http://www.compuphase.com/mp3/mp3loop.zip

आप इसे एक WAV फ़ाइल देने के लिए और यह एक एमपी 3 फ़ाइल जो पूरी तरह से हो सकता है रिटर्न खेले का उपयोग कर 'Sound मानक play विधि - जैसे (और gaplessly!):

var manyLoops:int = 1000*1000; // a Million is a lot :) 
mySound.play(0, manyLoops); 

तुम भी उत्पादन एमपी 3 फ़ाइल ले जा सकते हैं और यह एक WAV के लिए पुन: परिवर्तित (उदाहरण के लिए AudioCity का प्रयोग करके) - तो आप एक इसमें लगातार WAV (जो आपके FLA फ़ाइल के अंदर महान काम कर सकते हैं)

है

उम्मीद है कि यह

+0

आप int.MAX_VALUE का उपयोग कर सकते हैं – mika

0

मैं ऑडियो लूपिंग के लिए एक लाइब्रेरी बनाना चाहता था जो पूर्ण घटनाओं पर भरोसा नहीं करता था। मैंने अपना खुद का standingwave3 addons library बनाने का फैसला किया। मूल standingwave3 project by MaxL0rd देखें। मेरा काम प्रगति पर है और यह उस काम के लिए बाइट स्तर पर काम पूरा हो जाता है (कोई लूप टाइमर या कुछ भी नहीं)। यह लूप बिंदुओं को शुरू करने और समाप्त करने के साथ ध्वनि में काम करके काम करता है। फिर यह लूप नमूना सेकंड में प्रदान किए गए समय के आधार पर कई गुना क्लोन करता है। यह उपयोग करने के लिए सीधे आगे होना चाहिए।

package 
{ 

    // Imports. 
    import com.greensock.events.LoaderEvent; 
    import com.greensock.loading.LoaderMax; 
    import com.greensock.loading.MP3Loader; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import com.greensock.TweenMax; 
    import com.SW3.gadget.LoopGadget; 
    import flash.media.Sound; 


    // Class. 
    public class Main extends Sprite 
    { 

     // Vars. 
     private var loader:LoaderMax;// Using LoaderMax for ease of use. 


     // Constructor. 
     public function Main() 
     { 

      trace("Main"); 

      loader = new LoaderMax({ name:"audio", onComplete:onSoundsLoaded }); 
      loader.append(new MP3Loader("assets/Beat.mp3", { autoPlay:false })); 
      loader.append(new MP3Loader("assets/Clap.mp3", { autoPlay:false })); 
      loader.append(new MP3Loader("assets/Boom.mp3", { autoPlay:false })); 
      loader.load(); 

     } 


     private function onSoundsLoaded(e:LoaderEvent):void 
     { 

      trace("onSoundsLoaded"); 
      var looping:LoopGadget = new LoopGadget; 
      looping.addLoopSound("Beat", e.currentTarget.content[ 0 ] as Sound, 0, 10); 
      looping.addLoopSound("Clap", e.currentTarget.content[ 1 ] as Sound, 0, 10); 
      //looping.addLoopSound("Boom", e.currentTarget.content[ 2 ] as Sound, 0, 10); // Commented out to test possible error. 

      looping.playLoop("Beat");// Play the "Beat" loop. 
      looping.playLoop("Clap");// Play the "Clap" loop. 
      looping.stopLoop("Beat");// Stop the "Beat" loop. 
      looping.playLoop("Beat");// Play the "Beat" loop. 
      looping.playLoop("Beat");// Play the "Beat" loop again to test if it would error out.. 

      looping.stopAllLoops();// Stop all the loops. 
      looping.playLoops([ "Beat", "Clap", "Boom" ]);// Play all the loops. Test to see if "Boom" will error out. 

     } 

    } 

} 

चेक आउट यहाँ पर स्रोत फ़ाइलें:: यह "उदाहरण" फ़ोल्डर में "पाशन" फ़ाइल में Main.as वर्ग के लिए कोड है https://github.com/charlesclements/standingwave3-addons

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