[Flash/AS3] Syncen van extern ingeladen audio-bestanden

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Xurk
  • Registratie: Mei 2002
  • Laatst online: 24-04-2024

Xurk

Burnside

Topicstarter
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):
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


Acties:
  • 0 Henk 'm!

  • Xurk
  • Registratie: Mei 2002
  • Laatst online: 24-04-2024

Xurk

Burnside

Topicstarter
Sorry dat ik het topic kick, maar in de hoop dat het meer opvalt wilde ik toch nog één keer peilen of er iemand is die enige suggesties heeft hoe ik het probleem zou kunnen oplossen? Ik hoop het echt, want mijn applicatie is verder zo goed als klaar, maar met dit probleem loop ik al meer dan een maand rond en nu is dit bijna het enige wat nog overblijft op het "to-do" lijstje ;)

Als ik in de tussentijd zelf een oplossing weet te vinden, post ik het uiteraard ook even hier, voor het geval er in de toekomst anderen een soorgelijk probleem hebben en op dit topic stuiten :)

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


Acties:
  • 0 Henk 'm!

  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

De eigenschappen van je audio moet als "stream" ingesteld staan, niet als "event" om tot op de frame perfect syncroon te lopen. Dat herinner ik me nog uit de periode dat ik ermee gespeeld heb.

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.