Ankündigung

Einklappen
Keine Ankündigung bisher.

timing Probleme bzw Zusammenspiel PHP Javascript

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • timing Probleme bzw Zusammenspiel PHP Javascript

    Hallo zusammen,

    arbeite mich gerede in die Web Programmierung ein und stehe bei einem Projekt vor folgendem Problem:

    Projektvorstellung:
    Es handelt sich ein Frontend für einen Musik-Player.
    Mittels des Frontend soll ein eine Server Applikation gsteuert werden, welche sich per PHP ansprechen lässt.
    Die Serverapplikation heist mpd (Music - Player - Daemon) welche die Wiedergabe von Musikdateien übernimmt, ohne jede GUI Ausgabe.
    Das Frontend läuft auf einem Hardware Streaming Client (popcorn hour) welcher einen integrierten Browser sowie integrierten Webserver mit stark eingeschränkten Fähigkeiten hat.

    - Kein Ajax
    - kein Java
    - reduziertes Javascript
    - keine Frames

    Nun zu meinem Problem:

    mpd hat keinen notifier zum status der Applikation, man muss also den status jedesmal neu "pollen". Wenn man also ein Musikstück abspielt, kann man die aktuelle Spielzeit des Stückes nur durch regelmäßiges pollen herausbekommen (1.24 von 3:12).
    Um dieses pollen zu vermeiden, setze ich beim Laden der Seite einen Javascript timer (sekündlich), welcher mir die Spielzeit hochzählt und auf dem Bildschirm anzeigt.

    Da ich die Gesamtlänge des Stückes erst nach dem Start des Stückes herausbekomme, starte ich erst das Abspielen des Musikstückes, polle mir dann die Zeiten von mpd, (alles php) und trage dann dann die Zieten per php echo in die entsprechenden Javascript Variablen ein.
    Dann starte ich den Timer innerhalb des html codes.
    Das funktioniert auch alles! aber....
    Das Musikstück beginnt zu spielen, bevor die Seite angezeigt wird. Wenn die Seite angezeigt und der Timer beginnt, sind schon 2-3 Sekunden vergangen, sodaß die angezeigte Zeit asynchron zum Musikstück ist.
    Ich brauche aber die Zeiten des Musikstückes, welche ich erst nach Start des Abpielen bekomme, um den Timer zu initialiseren.

    Bin kein PHP javascript Geek, vielleicht fehlen mir da ein paar Grundlagen , wie z.B. starten einer PHP Funktion aus Javascript, o.ä.

    Ich hoffe, ich habe das halbwegs Verständlich erklärt und würde mich über antworten freuen.

    Anbei ein Code Fragment:

    PHP-Code:

    <HTML> 

    // HTM CSS zeugs hier
      
     <?php



     
    // Hier ist einiges Zeugs wie Datenbank abfragen (entfernt) 

    //

        
    $mpd_time=0;
        
    $mpd_playtime=60;

          
       
    startPlay($mpdplay,$songs,$songid,$mpc);
      
    getPlayTime($mpd_status,$mpd_playtime,$mpd_time,$mpc);

    function 
    startPlay(&$mpdplay,$songs,$songid,$mpc)
    {
        if(
    $mpdplay==1)
        {
            
    $fp fopen '/opt/sybhttpd/localhost.drives/HARD_DISK/Music/umcmusic2.m3u''w' ); 
            
    fputs ($fp,'/share/'.substr($songs[$songid]['pchPath'],49));
            
    fclose ($fp);
        
            
    exec($mpc.' clear');
            
    exec($mpc.' consume=1');
            
    exec($mpc.' single=1');
            
    exec($mpc.' load umcmusic2');
            
    exec($mpc.' play 0');
            
    $mpdplay=0;
        }
    }

    function 
    secondsFromTimeString($timestring)
    {
            
    $tokens=array('0');
            
    $token strtok ($timestring':' );
            while ( 
    $token)
            {
                
    array_push($tokens,$token);
                
    $token strtok(':');
            }
            return 
    1*$tokens[1]*60+$tokens[2];
    }
        
    function 
    getPlayTime(&$mpd_status,&$mpd_playtime,&$mpd_time,$mpc)
    {
        
    exec($mpc,$status);
        
    $mpd_status="";

        if (
    count($status)>1
        { 
            
    $tokens=array('0');
            
    $token strtok ($status[1], ' ' );
            while ( 
    $token)
            {
                
    array_push($tokens,$token);
                
    $token strtok(' ');
            }

            
    $mpd_status=$tokens[1];
        
            
    $tokens2=array('0');
            
    $token strtok ($tokens[3], '/' );
            while ( 
    $token)
            {
                
    array_push($tokens2,$token);
                
    $token strtok('/');
            }

            
    $mpd_time=secondsFromTimeString($tokens2[1]);
            
    $mpd_playtime=secondsFromTimeString($tokens2[2]);

         }

        if (
    $mpd_playtime==0)
            
    $mpd_playtime=60;
      
    }    

    ?> 

      
    <script type="text/javascript">
        
        var count; 
        var starttime=<?php echo $mpd_time?>
        var endtime=<?php echo $mpd_playtime?>
        
        var a;
        
        var bRepeat=0;
        
        var sStatus="<?php echo $mpd_status?>"; 
        function init_page()
        {
        
         
            <?php
            $Artist
    =rawurlencode($songs[$songid]['Artist']);
            
    $AlbumTitle=rawurlencode($songs[$songid]['AlbumTitle']);
            
    $Title=rawurlencode($songs[$songid]['Title']);
            
    $Year=rawurlencode($songs[$songid]['PRODUCT_YEAR']);
            
    $pchPath=rawurlencode($songs[$songid]['pchPath']);
            
    $Info2="";
            
    $AlbumPicturePrefix=rawurlencode($songs[$songid]['AlbumPicturePrefix']);
            
    $AlbumBackDropPrefix=rawurlencode($songs[$songid]['AlbumBackDropPrefix']);
            
            echo 
    "showSong(".$songid.",\"".$Artist."\",\"".$AlbumTitle."\",\"".$Title."\",\"".$Year."\",\"".$pchPath."\",\"".$Info2."\",\"".$mpd_playtime."\",\"".$AlbumPicturePrefix."\",\"".$AlbumBackDropPrefix."\");"

            
    ?>
        }
        
        function counter()
        {

            if((starttime-1) >= endtime)
            {
                starttime=0;

                SendCommand("nextsong");
                return;
            }
            
            if (sStatus=="[playing]")
            {
                document.getElementById("time").firstChild.nodeValue = time_to_string(starttime++);
                a = window.setTimeout('counter()', 1000);
            }
      
        }
        
        function time_to_string(time)
        {
            var mins=0;
            var secs=0;
            
            if (time > 60)
            {
                mins = Math.floor(time/60);
                secs = time - (mins *60);
            }
            else
            {
                secs = time;
            }
            
            if (mins < 10)
            {
                    mins = "0" + mins;    
            }
            
            if (secs < 10)
            {
                secs = "0" + secs;
            }
            
            return mins  + ":" + secs;
        }


    // weterer Javascript - Code....

  • #2
    Ich glaube, dein Problem wird sich so ohne weiteres nicht lösen lassen. Ich denke, Du hast diese Art der Wiedergabe bei WebRadios gesehen. Die haben aber höchst wahrscheinlich andere Scripte, mit denen sie die aktuelle Wiedergabezeit anzeigen lassen.

    1. Der Server bekommt den Befehl, das Stück zu streamen.
    2. Der Client fordert Informationen vom Server, wie lang das Stück ist.
    3. Der Server antwortet mit der aktuellen Wiedergabezeit und der Gesamtlänge des Stücks.
    4. Der Browser empfängt die Daten und JavaScript stellt die Inhalte auf dem Browser her.

    Zwischen Schritt 1 und 4 gehen 2 mal Befehle von Server zu Client und von Client zu Server. Das sind deine 2 bis 3 Sekunden. Aber dies auch wahrscheinlich nur bei DSL 6000. Bei DSL 20.000 wird die Zeit kürzer sein. Bei DSL 1000 etwas länger.

    Also eine Syncronisation in dieser Art und Weise stelle ich mir extrem schwierig vor.

    Die WebRadios, die diese Funktion nutzen verwenden wahrscheinlich fertige Scripte, die Funktionen nutzen, die mir bisher unbekannt sind. Können ja was weiß ich wie viele Sprachen sein, die die verwenden. Von einfachem JavaScript über CGI bis hin zu Java-Aplikationen ist da ja alles möglich.

    Du solltest also mal Google nach deinem Vorhaben befragen und erst einmal heraus zufinden, wie andere diese Funktion realisiert haben. Ich glaube nicht, dass hier überhaupt jemand in der Lage ist, Dir da einen sinnvollen Ansatz zu präsentieren, ohne Dir gleich die ganze Arbeit abzunehmen.

    Kommentar


    • #3
      kann man die aktuelle Spielzeit des Stückes nur durch regelmäßiges pollen herausbekommen (1.24 von 3:12).
      Dann pollst Du eben so lange, bis Du ne Startzeit hast und zählst dann weiter.. Was beim Stocken des Streams passiert, kannst Du Dir dann aber auch denken.
      [COLOR="#F5F5FF"]--[/COLOR]
      [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
      [COLOR="#F5F5FF"]
      --[/COLOR]

      Kommentar

      Lädt...
      X