Allereerst even mijn excuses als dit topic meer thuishoort in "Programming", wat mijn eerste instinct was, maar ik heb het toch hier geplaatst doordat er in het "Waar hoort mijn topic?" topic staat dat Flash-zaken hier kunnen worden besproken.
En dan nu mijn probleem:
Ik heb een applicatie in Flash (ActionScript 3) ontwikkeld waarmee er aan de hand van een (dynamisch) XML-bestand een aantal bestanden worden ingeladen; maximaal vier MP3-bestanden en een aantal JPG-bestanden.
Als alles klaar is met laden dan kun je op "Play" klikken. De applicatie is als een "mixer" te omschrijven; het wordt gebruikt om muzieklessen te geven en daarvoor wordt de notenschema ingeladen (opgeknipt in JPGs) welke dan als een soort van marquee over het beeldscherm begint te bewegen, terwijl de bijhorende muziek afgespeeld wordt. Het muziek bestaat uit meerdere MP3's zodat de gebruiker bijvoorbeeld de zang of de drums op mute kan zetten om zich te focussen op bijvoorbeeld de gitaar.
Wat er nu dus misgaat is dat de audio-bestanden niet sync met elkaar afspelen. Ze zijn allemaal van tevoren ingeladen en vertraging tussen de bestanden zou daar dus niet aan kunnen liggen. Om ze af te spelen gebruik ik een simpele function met een for loop erin, die iedere instance van mijn sound class begint af te spelen op positie 0 (ik heb overal "java" gebruikt in de code tags ipv "as", om het overzichtelijker te maken wat highlighting betreft, doordat Java het meeste overeen komt met AS3):
De method "playSong" uit de class ziet er als volgt uit:
Het is dus allemaal vrij basic geregeld, het afspelen van de MP3-bestanden. Maar ze lijken niet allemaal op dezelfde locatie wat afspelen betreft te zitten - dit heb ik getest door een MP3 waarin je alleen een klik-geluid hoort loopen vier keer te kopiëren en plakken en vervolgens allevier in te laden en af te spelen. Je hoort dan dat ze niet allevier tegelijk "klikken". Soms is dit echter wel, maar het is vaker niet-synchroon dan wel. Wat me ook opvalt is dat de twee MP3's die eerst staan in het XML-bestand, wel synchroon met elkaar lopen, maar dat de derde en vierde de problemen veroorzaken. Het maakt niet uit in welke volgorde ik de MP3's als nodes achter elkaar zet, de eerste twee zullen altijd wel met elkaar synchroon lopen en de derde en vierde zullen niet snyched zijn. Ter verduidelijking de nodes voor de MP3-bestanden:
Een oplossing die ik geprobeerd heb, is om nadat ieder MP3 begint met af te spelen, te checken of deze op dezelfde locatie in milliseconden staat als de anderen en, als dat niet het geval is, ieder MP3 handmatig op dezelfde tijdslocatie te zetten als de MP3 die in de array op index 0 staat. Maar dit lijkt niet echt effect te hebben (de applicatie raakt er zelfs helemaal van streek door). Dit probeerde ik hiermee:
Aangezien dat niet werkt, heb ik echt géén idee meer wat ik kan proberen... dus als iemand ideeën of suggesties heeft, dan zou ik dat erg op prijs stellen! Ik merk wel dat op snelle PC's de MP3's bijna altijd wél synched lopen, maar de PC waarop ik werk is ook niet echt heel traag maar speelt de bestanden bijna nooit synched af, dus het vormt wel een probleem.
Voor degenen die de moeite hebben genomen om deze lap met tekst te lezen en een mogelijke oplossing weten, alvast hartelijk dank
En dan nu mijn probleem:
Ik heb een applicatie in Flash (ActionScript 3) ontwikkeld waarmee er aan de hand van een (dynamisch) XML-bestand een aantal bestanden worden ingeladen; maximaal vier MP3-bestanden en een aantal JPG-bestanden.
Als alles klaar is met laden dan kun je op "Play" klikken. De applicatie is als een "mixer" te omschrijven; het wordt gebruikt om muzieklessen te geven en daarvoor wordt de notenschema ingeladen (opgeknipt in JPGs) welke dan als een soort van marquee over het beeldscherm begint te bewegen, terwijl de bijhorende muziek afgespeeld wordt. Het muziek bestaat uit meerdere MP3's zodat de gebruiker bijvoorbeeld de zang of de drums op mute kan zetten om zich te focussen op bijvoorbeeld de gitaar.
Wat er nu dus misgaat is dat de audio-bestanden niet sync met elkaar afspelen. Ze zijn allemaal van tevoren ingeladen en vertraging tussen de bestanden zou daar dus niet aan kunnen liggen. Om ze af te spelen gebruik ik een simpele function met een for loop erin, die iedere instance van mijn sound class begint af te spelen op positie 0 (ik heb overal "java" gebruikt in de code tags ipv "as", om het overzichtelijker te maken wat highlighting betreft, doordat Java het meeste overeen komt met AS3):
Java:
220
221
222
223
224
225
226
| function playSounds():void { for (var iCnt:Number = 0; iCnt < aSound.length; iCnt++) { // Start playback for each sound, at the time position set in the // designated property aSound[iCnt].playSong(sPosition); } } |
De method "playSong" uit de class ziet er als volgt uit:
Java:
63
64
65
66
67
68
69
70
71
72
73
74
75
| // _iPos = a number in miliseconds where the audio file should begin playback at // _bIsMute = a boolean which states whether the audio is muted or not public function playSong(_iPos:Number = 0, _bIsMute:Boolean = false):void { bIsMute = _bIsMute; oSong = soundFactory.play(_iPos); if (bIsMute) { muteSong(true); } // Call the function soundCompleteHandler when the sound is loaded oSong.addEventListener(Event.SOUND_COMPLETE, soundCompleteHandler); } |
Het is dus allemaal vrij basic geregeld, het afspelen van de MP3-bestanden. Maar ze lijken niet allemaal op dezelfde locatie wat afspelen betreft te zitten - dit heb ik getest door een MP3 waarin je alleen een klik-geluid hoort loopen vier keer te kopiëren en plakken en vervolgens allevier in te laden en af te spelen. Je hoort dan dat ze niet allevier tegelijk "klikken". Soms is dit echter wel, maar het is vaker niet-synchroon dan wel. Wat me ook opvalt is dat de twee MP3's die eerst staan in het XML-bestand, wel synchroon met elkaar lopen, maar dat de derde en vierde de problemen veroorzaken. Het maakt niet uit in welke volgorde ik de MP3's als nodes achter elkaar zet, de eerste twee zullen altijd wel met elkaar synchroon lopen en de derde en vierde zullen niet snyched zijn. Ter verduidelijking de nodes voor de MP3-bestanden:
XML:
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| <recources> <audiofile name="Gitaar" order="1"> <highquality>../Mixer_ontwikkeling/Application/media/practice/audio/les1_gitaar_hq.mp3</highquality> <lowquality>../Mixer_ontwikkeling/Application/media/practice/audio/les1_gitaar_lq.mp3</lowquality> </audiofile> <audiofile name="Zang" order="2"> <highquality>../Mixer_ontwikkeling/Application/media/practice/audio/les1_zang_hq.mp3 </highquality> <lowquality>../Mixer_ontwikkeling/Application/media/practice/audio/les1_zang_lq.mp3</lowquality> </audiofile> <audiofile name="Drums" order="3"> <highquality>../Mixer_ontwikkeling/Application/media/practice/audio/les1_drum_hq.mp3 </highquality> <lowquality>../Mixer_ontwikkeling/Application/media/practice/audio/les1_drum_lq.mp3</lowquality> </audiofile> <ticker> <image width="5000">../Mixer_ontwikkeling/Application/media/practice/img/notatiebalk_les3_01.jpg</image> <image width="5132">../Mixer_ontwikkeling/Application/media/practice/img/notatiebalk_les3_02.jpg</image> </ticker> </recources> |
Een oplossing die ik geprobeerd heb, is om nadat ieder MP3 begint met af te spelen, te checken of deze op dezelfde locatie in milliseconden staat als de anderen en, als dat niet het geval is, ieder MP3 handmatig op dezelfde tijdslocatie te zetten als de MP3 die in de array op index 0 staat. Maar dit lijkt niet echt effect te hebben (de applicatie raakt er zelfs helemaal van streek door). Dit probeerde ik hiermee:
Java:
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
| // iRunningTime - an instance of getTimer() which holds the duration of time which has // passed since the application was started function fSyncChannels(iRunningTime:uint) { syncOutput.addEventListener(Event.ENTER_FRAME, function() { if (isPlaying) { var iPlayingTime:uint = getTimer() - iRunningTime; // Don't try to correct the audio channels until after two seconds if (iPlayingTime > 2000) { // Iterate through the array of class instances for (var iCnt:Number = 0; iCnt < aSound.length; iCnt++) { // If the current position of the current instance differs more than five // milliseconds from the first instance, stop the instance's playback // and restart it at the same position as where the first instance is // currently at if (Math.abs(aSound[iCnt].position - aSound[0].position) >= 5) { aSound[iCnt].stop(); aSound[iCnt].start(aSound[0].position / 1000); } } } } }); } |
Aangezien dat niet werkt, heb ik echt géén idee meer wat ik kan proberen... dus als iemand ideeën of suggesties heeft, dan zou ik dat erg op prijs stellen! Ik merk wel dat op snelle PC's de MP3's bijna altijd wél synched lopen, maar de PC waarop ik werk is ook niet echt heel traag maar speelt de bestanden bijna nooit synched af, dus het vormt wel een probleem.
Voor degenen die de moeite hebben genomen om deze lap met tekst te lezen en een mogelijke oplossing weten, alvast hartelijk dank
Mitsubishi Trium Galaxy - Nokia 3330 - Nokia 3510 - Motorola V525 - Samsung E730 - HTC Touch - HTC Touch HD - HTC Desire - HTC Sensation - HTC One X+ - LG Nexus 5 - LG Nexus 5X