Tom2 (der authentifizierte): IO-Streams

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";

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');

Die folgenden Zeilen werden bereits nicht mehr bearbeitet.

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);

print "Ausgabe-Datei öffnen\n";
open(IN, "clients/web02.out");
my $zeile;
while ($zeile = <IN>) {
 print "$zeile";
}
close(IN);
print "\n\nEnde</pre>";

  1. 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

    --
    Ich bin strenggenommen auch nur interessierter Laie. (molily)
    Welcome To Carcass Cuntry || Steuerfreie Geburtsbeihilfen?  || RT 221 Erfurt-Altstadt i.V.
  2. 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?

    Die folgenden Zeilen werden bereits nicht mehr bearbeitet.

    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

    1. 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