PHP Videobitraten-Rechner

rony

Commodore Pro
🎅Rätsel-Elite ’10
Registriert
Jan. 2007
Beiträge
4.986
Hallo,

ich wollte meinen Handy-Videobitraten-Rechner vorstellen :)

natürlich auch noch Verbesserungsvorschläge einholen, aber als erstes die Seite:

http://rony.codename7.de/rechner.php

Worum geht es eig.

Nun, da ich relativ häufig Videos auf meinem Handy schaue, war ich es leid, dass ich mich irgendwelcher Software hingeben sollte, die das Konvertieren für mich übernimmt, ohne das ich weiß was wirklich gemacht wird. Auch das sparen von Speicherplatz lag mir sehr am Herzen.

Nun, dieser Rechner ist für alle die, die die optimale Bitrate für ihr Handy ausrechnen wollen, um dann ihre Video so zu komprimieren :)

Die Durchführung:

Ich schaute mir an, welche Bitrate Videos haben müssten, damit sie auf einem Handydisplay gut aussehen. Nach einigen versuchen schaute ich bei Google (YouTube) vorbei. Habe mir dort 5 unterschiedliche Videos in 720p runtergeladen. YouTube bietet eine relativ gute Qualität bei gleichzeitig geringen Speicherverbrauch. Da die PPI bei einem Handy Display in der Regel höher sind als die bei einem normalen Desktopmonitor würde man auch Komprimierungsartefakte nicht besonders stark oder sogar überhaupt nicht sehen.

Nun gut...5 Videos runtergeladen, und die durchschnittliche Bitrate errechnet (1915Kbit/s).

Das habe ich als Referenzbitrate angegeben. Diese kann von jedem geändert werden, der meint, dass die Folge Rechnungen mit mehr oder weniger gemacht werden sollten. Das gleiche bei der Referenzframerate - YouTube hat 24fps.

nun wird (1915/(1280x720))/24 gerechnet umso die Bitrate pro Pixel pro Frame zu errechnen.

Weil ich ja nicht zu viel Speicherplatz verbrauchen will, und ein Video ja nicht die Auflösung eines Displays übersteigen muss, muss nun also die Auflösung des Videos berechnet werden.

Ich selber habe ein HD2 mit einer Auflösung von 800x480 (Querformat). Wenn ich nun ein 1280x720px Video habe, muss ich es runterskalieren.
das Seitenverhältnis ist 1,7777 (16:9), wenn das Seitenverhältnis des Videos größer ist, als das Seiten Verhältnis des Display, wird es auf die Höhe skaliert, wenn es kleiner ist, auf die Breite.

Dort mache ich also so ziemlich die gleiche Rechnung wie bei jedem Mediaplayer, wenn man Videos abspielt.
Hinzu kommt aber noch, dass jede Auflösungen (höhe wie auch breite) durch 16 teilbar sein muss. Das ist einfach ein Gesetz im De-/Encoder um noch weiter Speicherplatz zu sparen.

Nun gut... soweit so klar ^^... nun hat man die Auflösung von einem skalierten Video und wendet nun dieselbe Rechnung von oben nur umgekehrt mi neuen Zahlen an :)

(Pixelbitrate x (auflösunghöhe x auflösungbreite)) x framerate

Das passt also alles, wenn das Videos genau entweder auf die Höhe oder auf die breite des Displays skaliert... alles kein Problem bis hier.

Problematisch wird es, als ich diese Rechnung auch auf Videos angewandt haben, welche eine geringere Auflösung als das Display haben. Diese werden beim Abspielen "größer" gemacht.
Nun war mein Gedanke: "Würde das Video bei der geringen Auflösung besser aussehen, wenn ich ihm mehr Bitrate geben würde?"
Mit anderen Worten - Wenn die Auflösung sinkt, muss die Bitrate pro Pixel steigen.
Ich denke mal, das kann auch jeder nachvollziehen.
Also musste ich nun einen Wert finden, wie ich es in eine Formel packen kann.
Ich lud mir somit die 480p von denselben Videos runter, und konnte dadurch einen Wert errechnen (bitte nicht steinigen, ist schon einige Wochen her, aber ich stelle gerne die Excel Tabelle zur Verfügung, damit jeder die Rechnung nachvollziehen kann). Diese habe ich fest in die Rechnung mit einbezogen.

Weiteres dazu sieht man in dem Skript selber :)

und am Ende erfolgt natürlich die Ausgabe :)


Das ist so meine erste Erfahrung mit PHP - also nicht steinigen wenn man manche sachen eleganter lösne kann. Bin aber für Vorschläge offen.


PHP:
<html>
    <head>
        <title>Bitratenberechnung</title>
    </head>
    <body>
    
    <form action="rechner.php" name="rechnung"  method="post" style="font-size:16px;font-face:arial">
        <fieldset>
            <legend>Eingabe</legend>
            <label>Referenzbitrate: <input name="ref_bit" type="text" size="8" maxsize="8" value="1915" /></label><br>
            <label>Referenzframerate: <input name="ref_frame" type="text" size="8" maxsize="8" value="24" /></label><br><br>
            <label>Displayauflösung: <input name="ur_display_b" type="text" size="4" maxsize="4" value="<?=$_POST["ur_display_b"]?>" /></label><label>x<input name="ur_display_h" type="text" size="4" maxsize="4" value="<?=$_POST["ur_display_h"]?>" /></label><br>
            <label>Original Vidoauflösung: <input name="org_v_b" type="text" size="6" maxsize="6" value="<?=$_POST["org_v_b"]?>" /></label><label>x<input name="org_v_h" type="text" size="6" maxsize="6" value="<?=$_POST["org_v_h"]?>" /></label><br>
            <label>Video Framerate: <input name="v_frame" type="text" size="4" maxsize="4" value="<?=$_POST["v_frame"]?>" /></label><br><br>
            <input type="submit" name="rechnen" value="Berechnen" />
            <input type="reset" name="abbruch" value="Eingaben löschen" />
        </fieldset>
    </form>

<?php
if(isset($_POST["rechnen"])) {
$ref_b        = 1280;
$ref_h        = 720;
$square        = $ref_b*$ref_h;
$ref_bit    = $_POST["ref_bit"];
$ref_frame    = $_POST["ref_frame"];

$v_frame    = $_POST["v_frame"];

$pixel_bit    = (($ref_bit/$square)/$ref_frame)*$v_frame;

$ur_display_b        = $_POST["ur_display_b"];
$ur_display_h        = $_POST["ur_display_h"];
$display_square        = $ur_display_b*$ur_display_h;
$display_seitenver    = $ur_display_b/$ur_display_h;

$org_v_b        = $_POST["org_v_b"];
$org_v_h        = $_POST["org_v_h"];
$seitenverh        = $org_v_b/$org_v_h;
$video_square    = $org_v_h*$org_v_b;

if($seitenverh < $display_seitenver) {
    $hoehe    = $ur_display_h;
    $breite    = $ur_display_h*$seitenverh;
}else{
    $hoehe    = $ur_display_b/$seitenverh;
    $breite    = $ur_display_b;
}

$wert    = 0.145652704; //gerne hier lassen
$mod    = 16;

if ($ur_display_b >= $org_v_b) {
    $neuaufl_h = $org_v_h;
    $neuaufl_b = $org_v_b;
    
    if ($ur_display_h > $org_v_h) {
        
        /*$neuaufl_h = $org_v_h;
        $neuaufl_b = $org_v_b;
        */
            if ($seitenverh >= $display_seitenver) {            
                $video_bitrate= $video_square*($ur_display_b/$org_v_b*$wert+1)*$pixel_bit;
                $pixel_bit= ($ur_display_b/$org_v_b*$wert+1)*$pixel_bit;
            } else {
                $video_bitrate= $video_square*($ur_display_h/$org_v_h*$wert+1)*$pixel_bit;
                $pixel_bit= ($ur_display_h/$org_v_h*$wert+1)*$pixel_bit;
            }
        } else {
            $video_bitrate= $video_square*$pixel_bit;
            
        }
} else {
    if($seitenverh >= $display_seitenver) {
        $neuaufl_h=round($ur_display_b/$seitenverh/$mod)*$mod; //Auflösung (Höhe) in der Höhe mod16 korrekt berechnen
        $neuaufl_b=$breite;
    } else {
        $neuaufl_h=$hoehe;
        $neuaufl_b=round($ur_display_h*$seitenverh/$mod)*$mod; //Auflösung (Höhe) in der Höhe mod16 korrekt berechnen
    }
    $v_square= $neuaufl_h*$neuaufl_b;
    $video_bitrate= $v_square*$pixel_bit;
}
    printf("Bitrate pro Pixel:<br>%f<br><br>", round($pixel_bit, 5));
    echo "Seitenverhältnis:<br>".$seitenverh."<br><br>";
    printf("Videoauflösung<br>%d x %d<br><br>", $neuaufl_b, $neuaufl_h);
    printf("Videobitrate:<br>%.0f<br><br>", $video_bitrate);
}
?>
</body>
</html>
 
warum schreibst du das nich gleich in javascript? fände ich jetzt naheliegender, dann brauchste keine internetverbindung dafür.
 
PHP scheint mir auch denkbar ungeeignet für den Zweck.
 
ihr meint jetzt eine offline version ?

nja, online wollte ich es schon haben - damit ich von jedem rechner daraudf zugreifen kann. aber an javascript hab ich auch schon gedacht, eine internetverbindung brauch ich dennoch ^^
 
javascript funktioniert sowohl als online wie auch als offline version. man kopiert halt einfach die html-datei mit inline javascript auf die festplatte und läd die lokal im browser.
 
Hi,

ich "sehe" nirgends den Einsatz von SQL, aber da seine eigene Homepage auch auf der gleichen Domain liegt...

Ich als Programmierer wollte damit nur sagen, es gehört zum guten Stil dass Benutzereingaben geprüft, validiert und DANN erst weiter bearbeitet werden - und nicht direkt wie in diesem Fall.

Dass ich Ahnung habe stelle ich als Anwendungsentwickler mit einiger Erfahrung jetzt einfach mal so in den Raum.

Wer meint, man könne auf solche Sache verzichten: Bitte, tut euch keinen Zwang an.

Aber nimm einfach den Fall an: Du machst diesen kleinen Code-Schnipsl, der bleibt auf deiner Domain liegen, die erweitert sich um CMS, Datenbank, Blog etc. Du vergisst den tollen "Video Rechner" komplett und in einem halben Jahr kommt jemand auf die Idee, mit einer SQL-Injection oder einem anderen Exploit, den du locker hättest abfangen können, deine hart erarbeitete DB auf den Kopf zu stellen.

Die SQL-Injection war vielleicht nicht das beste Beispiel. Ich dachte eben einfach, ihr könntet genug weit abstrahieren - aber da habe ich mich wohl getäuscht. Es ging mir einfach um Generelles.

Ich finde, DAS muss nicht sein wenn man "Ahnung" hat.

Aber jeder wie er will, wenn Kritik und Empfehlungen hier nicht mehr willkommen sind dann bitte.

@Bauergiesen

Danke für die Erklärung, das weiss ich.

VG,
Mad
 
Zuletzt bearbeitet:
Madman1209 schrieb:
Aber jeder wie er will, wenn Kritik und Empfehlungen hier nicht mehr willkommen sind dann bitte.
Oh bitte, nicht so melodramatisch.

Wenn du von der Seite redest, dann sag das auch explizit so, denn dein Eintrag bezog sich mal gar nicht konkret auf seine Seite, sondern wirkt eher wie ein schnelle zusammenhangslose Frage.
 
Hi,

wovon würde ich denn in diesem Thread sonst reden wenn nicht von seiner Seite?

Oh bitte, nicht so melodramatisch.

Dann gewöhnt euch gefälligst einen anderen Ton an... wenn ich sowas lese wie

Manchmal stelle ich mir echt die Frage, ob Leute auch Ahnung von dem haben was sie da von sich Preis geben.

dann ist es mit Verlaub nicht zu weit hergeholt zu denken, dass meine Kritik bzw. Empfehlung nicht willkommen ist, oder siehst du das anders? Falls ja solltest du evtl. nochmal genau lesen, ICH verstehe es jedenfalls so.

Aber egal. Ich wollte dem TE nur einen gutgemeinten Rat geben und mich ein wenig mit ihm über das Thema PHP unterhalten da ich das beruflich mache - aber dank so tollen, umgänglichen und fachkompetenten Leute wie euch ist er sicher auch ohne meine Hilfe gut aufgehoben. Ich bin hier raus.

@TE

Viel erfolg und viel Spaß weiterhin mit PHP und deinen Projekten! Für den Anfang schon gut, immer dran bleiben!

VG,
Mad
 
@Madman1209
Du gehst einfach so tief in die Materie mit deinen SQL Injection-Beispielen,
Es gibt immer Dinge, welche man schöner programmieren kann - dafür braucht man sich nur mal Projekte angucken, welche zwei bis drei Jahre alt sind - und ja ich bin auch in der Branche tätigt.

Insgesamt ein sehr gelungener Ansatz, wobei ich mir bei deiner Lösung wünschen würde keine Vermischung zwischen HTML- und PHP-Code zu haben.
 
Zurück
Oben