[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: MP4 Video reduzieren



Le samedi 13 janvier 2018, 22:55:48 CET Manfred Schmitt a écrit :
> Michelle Konzack schrieb:
> > ich versuche vergeblich ein 150 Sekunden Video von 1920x1080 mit 280 MB
> > <http://rustam.alak.tdhome.net/the_accident.html> auf 960x540 und weniger
> > als 30MByte zu kompremieren, scheitere aber daran.
> > 
> > Kann mir bitte jemand ein geeignetes Befehlszeilentool plus die Parameter
> > sagen, das dies ein einem Stück macht?
> 
> Das beste Ergebnis kriegste mittels 2-pass Encoding, siehe ffmpeg-wiki:
> http://trac.ffmpeg.org/wiki/Encode/H.264
> 
> Bitrate ausrechnen:
> $ echo  "(30*8192/150)-128" | bc
> 1510
> 
> Also:
> ffmpeg -y -i "./accident_car_camera_2:30min.mp4" -c:v libx264 -b:v 1510k
> -pass 1 -s 960x540 -c:a copy -f mp4 /dev/null ffmpeg -y -i
> "./accident_car_camera_2:30min.mp4" -c:v libx264 -b:v 1510k -pass 2 -s
> 960x540 -c:a copy out.mp4
> 
> OK, dann ist es doch etwas groesser als 30 MByte, also vielleicht 1500k
> nehmen.
> 
> Und wech,
> Manne


Hallo,

ich benutze folgendes Skript:

==========
#!/bin/bash
if [ -z $1 ] ; then
cat <<EOF
Script d'encodage de fichier. La syntaxe est
   Encode.sh Fichier_du_film.extension Options
Les options sont
DVD  n: DVD n ième chapitre du DVD
Dir  rep: Le miroir du DVD est dans rep
Opts o: Lecture avec les optiosn o
Fvid f: filtrage video (defaut scale=640:496), ça peut permettre de
        rajouter des bandes (expand=0:-100:50:50), etc.
Fson f: filtrage son (defaut rien, mono: mode=3)
Bson n: fixe le bitrate du son à n. (defaut 64)
Bvid n: fixe le bitrate video au lieu qu'il soit calculé
Passe p: indique la passe (0, 1 ou 2, S) défaut 0.
CD n: nombre de CDs 700M voulus (défaut 1).
Taille n: Taille de n MBs (remplace CD).
Avc p: passe des options, (typiquement Avc aspect=16/9)
Haut n: Precise la hauteur en pixel (496 par defaut)
Larg n: Precise la largeur en pixel (680 par defaut)
Garde: laissé seul cela indique que le format (hauteur et largeur) est 
conservé 
Cine: Format 16/9
Tele: Format 4/3
Auto: Detection Format
Srt f: Sous titres fichiers f
EOF
exit 0
fi
NOM=`echo $1 | sed -e 's/\..*//'`
echo $NOM
FILMORG=$1
FILM=../$1
shift
mkdir $NOM.tmp
cd $NOM.tmp
BOUCLE=Go
PASSE=0
CHOIXBITRATE="?"
FILTRE=
RATESON=64
NBCD=1
TAILLE=
OPTIONS=
SRT=
FSON=
#AVCOPTS=":aspect=4/3"
AVCOPTS=
LARGEUR=640
HAUTEUR=496
JOUE="mplayer -vo null -ao null  -frames 1 "
if [ -f BITRATE ] ; then BITRATE=`cat BITRATE` ; fi
while [ $BOUCLE == Go ] ; do

if (echo $1 | grep DVD) > /dev/null ; then
    shift
    FILM=" dvd://$1"
    echo "DVD chapitre: $FILM"
    shift
elif (echo $1 | grep Dir) > /dev/null ; then
    shift
    FILM=" -dvd-device ../$1 "$FILM
    echo "DVD chapitre: $FILM"
    shift
elif (echo $1 | grep Opts) > /dev/null ; then
    shift
    OPTIONS=$1
    echo "Options: $OPTIONS"
    shift
elif (echo $1 | grep Fvid) > /dev/null ; then
    shift
    FILTRE=$1
    echo Filtre video: $FILTRE
#expand=0:-100:50:50,scale=640:480
    shift
elif (echo $1 | grep Bson) > /dev/null ; then
    shift
    RATESON=$1
    echo Bitrate Son: $RATESON
    shift
elif (echo $1 | grep Bvid) > /dev/null ; then
    shift
    BITRATE=$1
    echo Bitrate Video: $BITRATE
    CHOIXBITRATE=Fait
    shift
elif (echo $1 | grep Passe) > /dev/null ; then
    shift
    PASSE=$1
    echo Passe: $PASSE
    shift
elif (echo $1 | grep Taille) > /dev/null ; then
    shift
    TAILLE=$1
    echo Taille voulue: $TAILLE MB
    shift
elif (echo $1 | grep Fson) > /dev/null ; then
    shift
    FSON=:$1
    shift
elif (echo $1 | grep CD) > /dev/null ; then
    shift
    NBCD=$1
    echo Nbre CDs: $NBCD
    shift
elif (echo $1 | grep Avc) > /dev/null ; then
    shift
    AVCOPTS=":"$1
    echo Options AVC: $AVCOPTS
    shift
elif (echo $1 | grep Srt) > /dev/null ; then
    shift
    SRT="-sub "$1" -ffactor 10 -subfont-autoscale 1 -subfont-encoding unicode 
-subcp latin1"
    echo Sous titres: $SRT
    shift
elif (echo $1 | grep Haut) > /dev/null ; then
    shift
    HAUTFORCE=$1
    echo Hauteur Forcee: $HAUTFORCE
    shift
elif (echo $1 | grep Larg) > /dev/null ; then
    shift
    LARGFORCE=$1
    echo Largeur Forcee: $LARGFORCE
    shift
elif (echo $1 | grep Garde) > /dev/null ; then
    shift
    KEEPFORMAT=1
    FORMAT=Auto
elif (echo $1 | grep Cine) > /dev/null ; then
    shift
    FORMAT=16/9
elif (echo $1 | grep Tele) > /dev/null ; then
    shift
    FORMAT=4/3
elif (echo $1 | grep Auto) > /dev/null ; then
    shift
    FORMAT=Auto
else
BOUCLE=Stop
fi
done
echo Passe: $PASSE
echo VBirate: $BITRATE
echo SBitrate: $RATESON
echo FILTRE: $FILTRE
echo Son: $FSON
$JOUE $FILM > Format 2> /dev/null
HAUTBIS=`cat Format | grep "^VO:.*=>"  | tail -n 1 | sed -e 's/^.* \([0-9]*\)x
\([0-9]*\).*=>.*$/\2/'`
LARGBIS=`cat Format | grep "^VO:.*=>"  | tail -n 1 | sed -e 's/^.* \([0-9]*\)x
\([0-9]*\).*=>.*$/\1/'`
HAUTJOUE=`cat Format | grep "^VO:.*=>"  | tail -n 1 | sed -e 's/^.*=> \([0-9]*
\)x\([0-9]*\) .*$/\2/'`
LARGJOUE=`cat Format | grep "^VO:.*=>"  | tail -n 1 | sed -e 's/^.*=> \([0-9]*
\)x\([0-9]*\) .*$/\1/'`
#LAVINFO=`which lavinfo`
#pwd
#if [ ! -z $LAVINFO ] ; then
#    HAUTBIS=`$LAVINFO $FILM 2> /dev/null | grep video_height | sed -e 's/
^.*=//'`
#    LARGBIS=`$LAVINFO $FILM 2> /dev/null | grep video_width | sed -e 's/
^.*=//'`
if [ x$FORMAT = "xAuto" ]  ; then
    if grep -q -E "Movie-Aspect is [0123456789]" Format ; then
	FORMAT=`grep "Movie-Aspect is [0123456789]" Format | grep "Movie-Aspect 
is " | sed -e 's/^·*Movie-Aspect is \(.*\):1.*$/\1/'`
    else
	FORMAT=`expr $LARGJOUE \* 100 / $HAUTJOUE | sed -e 's/\(..\)$/.\1/'` 
    fi    
    echo Format: $FORMAT
fi
echo $LARGBIS x $HAUTBIS
if [ ! -z $KEEPFORMAT ] ; then
    if [ ! -z $HAUTBIS ] ; then
	HAUTEUR=$HAUTBIS
    fi
    if [ ! -z $LARGBIS ] ; then
	LARGEUR=$LARGBIS
    fi
fi
#fi
if [ ! -z $HAUTFORCE ] ; then
    HAUTEUR=$HAUTFORCE
fi
if [ ! -z $LARGFORCE ] ; then
    LARGEUR=$LARGFORCE
fi
echo Format: $LARGEUR x $HAUTEUR
if `echo  $FILTRE | grep -q scale > /dev/null` ; then
    echo Filtre forcé utilisé: $FILTRE
elif [ -z $FILTRE ] ; then
    FILTRE=scale=$LARGEUR:$HAUTEUR
else
    FILTRE=$FILTRE:scale=$LARGEUR:$HAUTEUR
fi
echo Filtre utilisé: $FILTRE
if [ ! -z $FORMAT ] ; then
    if `echo  $AVCOPTS | grep -q aspect > /dev/null` ; then
	echo Format défini dans les options Avc
    else
	AVCOPTS=$AVCOPTS":aspect="$FORMAT
    fi
fi
echo Format: $AVCOPTS
RESULTAT=../E_$NOM.avi
if [ $PASSE == "0" ] ; then
    if [ -f frameno.avi ] ; then
	rm frameno.avi
    fi
    mencoder $FILM $SRT $OPTIONS -ovc frameno  -vf $FILTRE -oac mp3lame -
lameopts vbr=3:br=$RATESON:q=0$FSON -o frameno.avi | tee Son
    PASSE=1
    if [ -f Son ] ; then
	if [ -z $TAILLE ] ; then
	if `grep -q "Recommended video bitrate" Son` ; then
	    if [ $NBCD == "2" ] ; then
		BITRATEOPTIMAL=`grep "bitrate for 2 x 700" Son  | sed -e '1,$s/.* \
([^ ]*\)$/\1/'`
	    else
		BITRATEOPTIMAL=`grep "bitrate for 700" Son  | sed -e '1,$s/.* \([^ 
]*\)$/\1/'`
	    fi
	    echo $BITRATEOPTIMAL > BITRATE
	else
	    if [ $NBCD == "2" ] ; then
		BITRATEOPTIMAL=`grep "itrate.*CD 2 x 700" Son  | sed -e '1,$s/.* \
([^ ]*\)$/\1/'`
	    else
		BITRATEOPTIMAL=`grep "itrate.*CD 700" Son  | sed -e '1,$s/.* \([^ ]*
\)$/\1/'`
	    fi
	    echo $BITRATEOPTIMAL > BITRATE
	fi
	else
	    TAILLEVOULUE=$[$TAILLE*1024*1024]
	    TAILLESON=`cat Son | grep -E "^Audio" | awk '{print $8}'`
	    DUREEVIDEO=`cat Son | grep -E "^Video" | awk '{print $10}' | tr . , |
sed -e 's/,.*$//'`
	    DUREEVIDEO=$[$DUREEVIDEO+1]
	    TAILLEVIDEO=$[$TAILLEVOULUE-$TAILLESON]
	    FLUX=`expr  $TAILLEVIDEO / $DUREEVIDEO `
	    echo $[$FLUX/125] > BITRATE
	fi

    fi
fi
if [ $PASSE == "S" ]  ; then
    if [ ! $CHOIXBITRATE == "Fait" ] ; then
	if [ -f frameno.avi ] ; then
	    rm frameno.avi
	fi
	mencoder $FILM $SRT $OPTIONS -ovc frameno  -vf $FILTRE -oac mp3lame -
lameopts vbr=3:br=$RATESON:q=0$FSON -o frameno.avi | tee Son
    fi
    if [ -f Son ] ; then
	if [ -z $TAILLE ] ; then
	if `grep -q "Recommended video bitrate" Son` ; then
	    if [ $NBCD == "2" ] ; then
		BITRATEOPTIMAL=`grep "bitrate for 2 x 700" Son  | sed -e '1,$s/.* \
([^ ]*\)$/\1/'`
	    else
		BITRATEOPTIMAL=`grep "bitrate for 700" Son  | sed -e '1,$s/.* \([^ 
]*\)$/\1/'`
	    fi
	    echo $BITRATEOPTIMAL > BITRATE
	else
	    if [ $NBCD == "2" ] ; then
		BITRATEOPTIMAL=`grep "itrate.*CD 2 x 700" Son  | sed -e '1,$s/.* \
([^ ]*\)$/\1/'`
	    else
		BITRATEOPTIMAL=`grep "itrate.*CD 700" Son  | sed -e '1,$s/.* \([^ ]*
\)$/\1/'`
	    fi
	    echo $BITRATEOPTIMAL > BITRATE
	fi
	else
	    TAILLEVOULUE=$[$TAILLE*1024*1024]
	    TAILLESON=`cat Son | grep -E "^Audio" | awk '{print $8}'`
	    DUREEVIDEO=`cat Son | grep -E "^Video" | awk '{print $10}' | tr . , |
sed -e 's/,.*$//'`
	    DUREEVIDEO=$[$DUREEVIDEO+1]
	    TAILLEVIDEO=$[$TAILLEVOULUE-$TAILLESON]
	    FLUX=`expr  $TAILLEVIDEO / $DUREEVIDEO `
	    echo $[$FLUX/125] > BITRATE
	fi
    fi
fi
if [ $CHOIXBITRATE == "?" ] ; then
    if [ -f BITRATE ] ; then BITRATE=`cat BITRATE` ; fi
fi
if [ $PASSE == "1" ] ; then
    mencoder $FILM $SRT $OPTIONS -nosound -ovc lavc -vf $FILTRE -lavcopts 
vcodec=mpeg4:vpass=1:vbitrate=$BITRATE:turbo$AVCOPTS -ffourcc DIVX  -o 
$RESULTAT
    PASSE=2
fi
if [ $PASSE == "2" ] ; then
## Passe 2
    mencoder $FILM $SRT $OPTIONS -oac mp3lame -lameopts vbr=3:br=
$RATESON:q=0$FSON -ovc lavc -vf $FILTRE -lavcopts 
vcodec=mpeg4:vpass=2:vbitrate=$BITRATE:vhq:v4mv:trell$AVCOPTS -ffourcc DIVX  -
o $RESULTAT
fi
if [ $PASSE == "S" ] ; then
## Une seule passe 
    mencoder $FILM $SRT $OPTIONS -oac mp3lame -lameopts vbr=3:br=
$RATESON:q=0$FSON -ovc lavc -vf $FILTRE -lavcopts vcodec=mpeg4:vbitrate=
$BITRATE:vhq:v4mv:trell$AVCOPTS -ffourcc DIVX  -o $RESULTAT
fi
cd ..
=======

von einem Franzosen gemacht und teils auf frz. Reduziert Videos auf knapp 700 
MB, ich stelle nachher keinen Qualitätsverlust fest. Gefunden habe ich es auf 
der frz. Debian-user Liste.

Ich bearbeite manchmal Videos mit avidemux. Kann avidemux die Datei nicht 
öffnen, lasse ich encode drüberlaufen, und dann geht's.

Du kannst das Skipt ja eventuell an deine Bedürfnisse anpassen.

tschüss

Klaus


Reply to: