IO-Streams
Tom2 (der authentifizierte)
- perl
Hi Leute
Ich versuche den MPlayer auf meinem Webserver fernzusteuern, doch leider komme ich nicht sehr weit: Ich kann zwar den MPlayer über den Webserver auf meinem Mac starten und erhalte dann auch ein Fenster, in dem der Film abgespielt wird, jedoch weiss ich nicht wie ich die Ein- und Ausgabe-Streams handhaben soll.
Ich habe gelesen, dass stdin, stdout und stderr eine Art Dateien seien. Nun wollte ich, damit ich den MPlayer über's Web bedienen kann, stdin auf eine richtige Datei umleiten
print exec('mplayer -vo macosx /Daten/Movies/Magnolia.avi 0<clients/web01.in 1>clients/web01.out');
und mit einem Perl-Skript die Kommandos in diese Datei schreiben.
print "Eingabe-Datei zur Übergabe von Kommandos öffnen...\n";
open(OUT, ">clients/web01.in");
print OUT ' '; # Ein Leerschlag um den Film anzuhalten
close(OUT);
Doch leider klappt das nicht. Ich kann dem MPlayer zwar über die Datei web01.in das Pausen-Kommando geben (Hex-Editor, die Datei darf wirklich nur 0x20 enthalten), aber mit Perl geht das nicht wie ich mir das vorstelle.
Krieg ich das irgendwie hin oder bin ich völlig auf dem Holzweg? Bin für jeden Hinweis dankbar.
Gruss
Tom2
Hier das Perl-Skript (eines meiner ersten):
#!/usr/bin/perl -w
use strict;
use CGI::Carp qw(fatalsToBrowser);
require 'cgi-lib.pl';
print PrintHeader();
print "<pre>Try to start mplayer...\n";
print exec('mplayer -vo macosx /Daten/Movies/Magnolia.avi 0<clients/web01.in 1>clients/web01.out');
print "Eingabe-Datei zur Übergabe von Kommandos öffnen...\n";
open(OUT, ">clients/web01.in");
print OUT ' '; # Ein Leerschlag um den Film anzuhalten
close(OUT);
print "Ausgabe-Datei öffnen\n";
open(IN, "clients/web02.out");
my $zeile;
while ($zeile = <IN>) {
print "$zeile";
}
close(IN);
print "\n\nEnde</pre>";
Hell-O!
Ich versuche den MPlayer auf meinem Webserver fernzusteuern, doch leider komme ich nicht sehr weit: Ich kann zwar den MPlayer über den Webserver auf meinem Mac starten und erhalte dann auch ein Fenster, in dem der Film abgespielt wird, jedoch weiss ich nicht wie ich die Ein- und Ausgabe-Streams handhaben soll.
Hilft dir dieser Thread vielleicht weiter? Der Slave-Modus wird in der Doku erklärt.
Siechfred
Moin!
Ich versuche den MPlayer auf meinem Webserver fernzusteuern, doch leider komme ich nicht sehr weit: Ich kann zwar den MPlayer über den Webserver auf meinem Mac starten und erhalte dann auch ein Fenster, in dem der Film abgespielt wird, jedoch weiss ich nicht wie ich die Ein- und Ausgabe-Streams handhaben soll.
Nochmal langsam: Der MPlayer auf deinem Webserver liefert dem Mac das Bild?
Ich habe gelesen, dass stdin, stdout und stderr eine Art Dateien seien.
Unter Unix ist alles eine Datei. In der Programmierung stellen stdin, stdout und stderr spezielle Filehandles dar, aber es gibt auch genau so benannte Dateien unter /dev/.
Nun wollte ich, damit ich den MPlayer über's Web bedienen kann, stdin auf eine richtige Datei umleiten
Das wäre dann also eine Batch-Verarbeitung.
print exec('mplayer -vo macosx /Daten/Movies/Magnolia.avi 0<clients/web01.in 1>clients/web01.out');
und mit einem Perl-Skript die Kommandos in diese Datei schreiben.
Wenn das von Perl ausgeht, warum nimmst du dann keine Pipe? Das erspart dir das Anlegen der Datei, aus der der MPlayer dann liest.
Hier das Perl-Skript (eines meiner ersten):
#!/usr/bin/perl -w
use strict;
use CGI::Carp qw(fatalsToBrowser);require 'cgi-lib.pl';
Ist das eine Bibliothek von dir oder die alte Variante von `use CGI;`{:.language-perl}?
> ~~~perl
print PrintHeader();
> print "<pre>Try to start mplayer...\n";
>
> # Hier öffnet sich das Fenster mit dem MPlayer, und das Skript
> # wird abgebrochen
>
> print exec('mplayer -vo macosx /Daten/Movies/Magnolia.avi 0<clients/web01.in 1>clients/web01.out');
Was steht denn _zu diesem Zeitpunkt_ in der Eingabedatei clients/web01.in?
In etwa so stelle ich mir das IO-Handling vor... (?:-)
print "Eingabe-Datei zur Übergabe von Kommandos öffnen...\n";
open(OUT, ">clients/web01.in");
print OUT ' '; # Ein Leerschlag um den Film anzuhalten
close(OUT);
Da haben wir doch das Problem: Die Eingabedatei muss existieren, \_bevor\_ du sie dem MPlayer zum Öffnen gibst. In deinem Fall wäre eine Pipe wahrscheinlich wirklich besser:
~~~perl
print "Eingabe-Datei zur Übergabe von Kommandos öffnen...\n";
open(OUT, "|mplayer -vo macosx /Daten/Movies/Magnolia.avi >clients/web01.out");
print OUT ' '; # Ein Leerschlag um den Film anzuhalten
close(OUT);
Viele Grüße,
Robert
Hi Leute
Ihr seit die grössten! Ich werde mit euren Vorschlägen etwas rumexperimentieren und euch eine Rückmeldung geben, wenn es klappt.
Nochmal langsam: Der MPlayer auf deinem Webserver liefert dem Mac das Bild?
Momentan läuft der Webserver und der MPlayer auf dem Mac. Später soll das Skript auf einer GeeXBox laufen, damit ich die aktuellen Instanzen von MPlayer auf dem Server kontrolieren kann.
Unter Unix ist alles eine Datei. In der Programmierung stellen stdin, stdout und stderr spezielle Filehandles dar, aber es gibt auch genau so benannte Dateien unter /dev/.
Von /dev kenne ich hdax und solche Dinge, durch den restlichen Urwald an Devices blick ich aber leider noch nicht durch. Ein FiFo scheint aber das zu sein, was ich brauche.
Ein Hautproblem wird sein, dass ich den MPlayer nicht immer über das Perlskript starten werde, sondern auch bereits laufende beeinflussen will: Ich starte z.B. den MPlayer mit dem ersten Skriptaufruf und beim zweiten will ich dem Player über das Inputfile das Pausenkommando übergeben. Aber probieren geht über studieren!
Wenn das von Perl ausgeht, warum nimmst du dann keine Pipe? Das erspart dir das Anlegen der Datei, aus der der MPlayer dann liest.
Wie gesagt: Ich muss das Input-File über mehrere Skript-Aufrufe hinweg manipulieren können.
require 'cgi-lib.pl';[/code]
Ist das eine Bibliothek von dir oder die alte Variante von
use CGI;
?
Ehm... ja. Ich werde mich mal besser mit CGI beschäftigen. Perl ist neuland für mich.
print exec('mplayer -vo macosx /Daten/Movies/Magnolia.avi 0<clients/web01.in 1>clients/web01.out');[/code]
Was steht denn _zu diesem Zeitpunkt_ in der Eingabedatei clients/web01.in?
Das Fenster öffnet sich nur, wenn web01.in absolut leer ist oder wenn nur ein Leerzeichen (Pausenkommando) drin steht.
Wenn dann der Film läuft und ich von der Shell aus versuche, mit
echo >> clients/web01.in
den Film anzuhalten, dann bekomme ich ein "Permission denied.".
Ich melde mich wieder.
Gruss & Dank x 1000
Tom2