[PHP] Streaming Media

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ruurdkrekt
  • Registratie: November 2003
  • Laatst online: 27-03-2023
Ik ben bezig met een website, zodat ik op school ook mijn eigen mp3's kan streamen.
De mp3's staan buiten de publieke html map, en de website er natuurlijk binnen :+
Verder draai ik arch linux met apache, php en mysql. Van alles de nieuwste versie.

Om de mp3's te streamen gebruik ik een embedded mediaspeler, omdat deze alleen bestanden kan openen die in de publieke html dir staan heb ik een php functie die een mp3 inleest, en vervolgens deze met een mp3 mime type header terug geeft aan de mediaplayer.

Dit verhaal werkt perfect voor Internet Explorer, maar niet voor Mozilla Firefox (1.5)
Ik dacht eerst dat het aan de headers lag, ik verstuur de volgende:
PHP:
1
2
3
4
5
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Content-type: ".$mime);
header("Content-length: ".filesize($path));


Na wat zoeken op internet kon ik hier eigenlijk toch ook niks aan toevoegen, dit ook omdat de mp3 header wel goed is omdat hij in Internet Explorer wel gewoon werkt.

Verder heb ik nog even gekeken naar mijn php functie die dus de inhoud van een mp3 terug geeft:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$blokGrootte = 1*(1024*1024); // 1mb
$buffer = '';
                
$bestand = fopen($this->path, 'rb');

while(!feof($bestand)) 
{
  // Een blok opslaan in de buffer
  $buffer = fread($bestand, $blokGrootte);
                
  // en de buffer naar de browser sturen, zodat deze met afspelen kan beginnen
  echo $buffer;
}

fclose($bestand);


Dit leek mij ook niet het probleem omdat het wel gewoon werkt in IE, en daarbij komt ook nog dat PHP toch een serverside taal is. Dus dan zou je zeggen dat hij het in IE ook niet doet. Dunkt mij.

Wat ik er misschien nog wel even bij moet vermelden is dat deze php code in een ander bestand staat, was misschien al duidelijk. Maar ik denk vermeld het nog even. Ik werk verder met classes, waar de functies instaan. De functie die de mp3 moet lezen wordt aangeroepen door de engine. En dit engine bestand wordt weer aangeroepen door de embedded player.

Ik kan deze code ook nog wel even laten zien:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<object id="MediaPlayer" 
  width=320
  height=240
  classid="CLSID:22D6F312-B0F6-11D0-94AB-0080C74C7E95"
            codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,7,1112"
            standby="Loading Microsoft Windows Media Player components..."
            type="application/x-oleobject"
        >
  <param name="FileName" value="index.php?pagina=afspelen&fileID=3">
  <param name="ShowControls" value="1">
  <param name="ShowDisplay" value="1"> 
  <param name="ShowStatusBar" value="1">
  <param name="AutoSize" value="0"> 
  <param name="Volume" value="0">
            
  <embed type="application/x-mplayer2"
  pluginspage="http://www.microsoft.com/windows/windowsmedia/download/"
  filename="index.php?pagina=afspelen&fileID=3"
  src="index.php?pagina=afspelen&fileID=3"
  name=MediaPlayer1
  ShowControls=1
  Volume=0
  ShowDisplay=1
  ShowStatusBar=1
  width=320
  height=240>
  </embed>
</object>


Tot slot:
Ik snap dus niet hoe het kan dat mijn streaming media het wel doet in Internet Explorer en niet in Mozilla Firefox. Ik heb voor de makkelijkheid de 3 pagina's ook nog even online gezet. Misschien leest dat wat makkelijker.

De class
De engine
De embedded mediaplayer

Heeft iemand hier ervaring mee, of ziet toevallig een fout die ik totaal over het hoofd heeft gezien?

Acties:
  • 0 Henk 'm!

  • AirX
  • Registratie: Juni 2002
  • Laatst online: 14:34

AirX

Tweak Guru

kun je niet wat met fpassthru() doen? (gooit je hele script wel overhoop, maarja)

[ Voor 38% gewijzigd door AirX op 08-05-2006 17:00 ]


Acties:
  • 0 Henk 'm!

  • Whollabilla
  • Registratie: Februari 2005
  • Laatst online: 10-03-2021
Ik denk dat de Windows Media Player plugin niet helemaal lekker werkt onder Firefox, ik geloof dat ik eerst ook altijd IE moest opstarten als ik streaming video's wou gaan kijken bijv.

Acties:
  • 0 Henk 'm!

Verwijderd


Acties:
  • 0 Henk 'm!

  • Mac_Cain13
  • Registratie: Juni 2003
  • Laatst online: 17-09 15:48
Milo Warmerdam schreef op maandag 08 mei 2006 @ 17:02:
Ik denk dat de Windows Media Player plugin niet helemaal lekker werkt onder Firefox, ik geloof dat ik eerst ook altijd IE moest opstarten als ik streaming video's wou gaan kijken bijv.
Hmm, ik denk dat jij gelijk hebt. Aangezien het onder IE wel werkt kan het geen serverside probleem zijn en moet het in je HTML (of de verwerking daarvan) zitten.

Ik ben net even ingelogd op je site en met Firefox op Linux met MPlayer werkt het perfect. :) Het lijkt er dus op dat je even naar de firefox plugins moet kijken op je eigen PC.

offtopic:
Ik ken de TS irl, vandaar dat ik kon inloggen enz. ;)

Acties:
  • 0 Henk 'm!

  • ruurdkrekt
  • Registratie: November 2003
  • Laatst online: 27-03-2023
Ik ben nog even bezig geweest, en heb het volgende gefabriceerd:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
$ID = $_GET['ID'];
    
mysql_connect("localhost","user","pass");
mysql_select_db("database");
    
$query="SELECT * FROM files WHERE ID='$ID'";
$resultaat = mysql_query($query);
    
//Gegevens van het nummer opvragen
while($object = mysql_fetch_object($resultaat)){
  $mime = $object->mimetype;
  $path = $object->path;
}
    
//Functie die hetzelfde doet als readfile maar nu als blokken omdat readfile maar max 2mb kan
function readfile_chunked($filename) {
   $chunksize = 1*(1024*1024); // how many bytes per chunk
   $buffer = '';

   // $handle = fopen($filename, 'rb');
   $handle = fopen($filename, 'rb');
   if ($handle === false) {
       return false;
   }
   while (!feof($handle)) {
       $buffer = fread($handle, $chunksize);
       echo $buffer;
   }
       fclose($handle);
} 
    
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Content-type: $mime");
header("Content-length: ".filesize($path));

readfile_chunked($path);


Ik heb dit dus even snel gemaakt om te testen. Als ik als src in de embed mediaplayer deze pagina aanroep genaamd listen.php?ID=1 Dan streamt de mediaplayer perfect in Mozilla en ook in IE.
De html code moet dus wel goed zijn lijkt me.

Natuurlijk zou je nu kunnen zeggen van: "Waarom neem je deze methode dan niet".
Nou dit omdat ik de site in classes bouw. Als je de class bekijkt dan komen alle dingen die in het listen.php bestand worden uitgevoerd, allemaal weer terug.

Ik zit nog steeds met mn handen in het haar :?

Acties:
  • 0 Henk 'm!

  • ruurdkrekt
  • Registratie: November 2003
  • Laatst online: 27-03-2023
Goed,
ik ben nu weer een aantal uurtjes bezig met debuggen van het probleem.
Ik heb ook ontdekt waar de fout zit, deze zit niet in de streaming pagina maar in de beveiliging.
Wanneer ik de 3 beveiligings regels had gecomment werkte het ineens ook in mozilla firefox :9

Dus ik wil iig de mensen even bedanken die tijd hebben vrijgemaakt om naar mijn probleem te kijken.
De bug is dus gevonden en keihard geplet 8)
Pagina: 1