Hallo liebe Leute.
Das Projekt Kalva könnte rege Mithilfe bei folgendem Problem brauchen...
Aus einem Posting von Migo [1] hatte ich in Kalva [2] übernommen, die Bitrate zu verringern, wenn die resultierende Dateigröße bei einer Bitrate von 2000 über 2 GB anwachsen würde (noch mal Danke, migo).
Dabei ist folgende Funktion herausgekommen:
Nun kommt das Problem: Kalva soll zukünftig nicht mehr die Bitrate konstant mit 2000 vorgeben, sondern diese soll konfigurierbar werden.
Wenn ich aber nicht mehr 2000 als konstante Bitrate verwende, stimmt die Rechnung ja nicht mehr. Ich würde gerne anders herum herangehen. Aber ich muss gestehen, dass ich von Mathematik so gut wie keinen Schimmer habe. Ich verstehe die Rechnung kaum, muss sie aber jetzt umwandeln.
Mir schwebt folgendes vor: Berechnung, wie groß die Datei mit der (variablen, vorgegebenen) Bitrate bei vorgegebener Dauer in Sekunden wird.
Verringerung der Bitrate zur Reduzierung der Dateigröße auf 2GB, wenn die ermittelte Größe den Grenzwert übersteigt.
Kann mir jemand den (oder die) Algorythmus aufzeigen, den ich dafür benötige? Oder wenigstens den alten Algorhythmus so erklären, dass ich die Terme verstehe?
Insbesondere sind mir die im folgenden rot markierten Konstanten nicht klar.
bitrate = std::floor((( 1995 - 0.9375 * minutes) * 8192 /seconds ));
Ich vermute, dass die erste Konstante die Wunschgröße in GB ist (mit einer gewissen Reserve). Die anderen Werte sind mir aber völlig unklar.
Gruß,
Andreas
----------
[1] http://www.linux-club.de/viewtopic.php?p=153350#153350
[2] http://www.linux-club.de/viewtopic.php?t=31795
Das Projekt Kalva könnte rege Mithilfe bei folgendem Problem brauchen...
Aus einem Posting von Migo [1] hatte ich in Kalva [2] übernommen, die Bitrate zu verringern, wenn die resultierende Dateigröße bei einer Bitrate von 2000 über 2 GB anwachsen würde (noch mal Danke, migo).
migo schrieb:(...Auszug...)
Code:#!/bin/sh # [...snip...] # # Abfrage der Aufnahmedauer # dauer=`kdialog --title "Dauer der Aufnahme" --inputbox "Aufnahmedauer? (Format hh:mm)"` # # Umrechnung der Aufnahmedauer in Minuten # FS: "Field Separator" = "Feldtrennzeichen" für awk # minuten=`echo $dauer | awk 'BEGIN { FS= ":" } { print ( $1 * 60 ) + $2 }'` # # Festlegung der Bitrate: Unter 120 Minuten Filmdauer stets 2000 kByte/s, darüber Anpassung an max. 2 GB Dateigröße # lt: "less than" = "kleiner als", Shell-Befehl zum Vergleich zweier Zahlen # scale: Festlegung der Nachkommastellen der bc-Berechnung, hier: keine ("0"), sonst Fehlermeldung von mencoder # if test $minuten -lt 120 then bitrate=2000 else bitrate=`echo "scale=0;(1995-0.9375*$minuten)*8192/(60*$minuten)"|bc` fi [...snip...]
Dabei ist folgende Funktion herausgekommen:
Code:
double KalvaRecorder::setBitrate()
{
int hours = m_duration->time().hour();
int minutes = m_duration->time().minute();
int seconds = m_duration->time().second();
double bitrate = 2000;
minutes = minutes + (hours * 60);
if ((minutes > 0) and (seconds > 0)) {
minutes -= 1;
}
seconds = seconds + (60 * minutes);
// computation of the vbitrate: up to 128 minutes we use 2000 kByte/s,
// from 129 minutes on we compute a lower bitrate to keep the
// resulting filesize <= 2 GB
if ( minutes > 128 )
bitrate = std::floor(((1995 - 0.9375 * minutes) * 8192/seconds ));
return bitrate;
}
Nun kommt das Problem: Kalva soll zukünftig nicht mehr die Bitrate konstant mit 2000 vorgeben, sondern diese soll konfigurierbar werden.
Wenn ich aber nicht mehr 2000 als konstante Bitrate verwende, stimmt die Rechnung ja nicht mehr. Ich würde gerne anders herum herangehen. Aber ich muss gestehen, dass ich von Mathematik so gut wie keinen Schimmer habe. Ich verstehe die Rechnung kaum, muss sie aber jetzt umwandeln.
Mir schwebt folgendes vor: Berechnung, wie groß die Datei mit der (variablen, vorgegebenen) Bitrate bei vorgegebener Dauer in Sekunden wird.
Verringerung der Bitrate zur Reduzierung der Dateigröße auf 2GB, wenn die ermittelte Größe den Grenzwert übersteigt.
Kann mir jemand den (oder die) Algorythmus aufzeigen, den ich dafür benötige? Oder wenigstens den alten Algorhythmus so erklären, dass ich die Terme verstehe?
Insbesondere sind mir die im folgenden rot markierten Konstanten nicht klar.
bitrate = std::floor((( 1995 - 0.9375 * minutes) * 8192 /seconds ));
Ich vermute, dass die erste Konstante die Wunschgröße in GB ist (mit einer gewissen Reserve). Die anderen Werte sind mir aber völlig unklar.
Gruß,
Andreas
----------
[1] http://www.linux-club.de/viewtopic.php?p=153350#153350
[2] http://www.linux-club.de/viewtopic.php?t=31795