Schrift
[thread]10404[/thread]

PHP-Code zum flv-Pseudostreaming in Perl umschr.?



<< >> 10 Einträge, 1 Seite
perlpower
 2007-09-16 23:26
#99519 #99519
User since
2007-09-16
5 Artikel
BenutzerIn
[default_avatar]
Hi Ihr,

ich bin etwas verzweifelt. Ich versuche schon seit ein paar Tagen ein Perl Skript umzuschreiben. Es ist das sog. flv-Pseudostreaming PHP Skript. Zu finden hier.

Ich brauche das unbedingt in Perl statt PHP. Weiß jemand ob es das auch in Perl gibt oder kennt sich so aus, dass er mir bei der Umschreibung helfen kann? Sollte das jemand in Perl umgeschrieben bekommen, ist das sicherliche eine Bereicherung für die Perl-Welt. Ich würds eigentlich so gern machen, bin aber eben ein absoluter perl-Anfänger und stottere da nur Mist zurecht. Hab da eigentlich eher null Ahnung...
ptk
 2007-09-17 01:42
#99521 #99521
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Zeig mal deinen bisherigen Versuch...
Gast Gast
 2007-09-17 02:27
#99522 #99522
Zeig auch mal das php Script.
esskar
 2007-09-17 10:51
#99524 #99524
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
sollte nicht das problem sein.
perlpower
 2007-09-17 12:26
#99532 #99532
User since
2007-09-16
5 Artikel
BenutzerIn
[default_avatar]
das PHP-Skript:

Code: (dl )
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
<?
$path = "./";

$seekat = $_GET["position"];
$filename = htmlspecialchars($_GET["file"]);
$ext=strrchr($filename, ".");
$file = $path . $filename;


if((file_exists($file)) && ($ext==".flv") && (strlen($filename)>2) && (!eregi(basename($_SERVER['PHP_SELF']), $filename)) && (ereg('^[^./][^/]*$', $filename)))
{
header("Content-Type: video/x-flv");
if($seekat != 0) {
print("FLV");
print(pack('C', 1 ));
print(pack('C', 1 ));
print(pack('N', 9 ));
print(pack('N', 9 ));
}
$fh = fopen($file, "rb");
fseek($fh, $seekat);
while (!feof($fh)) {
print (fread($fh, filesize($file)));
}
fclose($fh);
}
else
{
print("The file does not exist"); }
?>



Mein Perl-Versuch:

Code (perl): (dl )
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!usr/bin/perl -w

# get GET data
if($ENV{'REQUEST_METHOD'} eq 'GET')
    { $Daten = $ENV{'QUERY_STRING'}; }
else
    { $Daten = null; }

# modify GET data array
$Daten =~ s/%([\da-fA-f]{2})/pack("c",hex($1))/ge;
$Daten =~ tr/+/ /;
for(split/&/,$Daten) {
        ($key , $val) = split/=/,$_,2;
        $Form{$key} .= $val;
}


# full path to dir with video
$path = "./";

# get position
$seekat = $Form{'position'};

# get filename of video
$filename = $Form{'file'};
$filename =~ s/\&/&amp;/g;
$filename =~ s/</&lt;/g;
$filename =~ s/>/&gt;/g;
$filename =~ s/\"/&quot;/g;

# get filename ending
$ext = substr($filename,length($filename)-4,4);

# file is path + filename
$file = $path . $filename;

# if file exists do the pseudo streaming:
if( (-e $file) && ($ext==".flv") && (length($filename)>2) && (!($filename =~ m/flvprovider.pl$/)) )
{
        print "Content-type: text/html\n\n";
        if($seekat != 0) {
                print("FLV");
                print(pack('C', 1 ));
                print(pack('C', 1 ));
                print(pack('N', 9 ));
                print(pack('N', 9 ));
        }
        # $fh = fopen($file, "rb");
        open (FILE, $file) or die $!; 
        binmode FILE;

        seek (FILE, $seekat, 0);

        while (!eof(FILE)) {
          read(FILE, $scalar, stat($file));
          print $scalar;
        }
        close(FILE);
}
else
{
          print "Content-type: text/html\n\n";
        print "ERROR: The file does not exist"; 
}
renee
 2007-09-17 12:35
#99533 #99533
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
perlpower+2007-09-17 10:26:32--

Mein Perl-Versuch:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!usr/bin/perl -w

# get GET data
if($ENV{'REQUEST_METHOD'} eq 'GET')
    { $Daten = $ENV{'QUERY_STRING'}; }
else
    { $Daten = null; }

# modify GET data array
$Daten =~ s/%([\da-fA-f]{2})/pack("c",hex($1))/ge;
$Daten =~ tr/+/ /;
for(split/&/,$Daten) {
        ($key , $val) = split/=/,$_,2;
        $Form{$key} .= $val;
}


Für so etwas bitte das Modul CGI.pm verwenden; und bitte Wiki:[tt]use strict[/tt] verwenden.

Code (perl): (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl

use strict;
use warnings;
use CGI;

my $cgi = CGI->new;
my %Form = $cgi->Vars;


Quote
Code (perl): (dl )
1
2
3
4
5
# full path to dir with video
# ...

# get filename ending
$ext = substr($filename,length($filename)-4,4);


hier kannst Du das length($filename) und das ,4 weglassen, also
my $ext = substr $filename, -4;

Quote
Code (perl): (dl )
1
2
3
4
5
# file is path + filename
$file = $path . $filename;

# if file exists do the pseudo streaming:
if( (-e $file) && ($ext==".flv") && (length($filename)>2) && (!($filename =~ m/flvprovider.pl$/)) )


Ein Stringvergleich wird in Perl mit eq gemacht, also $ext eq '.flv'


und was funktioniert daran nicht? Bekommst Du eine Fehlermeldung?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
perlpower
 2007-09-17 14:24
#99544 #99544
User since
2007-09-16
5 Artikel
BenutzerIn
[default_avatar]
Alsooooo. Mittlerweile klappts mit Deinen Änderungen, renee, fast. Dafür erstmal also vielen Dank! Stand der Dinge ist der: Video kann, wie beim php-Skript "gescrubbt" werden, nur erfolgt die Wiedergabe des dann vom Perl-Skript ausgegebenen Video super hakend und langsam. Also scheint der if-Block nach
# if file exists do the pseudo streaming:
nicht auf die gleiche Ausgabe hinauszulaufen...
esskar
 2007-09-17 21:41
#99577 #99577
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
versuch es mal so

Code: (dl )
1
2
3
4
5
6
my $len = 1024;
while (!eof(FILE)) {
my $scalar;
read(FILE, $scalar, $len);
print $scalar;
}
ptk
 2007-09-17 22:08
#99580 #99580
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Vielleicht muss man auch autoflush einschalten: $|=1;
Dubu
 2007-09-20 00:14
#99714 #99714
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
1.) Content-type des Videos sollte doch wohl video/x-flv sein, nicht text/html, oder?
2.) Es fehlt der binmode(STDOUT), nach dem Header.
<< >> 10 Einträge, 1 Seite



View all threads created 2007-09-16 23:26.