JavaScript [PHP] kontinuierlicher Prüfwert zwischen 2 Arrayschlüsseln - Ausgabe?

Rain

Lieutenant
Registriert
Mai 2003
Beiträge
704
Hallo zusammen,

ich finde zu folgender Problematik keine richtig elegante Lösung.

Ich programmiere momentan für den Flowplayer eine Möglichkeit um Timecode-bezogen Kommentare zu verfassen. Mein Problem ist das Auslesen des Kommentars zum aktuellen Timecode; zusätzlich auch noch der Darauffolgende.

Beispiel: Bei 0:20 (I) und 0:40 (II) sind Kommentare verfasst.
Vor 0:20 soll I angezeigt werden
zwischen 0:20 und 0:40 soll I und II angezeigt werden
Nach 0:40 soll nur II angezeigt werden

Die Kommentare sind mit der Timecode-Angabe (in Sekunden) in einer MySQL-Datenbank hinterlegt. Beim abspielen des Videos wird per Javascript SetInterval eine Funktion gestartet, die alle 300ms den aktuellen Timecode des Videos zurück gibt. Hier könnte ich nun das Auslesen ja einbauen, aber die zündende Idee um es noch halbwegs performant zu lösen fehlt mir irgendwie.

Ich könnte während der Funktion ein Ajax-Request starten, um mir die Daten aus der DB zu holen. Alle 300ms die Datenbank befeuen --> No Way!

Viel interessanter wäre folgende Möglichkeit:
Vor dem Laden des Videos ein JS-Array erstellen, welches als Schlüssel die Kommentar-TCs hat und als Werte die Kommentare. Tja, und nun? Ich will nicht alle 300ms das gesamte Javascript-Array durchsuchen lassen durch irgendwelche Vergleichsfunktionen. Schicker wäre es doch eine Funktion wie last_element(array, needle), welches das nächst zurückliegende Element bezogen auf Needle zurück gibt. Könnte ich mir auch selber bauen, wäre alle 300ms aber wieder das ewige durchsuchen aller Elemente.

Sieht irgendjemand nen einfachen Weg, den ich gerade irgendwie nicht erkenne?

Viele Grüße,
Rain
 
Du gehst das Array am Anfang durch, sobald du das treffende findest, speicherst du den Index im Array zwischen und gehst in deiner schleife vom gespeicherten Index weiter in Richtung ende. So in etwa:

Code:
var lastIndex = 5;

for(;lastIndex < array.length; lastIndex++) {
  ...
}
 
Ich glaub ich versteh das wohl irgendwie falsch, aber: Array sortieren und den Zähler dann immer ab Stelle X inkrementieren, sowie anzeigen?!
 
"dann immer ab Stelle X"
"sobald du das treffende findest"

.. das sind halt die Knackpunkte, die ich gerade nicht umzusetzen vermag. Ich befürchte den Wald vor lauter Bäumen nicht zu sehen. Ich erklärs nochmal anders:

Alle 0,3s wird eine Funktion aufgerufen, die den Timecode des Videos zurück gibt:

Also folgende Prüf-Schritte:

0,3
0,6
0,9
1,2
1,5
1,8
2,1
etc.
Das ist meine Referenz.

Angenommen ich habe ein Kommentar-Array:

arr_kommentare[1,0] = "a"
arr_kommentare[1,2] = "b"



Habe ich einen Kommentar bei 1,2 vorhanden wäre es einfach - ich könnte einfach return arr_kommentare(referenz) und sobald der TC bei 1,2 ist kommt die Ausgabe.

Bei einem Kommentar bei 1,0 siehts anders aus. 1,0 wird durch die 0,3er Schritte ja nicht direkt geprüft. Ich muss also prüfen welches der nächstgefundene Kommentar ist.

Ich brauch also eine Funktion, die mir in Abhängigkeit des Eingangswerts das nächstzurückliegende und nächstkommende Element eines Arrays zurückgibt. Das geht ja nur, indem man den Eingangswert (also je die 0,3er Schritte) mit dem gesamten Array vergleicht bis man die entsprechende Stelle und die entsprechenden Array-Werte hat.

Das kann ich mir noch selber zusammenbauen. Ich finde nur, dass das ganz schön unelegant ist. Gibts nicht irgendwas Einfacheres?
Ergänzung ()

Ok, habs. Frickellösung, aber es macht was es soll ohne die DB ständig zu belasten.

Falls es jemand interessiert - siehe Bild und Code.

Code:
var t = 0;
$.each($('.marker'), function(i,v) {
if ($(this).offset().left < $('#comments_timeline_seeker').offset().left)
t++;
});
$('#comments_timeline').append(' +'+t);

Die grauen Pfeile sind Kommentare. Der schwarze gerade Strich verschiebt sich alle 0,3s nach rechts, macht im Grunde nochmal das, was der Kreis in der Player-Timeline macht. Mithilfe des jQuery- Codes oben prüfe ich wieviele graue Marker sich links von dem schwarzen Strich befinden. Jetzt habe ich einen Index und kann ein Array auslesen.

Danke fürs Interesse und die Hilfe


t.jpg
 
Zuletzt bearbeitet:
Zurück
Oben