php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 29.12.2011, 10:36  
Erfahrener Benutzer
 
Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse:
Fortgeschritten
Jens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nett
Standard

Einspruch - auch für eine byteweise Verarbeitung ist nicht wirklich eine Notwendigkeit erkennbar. Das könnte im Höchstfall bei den Metadaten notwendig werden - die Rohdaten können auch Blockweise weiter in die Datei geschossen werden.

Gruß Jens
Jens Clasen ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 29.12.2011, 14:33  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Ich würde wohl mal zu basteln versuchen, wenn hier lauffähiger Ausgangscode (also inklusive Streamadresse) eingestellt wird.
__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Alt 29.12.2011, 20:54  
Erfahrener Benutzer
 
Registriert seit: 22.12.2009
Beiträge: 104
PHP-Kenntnisse:
Fortgeschritten
Emskopp befindet sich auf einem aufstrebenden Ast
Standard

Ähhm, wenn es nur um die META-Daten geht, so muss der Stream doch nicht ausgelesen werden, sondern nur die XML aus dem Server.

Die Angaben kann man kinderleicht mit einem AJAX Intervall aktualisieren = so gut wie keine Serverlast.


Wichtig ist natürlich ebenso was du für einen Server hast und ob dieser überhaupt fürs streaming ausgerichtet ist. Die meisten Radiobetreiber die ich kenne, hosten ihre Streams anderweitig (gerade wegen dem Traffic) und greifen extern über Webhosting oder Server auf die XML zu.
Emskopp ist offline   Mit Zitat antworten
Alt 30.12.2011, 18:55  
Erfahrener Benutzer
 
Benutzerbild von fireweasel
 
Registriert seit: 20.03.2010
Beiträge: 474
PHP-Kenntnisse:
Fortgeschritten
fireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblick
fireweasel eine Nachricht über ICQ schicken fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken fireweasel eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von Dennis Ze Beitrag anzeigen
@mersmshaus: Es handelt sich um ICY-Metadaten von Shoutcast-Streams. Diese werden in einem bestimmten Byte-Intervall im Stream mitgesendet. Damit die empfangenen MP3-Daten nicht mit diesen Metadaten vermischt werden, müssen die Metadaten rausgefiltert werden. Aus diesem Grund lese ich jedes Byte einzeln aus und zähle die Gesamtlänge bis zum Erreichen des Meta-Intervalls (http://www.smackfu.com/stuff/programming/shoutcast.html).
Mal sehen: Die Länge der "Audio"-Datenblocks ist immer gleich und kommt mit einem HTTP-Response-Header daher. Sind die eingelesen, schließt sich direkt ein Byte mit der kodierten Längenangabe an. Danach folgt die entsprechende Länge Meta-Daten (die auch 0 sein kann). Dann gehts wieder von vorne los.

Das heißt, du kannst einmal einen Block fester Größe einlesen, danach brauchst du ein Byte und anschließen einen Block mit der dort kodierten Größe, wenn die > 0 ist, also:

fread(socket, fest)
fgetc(socket)
fread(socket, meta-size)

Eingepackt in ein bisschen Code, der um die Eigenheiten von Socket-Streams herumprogrammiert, könnte ein Grundgerüst so aussehen:

PHP-Code:
// see: http://www.smackfu.com/stuff/programming/shoutcast.html
// for a description of the data-format

class shoutcast_meta_reader {
    const 
delay 1000// microseconds; adjust this value to your needs
    
const max_tries 5// maximum number of failed reads

    
function __construct() {
        
$this->socket_create/*...*/ ); // or fsockopen() stuff
        //...
    
}

    function 
read() {
        
// send HTTP request
        // ...
        // retrieve response headers
        // ...
        
$blocksize = ...; // from HTTP header: icy-metaint: <$blocksize>
        
while (feof($this->s)) {
            list (
$mp3audio$metadata) =  $this->read_block();
            
// process $mp3audio
            // process $metadata
        
}
        return;
    }

    
// reads a block of mp3-data + a block of metadata (if any)
    
function read_block(
        
$blocksize /// int(0...) blocksize for mp3-audio-data
                    // extracted from HTTP headers
    
) {
        
$payload $this->fread($blocksize);
        if (
$meta_size ord($this->fgetc() * 16)) {
            
$meta $this->fread($meta_size);
        }
        else {
            
$meta null;
        }
        return array (
$payload$meta);
    }

    
/// reads 1 byte|character from socket
    
function fgetc() {
        
$failed_reads 0;
        while (!
feof($this->s) && === strlen($char fgetc($this->s))) {
            
usleep(self::delay); // to prevent from overzealous polling
            
if (++$failed_reads self::max_tries) {
                return 
null;
            }
        }
        return 
$char;
    }

    
// reads the given number of bytes from socket
    
function fread($bytes_to_read) {
        
$failed_reads 0;
        
$buf '';
        while (!
feof($this->s) && $bytes_to_read 0) {
            
$chunk fread($this->s$bytes_to_read);
            
$chunk_len strlen($chunk);
            if (
$chunk_len 0) {
                
$bytes_to_read -= strlen($chunk);
                
$buf .= $chunk;
                
$failed_reads 0;
            }
            else {
                if (++
$failed_reads self::max_tries) {
                    return 
null;
                }
                
//usleep(self::delay);
            
}
        }
        return 
$buf;
    }


Geändert von fireweasel (30.12.2011 um 19:06 Uhr). Grund: typos
fireweasel ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] fread problem julienyxz PHP Einsteiger 8 22.08.2011 10:55
[Erledigt] fread von Sonderzeichen Tholi PHP Einsteiger 11 21.05.2011 21:19
[Erledigt] fread() Problem webit PHP Tipps 2010 7 11.09.2010 16:37
fread löscht immer den Dateninhalt. Fluxkompensator PHP Tipps 2010 7 08.08.2010 21:26
[Erledigt] Hohe Cpu Auslastung im IE PiXeL1337 PHP Tipps 2010 8 26.02.2010 10:27
Fehlender Leerzeichen bei fread() Bon_Mori PHP Tipps 2009 7 29.09.2009 16:50
Scriptangebot [Erledigt] KOSTENLOS: Webserver Auslastung anzeigen Curcio Scriptbörse 0 21.08.2009 21:05
Wann Auslastung geringer. txt oder sql? sanz PHP Tipps 2008 10 06.06.2008 11:12
Warning: fread(): supplied argument is not a valid stream resource... pixelprinzessin PHP Tipps 2008 20 23.04.2008 15:44
fread für Dateien > 8KB PHP Tipps 2006 3 14.02.2006 20:21
Probleme mit fopen, fread und fclose PHP-Fortgeschrittene 4 19.12.2005 14:37
[Erledigt] mail versand mit anhang (-- fopen(), fread(), filesize() --) PHP Tipps 2005 5 29.01.2005 18:36
Daten aus *.MPQ-Dateien mittels fread auslesen? PHP-Fortgeschrittene 21 06.01.2005 14:40
fread ließt nicht die angegebenen bytes PHP-Fortgeschrittene 3 14.10.2004 18:54
fread() --> fwrite() = Müll PHP Tipps 2004 1 12.10.2004 18:09


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:42 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum