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
/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 können 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 Menüpunkt; alle Scripte im Ordner scripts einlesen und ausgeben
#tempfile für suchfunktion löschen um neue suchanfragen hinzufügen zu können.
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 unterstüzt nur sampleraten von 44100
#Problem mit mehreren audio Kanälen? muss noch genauer geprüft werden
$_GET['input']=str_replace("channels=2","channels=1",$_GET['input']);
$_GET['input']=str_replace("}:std",",samplerate=44100}:std",$_GET['input']);
#Ursprüngliche Anfrage Modifizieren; eintragen der streamurl;
$go=$myconfig['vlcplaystr'];
$go.="&input=".urlencode($url." ".strstr($_GET['input'],":sout="));
#workaround für 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 während wiedergabe)
möglich wäre hier ein erweitern der metainfo während
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>
*/
?>