PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bitrate errechnen mit shell skript



jockelb
17-12-2005, 10:19
Ich habe im I-Net ein Skrip gefunden was divx Film zu svcd umbauen kann. Leider scheint es veraltet zu sein und ich möchte das für mich ändern.Entstehen soll immer nur eine CD
Mir wird die Laufzeit des Filmes angezeigt.
$Horas für Stunden
$Minutos für Minuten
$SEGUNDOS für Sekunden
Des weitern ist die kb grösse einer CD in 834560kb festgelegt(mit überbrennen) in der Variable CDBYTE

Ich möchte nun die gesamt Sekunden von dem Film in der Variable
SEK_TOTAL haben um dann die Bitrate des Filmes zu berechen.
Das würde dann gerechnet CDBYTE / SEK_TOTAL -24 *8
Das subrahieren von 24 ist nötig weil der Film eine Audio Bitrate von 192 haben soll (192/8=24)
Das multiplizieren ist nötig um die Bit zu haben.

Wenn ich das alles per Hand mache bekomme ich für eine Transcode Zeile ein recht gutes Ergebniss.

Leider habe ich solche Lösungen das letzte mal mit eine C64 gemacht. Das bekomme ich heute einfach nicht mehr hin.

MFG

Das Skript bisher
#!/bin/sh

# Este script pasa un Divx a SVCD. Para los archivos temporales se
# necesita al menos 4.5 Gigas (m2v y mpa, los .mpg y los .bin)

DIR=`pwd`
TEMPFOLDER=/tmp/divx2svcd-$RANDOM
TEMPLATE=$TEMPFOLDER/template

# CDSIZE Values. VCDs are write in Mode 2, so the filesizes are the
# the following:
# 74 Min/650Mb ---> CDSIZE=735
# 80 Min/700Mb ---> CDSIZE=795
CDSIZE=815
QUANTUM=7
MAXVIDEORATE=4000000
AUDIORATE=192
CDBYTE=834560

if [ $# -eq 0 ]; then
echo "Usage:"
echo " divx2svcd <divxfile>"
exit 1
fi


FILE=$1
if [ "$1" == "`basename \"$1\"`" ]; then
FILE="$DIR/$1"
fi


mkdir $TEMPFOLDER
cd $TEMPFOLDER

# Create a template for bbmpeg encoder
echo "quant_value = $QUANTUM" > $TEMPLATE
echo "max_bitrate = $MAXVIDEORATE" >> $TEMPLATE

echo "Dir: $DIR"
echo "Temp: $TEMPFOLDER"
tcprobe -i "$FILE" > $TEMPFOLDER/info

WIDTH=`grep '\[avilib\] V:' $TEMPFOLDER/info | \
perl -e ' $line=<STDIN> ; $line =~ /width=(\d+)/ ; print $1' `
HEIGHT=`grep '\[avilib\] V:' $TEMPFOLDER/info | \
perl -e ' $line=<STDIN> ; $line =~ /height=(\d+)/ ; print $1' `
FPS=`grep '\[avilib\] V:' $TEMPFOLDER/info | \
perl -e ' $line=<STDIN> ; $line =~ /V: (.+?) fps/ ; print $1' `
FPS=`echo "scale=1 ; $FPS/1"| bc -l`
FRAMES=`grep '\[avilib\] V:' $TEMPFOLDER/info | \
perl -e ' $line=<STDIN> ; $line =~ /frames=(\d+)/ ; print $1' `
SEGUNDOS_TOTAL=`echo "scale=0 ; ($FRAMES / $FPS)"| bc -l`
HORAS=`echo "scale=0 ; ($SEGUNDOS_TOTAL / 3600)"| bc -l`
MINUTOS=`echo "scale=0 ; (($SEGUNDOS_TOTAL - 3600 * $HORAS)/60)"| \
bc -l`
SEGUNDOS=`echo "scale=0 ; ($SEGUNDOS_TOTAL % 60)"| bc -l`


echo "*************** FILE INFO ***************"
echo "Frame Size: ${WIDTH}x${HEIGHT} - FPS: $FPS"
echo "Length: $FRAMES - Seconds: $SEGUNDOS_TOTAL"
echo "$HORAS hours, $MINUTOS minutes, $SEGUNDOS seconds"

exit 0

buffer_7
22-12-2005, 13:38
Hi,
ich hoffe mal, daß Du das Prob schon gelöst bekommen hast, wenn nicht versteh ich die Frage nicht,
da Du doch schon eine Variable mit dem Wert Sekunden _Total hast. Das Skript errechnet doch die

$Horas für Stunden
$Minutos für Minuten
$SEGUNDOS für Sekunden

aus der Variable "SEGUNDOS_TOTAL".

Also, brauchst Du doch nur Deine Rechnung mit einer Kopie dieser Variable zu machen.
(Sek_tot=$SEGUNDOS_TOTAL)

oder hab ich das nicht richtig verstanden?

mfg
buffer_7

p.s.: wenn Du das ausrechnen meinst, sollte das das erwünschte Ergebnis bringen:

BITRATE=$(( ( $CDBYTE / $SEGUNDOS_TOTAL -24) *8))

echo "*************** FILE INFO ***************"
echo "Frame Size: ${WIDTH}x${HEIGHT} - FPS: $FPS"
echo "Length: $FRAMES - Seconds: $SEGUNDOS_TOTAL"
echo "Bitrate: $BITRATE"
echo "$HORAS hours, $MINUTOS minutes, $SEGUNDOS seconds"

exit 0

Romanday
25-12-2005, 21:15
Ich habe im I-Net ein Skrip gefunden was divx Film zu svcd umbauen kann.

Wenn es deine Zeit erlaubt, ... > mal die

http://www.linuxfibel.de/bash.htm#builtin

durchlesen, und eine wenig mit der Bash rumspielen.