Internetstreams für Movieplayer - Dbox2 - Experten Windows/Linux

Mi, 11.02.2009 - 14:50 -- Daniel Espendiller

Die unten aufgeführten Änderungen sind in der Apache Konfiguration geändert worden, damit die Streamwiedergabe funktionieren.

httpd.conf:


listen 8083

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

ProxyRequests On
ProxyPass /dboxstream http://127.0.0.1:8080/dboxstream
ProxyPassReverse /dboxstream http://127.0.0.1:8080/dboxstream
ProxyVia On

.htaccess (im request Ordner)


AddType application/x-httpd-php .xml

Info

Der Port 8083 kann natürlich frei definiert werden. Er spiegelt sich jediglich im Movieplayer Einstellungen auf der Dbox wieder.
Die Wiedergabe der Streams erfolgt von der Dbox2 über /dboxstream. Also z.B. Beispiel http://192.168.1.1:8083/dboxstream. Wobei die IP und Port gleich bleiben. Um die Anfragen zum VLC weiterreicht zu können, wird das Modul mod_proxy benötigt. Ab Apache Version 2.2 wurde das besagte Modul gesplittet, so muss ab dieser Version zusätzlich noch mod_proxy_http geladen werden. In der errorlog sieht man sonst derartige Meldung:

[warn] proxy: No protocol handler was valid for the URL /dboxstream. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

Und schließlich müssen die XML-Datei im requests Ordner noch als PHP Dateien behandelt werden, da Anfragen immer nur über die browse.xml oder status.xml gemacht werden. Dieses sollte eigentlich ohne weiteres über die .htaccess funktionieren.

Linux

Unter Linux kann der VLC den Port 8080 nicht gleichzeitig zum Stream und für das Webinterface nutzen. (Zu mindestens in Version < 1.0; höhere Versionen hab ich noch nicht getestet). Dazu müssen die ProxyPass Zeilen mit einem anderen Port (8081) versehen werden. Dieser Port muss dann innerhalb der settings.php Datei per $myconfig['ApacheProxyPassPort'] geändert werden.
Zum Starten des VLC unter Linux nehme ich:

vlc -I http --http-host *:8080 -q

VCS File: 

/trunk/browse.xml

<?php
// $Id: browse.xml 22 2009-12-19 11:00:48Z bighaehnchen $
if (isset($_GET['tv'])) $_GET['dir']="e:".$_GET['dir'];    
#error_reporting(E_ERROR | E_PARSE);
$ip=$_SERVER["REMOTE_ADDR"];
#if ($ip!="192.168.0.1" AND $ip!="192.168.0.201") exit;
include("inc.php");
 
 
preg_match('/\/(.*?)\//si',$_GET['dir'],$func); $func=$func[1];
if (strlen($func)>0) {
	include($myconfig['scripts'].$func.".php");
 
	#komische eigenheit vom dbox browser. ab 95 zeilen braucht er eine content length im header;
	#wenn wir gerade dabei sind, setzen wa dann halt alles was vlc sendet
	#admincenter: um im browser was anzeigen zu knnen darf dort nichts mitgesendet werden.
	$str_output=getdir();
 
	if (isset($_GET['admin']) OR isset($_GET['tv']) OR isset($_GET['vlc'])) { } else  {
		header ("Content-type: text/xml;  charset=UTF-8");
		header ("Cache-Control: no-cache");
		header ("Content-Length: ".strlen($str_output));
	}
	echo $str_output;
	exit;
}
 
#erster Menpunkt; alle Scripte im Ordner scripts einlesen und ausgeben
#tempfile fr suchfunktion lschen um neue suchanfragen hinzufgen zu knnen.
if (file_exists("suche.log")) unlink("suche.log");
$scripts=array();
foreach (glob($myconfig['scripts']."*.php") as $filename) {
	$f=str_replace($myconfig['scripts'],"",$filename);
	$f=str_replace(".php","",$f);
	$scripts[$f]['type']="directory";
}
echo gennavi($scripts);
?>

/trunk/status.xml

<?php
// $Id: status.xml 20 2009-12-19 10:54:16Z bighaehnchen $
include("inc.php");
 
if ($_GET['command']=="in_play") {
	global $myconfig;
 
	#Ausbau der anfrage:
	#original:  /requests/status.xml?command=in_play&input=e%3A%2Fkino%2Ede%2F%20Diese%20Woche%2FNo%20Country%20for%20Old%20Men%2F%20Trailer%20No%20Country%20for%20Old%20Men%20%3Asout%3D%23transcode%7Bvcodec%3Dmp2v%2Cvb%3D2000%2Cwidth%3D704%2Cheight%3D576%2Cfps%3D25%2Cacodec%3Dmpga%2Cab%3D192%2Cchannels%3D2%7D%3Astd%7Baccess%3Dhttp%2Cmux%3Dts%2Cdst%3D%3A8083%2Fdboxstream%7D
	#urldecode: /requests/status.xml?command=in_play&input=e:/kino.de/ Diese Woche/No Country for Old Men/ Trailer No Country for Old Men :sout=#transcode{vcodec=mp2v,vb=2000,width=704,height=576,fps=25,acodec=mpga,ab=192,channels=2}:std{access=http,mux=ts,dst=:8083/dboxstream}
 
	#Port von der dbox2 anfrage auf den vlc port ndern, damit vlc auf einem anderen port den stream wiedergibt als apacheserver
	#default: http://ip:8083/dboxstream -> http://ip:8080/dboxstream
#	  $_GET['input']=str_replace($myconfig['dboxvlcport']."/dboxstream",$myconfig['vlcport']."/dboxstream",$_GET['input']);
#	  $_GET['input']=str_replace($myconfig['dboxvlcport']."/dboxstream","8081/dboxstream",$_GET['input']);
	$_GET['input']=str_replace($myconfig['dboxvlcport'].'/dboxstream',$myconfig['ApacheProxyPassPort'].'/dboxstream',$_GET['input']);
 
	#trennen der Pfad- und transcodeangaben und filtern des pfades
	  $tmp_pfad=explode(" :",$_GET['input']); $pfad=$tmp_pfad[0];
	  $pfad_array=explode("/",$pfad);
 
	#Includen des entsprechenden Scriptes passend zur anfrage; ermittelt aus dem pfad
	#und streamadresse aus der bergeben pfadangabe abfragen
	include($myconfig['scripts'].$pfad_array[1].".php");
	$url=geturl($pfad);
 
	#admin interface
	if (isset($_GET['admin'])) { echo $url; exit; }
 
	#playback for pophournhour
	if (isset($_GET['tv'])) { echo '<html><body>\r\nplaylist.flv|0|0|'.$url.'|\r\n</body></html>'; exit; }
 
	#VLC playback with activex control in browser
	if (isset($_GET['vlc'])) { echo $url.'<br><OBJECT classid="clsid:9BE31822-FDAD-461B-AD51-BE1D1C159921" codebase="http://downloads.videolan.org/pub/videolan/vlc/latest/win32/axvlc.cab" width="640" height="480" id="vlc" events="True">
								<param name="Src" value="'.$url.'" /><param name="ShowDisplay" value="True" /><param name="AutoLoop" value="False" /><param name="AutoPlay" value="true" /></OBJECT>'; exit; }	
 
 
 
 
	#Youtube/flashfile workaround: ndern der transcodewerte; dbox movieplayer unterstzt nur sampleraten von 44100
	#Problem mit mehreren audio Kanlen? muss noch genauer geprft werden
	  $_GET['input']=str_replace("channels=2","channels=1",$_GET['input']);
	  $_GET['input']=str_replace("}:std",",samplerate=44100}:std",$_GET['input']);
 
 
	#Ursprngliche Anfrage Modifizieren; eintragen der streamurl;
	$go=$myconfig['vlcplaystr'];
	$go.="&input=".urlencode($url." ".strstr($_GET['input'],":sout="));
 
	#workaround fr vlc 0.9x
	file('http://127.0.0.1:'.$myconfig['vlcport']."/requests/status.xml?command=pl_empty");
 
 
} else {
	#alle anderen Movieplayer anfragen direkt an den VLC player weiterleiten
	#zb die Abfrage der Abspieldauer
	$go=$_SERVER['REQUEST_URI'];
}
 
#Generierte anfragen an den vlc httpserver weiterleiten und antwort ausgeben, so dass der dbox movieplayer sie auswerten kann
#echo $go;
#$go="/requests/status.xml?command=in_play&input=".urlencode("fake:// --fake-file C:\\stream.jpg :sout=#transcode
#{vcodec=mpeg4,vb=1500}:duplicate{dst=display} :sout-all :sout-keep");
#echo $go;
  $html = implode('', file('http://127.0.0.1:'.$myconfig['vlcport'].$go));
  echo $html;
 
 
 
/*
-------------------------------------------------------------------------------------
vlc Standardanwort auf statusanfragen vom movieplayer (OK Taste whrend wiedergabe)
mglich wre hier ein erweitern der metainfo whrend
der wiedergabe. zb um youtube kommentare oder trailer zusatzinfos aufzurufen.
-------------------------------------------------------------------------------------
echo '
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
 
 
<root>
  <volume>0</volume>
  <length>149</length>
  <time>34</time>
  <state>playing</state>
  <position>23</position>
 
  <fullscreen></fullscreen>
  <random>0</random>
  <loop>0</loop>
  <repeat>0</repeat>
  <information>
 
 
 
      <category name="Meta-Information">
 
          <info name="Copyright">asdasdasdasd</info>
          <info name="Beschreibung">asdadadasd</info>
          <info name="Titel">asdasdadasd</info>
      </category>
 
  </information>
  <stats>
    <readbytes>4653725</readbytes>
    <inputbitrate>0.174148</inputbitrate>
 
    <demuxreadbytes>4511593</demuxreadbytes>
    <demuxbitrate>0.181312</demuxbitrate>
    <decodedvideo>826</decodedvideo>
    <displayedpictures>0</displayedpictures>
    <lostpictures>0</lostpictures>
    <decodedaudio>1485</decodedaudio>
 
    <playedabuffers>0</playedabuffers>
    <lostabuffers>0</lostabuffers>
    <sentpackets>29370</sentpackets>
    <sentbytes>5521560</sentbytes>
    <sendbitrate>0.133178</sendbitrate>
  </stats>
 
</root>
*/
 
?>