Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 15/03/2010, à 22:43

lateo

[script] modifier la taille d'un fichier mkv (réencoder)

Ci dessous un script pas encore tout à fait fonctionnel pour réencoder un fichier mkv.

C'est pas de moi, j'ai récupéré des trucs à droite à gauche, corrigé des commandes plus à jour, et commencé à emballer tout ça dans un script.
/!\ C'est pas fini! mais je n'y touche plus depuis un moment (pb de temps + flemme) alors je vous confie le bébé en l'état, en espérant que qqun aide à l'accouchement wink

0. le principe
on choppe la piste son qui nous intéresse, on essaie de la transformer en AAC 256kbps
on choppe la piste vidéo, on la réencode (redimensionnement auto, etc.) pour que l'ensemble audioAAC+video soit un peu plus petit que la taille demandée (et donc assurer le coup pour ceux qui veulent graver).
C'est un essai, je ne suis ni pro de l'encodage en général, ni des params de mencoder en particulier, alors que ceux qui savent corrigent le truc comme il se doit.
Mon but personnel était de réduire des fichiers de 15-25Go à une taille acceptable pour moi, autour de 7.5Go par vidéo. maintenant je me doute que ce genre de jouet intéressera les amateurs de gravure sur DVD, d'où la précision 'taille DVD' dans un des "echo".

1. les dépendances (j'ai p'tet oublié 2-3 trucs, mais le principal est là)

sudo apt-get install mkvtoolnix mplayer mencoder mencoder-mt gpac bc ffmpeg

"mencoder-mt" est sympa pour ceux qui ont des processeurs avec plusieurs coeurs, mais pas obligatoire, 'suffit de modifier par "mencoder" dans le script pour faire sans.

2. le bouzin (remkv.sh)

#!/bin/bash

txt_b=$(tput setaf 4);		# ${txt_b}
txt_v=$(tput setaf 2);		# ${txt_v}
txt_r=$(tput setaf 1);		# ${txt_r}
txt_rst=$(tput sgr0);   	# ${txt_rst}


echo "${txt_rst}Fichier à réencoder? (chemin complet)${txt_r}"
read MKVFILE

echo "${txt_rst}Le fichier contient les pistes suivantes:${txt_v}"
mkvmerge -i "$MKVFILE"

echo "${txt_rst}Numéro de la piste AUDIO à conserver?${txt_r}"
read MKVAUDIOTRACK
echo ${txt_v}
mkvextract tracks "$MKVFILE" $MKVAUDIOTRACK:audio.tmp
echo "${txt_rst}Conversion de la piste en AAC 256k..."
ffmpeg -i "audio.tmp" -ab 256k -ac 2 "audio.m4a" -y
AUDIOSIZE=$(stat -c%s audio.m4a) 
echo "Taille= "$AUDIOSIZE

echo "${txt_rst}Infos sur le fichier:"
mplayer -identify -v -frames 0 "$MKVFILE" 2>/dev/null | grep '^\[mkv\]' |     egrep 'duration|Track type: Video|Pixel width|Pixel height'
echo "${txt_rst}durée? (première valeur)${txt_r}"
read DURATION
echo "${txt_rst}fps arrondi? (piste audio, généralement: 23.976)${txt_r}"
read FPSAPPROX
plop=`echo "$FPSAPPROX*1001" | bc`
echo "${txt_rst}entre la valeur suivante, arrondie au supérieur:" $plop  ${txt_r}
read FPS
plop=`echo "$FPS*1000" | bc`
MFPS=$plop/1001
echo "${txt_rst}largeur? (width)${txt_r}"
read WIDTH
echo "${txt_rst}hauteur? (height)${txt_r}"
read HEIGHT

echo "${txt_rst}Numéro de la piste VIDEO? (généralement: 1)"
read MKVVIDEOTRACK
mkvextract tracks "$MKVFILE" $MKVVIDEOTRACK:video.h264 2>/dev/null
VIDEOSIZE=$(stat -c%s video.h264)
BITRATE=$(echo "scale=2; $VIDEOSIZE * 8 / $DURATION / 1000" | bc) 
echo "${txt_rst}Bitrate= "$BITRATE " kbit/s"

echo "${txt_rst}Taille maxi souhaitée du fichier réencodé? (DVD=4680000000, soit ~4.7Go)"
read MAXTARGETSIZE
MAXVIDEOSIZE=$(expr $MAXTARGETSIZE - $AUDIOSIZE)
echo "${txt_rst}Taille maxi pour la vidéo= "$MAXVIDEOSIZE " bytes"
NEWBITRATE=$(echo "scale=6; tmp = $BITRATE * $MAXVIDEOSIZE / $VIDEOSIZE + 0.5; scale=0; tmp / 1" | bc)
echo "${txt_rst}Nouveau bitrate= "$NEWBITRATE " kbit/s"

RATIO=$(echo "scale=3; $BITRATE / sqrt ( $WIDTH * $HEIGHT )" | bc)
ASPECTRATIO=$(echo "scale=6; $WIDTH / $HEIGHT" | bc)
echo "${txt_rst}Ratio original= " $ASPECTRATIO
NEWHEIGHT=$(echo "scale=6; tmp = $NEWBITRATE / ( $RATIO * sqrt( $ASPECTRATIO ) ); scale=0; (tmp + 8) / 16 * 16" | bc)
NEWWIDTH=$(echo "scale=6; tmp = $NEWHEIGHT * $ASPECTRATIO; scale=0; tmp / 16 * 16" | bc)
echo "${txt_rst}Nouvelles dimentions= "$NEWWIDTH " x " $NEWHEIGHT
NEWASPECTRATIO=$(echo "scale=6; $NEWWIDTH / $NEWHEIGHT" | bc); 
echo "${txt_rst}Nouveau ratio= " $NEWASPECTRATIO

CROP=$(echo "scale=6; tmp = $WIDTH - $NEWASPECTRATIO * $HEIGHT + 0.5; scale=0; tmp / 1" | bc)
LEFTCROP=$(echo "scale=0; $CROP / 2" | bc)
     CROPPEDWIDTH=$(echo "$WIDTH - $CROP" | bc)
echo "${txt_rst}Découpe nécessaire: " $CROP " pixels."

echo "${txt_rst}Encodage, passe 1/3..."
mencoder-mt "$MKVFILE" -vf crop=$CROPPEDWIDTH:$HEIGHT:$LEFTCROP:0,scale=$NEWWIDTH:$NEWHEIGHT,hqdn3d=2:1:2 -ovc x264 \
    -x264encopts subq=6:partitions=all:8x8dct:me=umh:frameref=5:bframes=3:b_pyramid=normal:weight_b:threads=auto:bitrate=$NEWBITRATE:pass=1 \
    -of rawvideo -ofps $MFPS -mc 0 -noskip -nosound -o /dev/null 
echo "${txt_rst}Encodage, passe 2/3..."
mencoder-mt "$MKVFILE" -vf crop=$CROPPEDWIDTH:$HEIGHT:$LEFTCROP:0,scale=$NEWWIDTH:$NEWHEIGHT,hqdn3d=2:1:2 -ovc x264 \
    -x264encopts subq=6:partitions=all:8x8dct:me=umh:frameref=5:bframes=3:b_pyramid=normal:weight_b:threads=auto:bitrate=$NEWBITRATE:pass=3 \
    -of rawvideo -ofps $MFPS -mc 0 -noskip -nosound -o /dev/null 
rm -f video.h264
echo "${txt_rst}Encodage, passe 3/3..."
mencoder-mt "$MKVFILE" -vf crop=$CROPPEDWIDTH:$HEIGHT:$LEFTCROP:0,scale=$NEWWIDTH:$NEWHEIGHT,hqdn3d=2:1:2 -ovc x264 \
    -x264encopts subq=6:partitions=all:8x8dct:me=umh:frameref=5:bframes=3:b_pyramid=normal:weight_b:threads=auto:bitrate=$NEWBITRATE:pass=3 \
    -of rawvideo -ofps $MFPS -mc 0 -noskip -nosound -o video.h264 

echo "${txt_rst}Transformation en mp4..."
rm -f video.mp4
MP4Box -fps $FPS -add video.h264 video.mp4

echo "${txt_rst}Reconstruction du mkv..."
mkvmerge -o $MKVFILE -a 0 -D -S audio.m4a -d 1 -A -S video.mp4 --track-order 0:0,1:1

si vous arrivez à un truc qui tourne, ce serait sympa de me prévenir : lateonet_chez_gmail(point)com
bon amusement, ++

Dernière modification par lateo (Le 15/03/2010, à 22:58)

Hors ligne

#2 Le 01/04/2010, à 16:03

lateo

Re : [script] modifier la taille d'un fichier mkv (réencoder)

personne pour reprendre ce p'tit bout de code? hmm

Hors ligne