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