Bonjour,
Ce script encode tous les titres de plus de 2 secondes sur un DVD-vidéo avec HandBrakeCLI. (Le GUI Handbrake le fait, mais pas en automatique.)
- Je ne compresse pas la vidéo.
- Je garde le même bitrate, que je prends en info sur chaque titre pour le porter dans la commande. Ainsi, je ne me pose plus la question du "mieux".
- j'ai mis un style de comparateur "
lsdvd VS dvdnav" pour détecter des incohérences sur d'éventuelles bandes audios à "o ko" et traiter tous ça. (C'est rare mais ça arrive)
- Il sortira le mkv en français et ses sous-titres fr. Si ce n'est pas possible, il le sortira en "VO" avec des sous-titres fr, si il y en a.
- J'ai choisi
nvenc_h265 mais comme je n'ai mis aucune option à part le bitrate automatique et mes filtres fétiches, on pourra changer ce choix facilement.
Mais avec nvenc_h265 je suis à 300 fps d'encodage tout de même et 13 minutes de "RIP/encodage" sur un film de 1H06. Au niveau taille, c'est un peu plus petit que la taille originale.
Chez moi, ça passe à peu près sur tous mes dvds.
- Une option pour la sauvegarde du LPCM sur un DVD concert est présente dans ce script. Handbrake ne gère pas le direct copy sur un lpcm, il l'encode par défaut en aac. (C'est bien dommage)
- Les chapitres, c'est lui qui gère. (Rien à rajouter)
- Je ne retouche pas les couleurs. (pas de filtre hue)
- Si le nommage automatique du titre ne convient pas, on peut en choisir un autre plus perso maintenant.
- Dans le nommage aussi, j'ai rajouté les langues présente dans la vidéo encodée.
## x264
## x264_10bit
## nvenc_h264
## x265
## x265_10bit
## x265_12bit
## nvenc_h265
## mpeg4
## mpeg2
## VP8
## VP9
## theora
Donc en résumé :
sont à adapter comme vous le voudrez.
Les paquets à installer :
apt install ffmpeg handbrake-cli mkvmerge mplayer lsdvd mediainfo
Le script: post #227
Majoration (22/01/2020)
#!/bin/bash
## Anonyme
## sudo pacman -S ffmpeg handbrake-cli mkvtoolnix-cli mplayer lsdvd mediainfo
## x264
## x264_10bit
## nvenc_h264
## x265
## x265_10bit
## x265_12bit
## nvenc_h265
## mpeg4
## mpeg2
## VP8
## VP9
## theora
PATH=$PATH:/sbin:/usr/sbin
## CONDITION : UN SEUL DVD-VIDÉO.
mapfile -t BLKID < <(blkid /dev/sr* |sed -E 's/^([^:]+): .*/\1/')
if [[ "${#BLKID[@]}" -eq "0" ]] ; then
echo "Aucun DVD trouvé: abandon"
exit 0
fi
idx=0
for dev in "${BLKID[@]}"; do
mnt=$(mount |sed -n -E "s/^${dev//\//\\\/} on (.*) type .*\$/\\1/p")
[[ -z "$mnt" ]] && continue
if [[ -f "$mnt/VIDEO_TS/VIDEO_TS.IFO" ]]; then
DEVICES[$idx]="$dev"
MOUNT_POINTS[$idx]="$mnt"
idx=$((idx+1))
fi
done
if [[ "${#DEVICES[@]}" -eq 0 ]]; then
echo "Aucun dvd vidéo monté : Abandon"
exit 0
elif [[ "${#DEVICES[@]}" -gt 1 ]]; then
echo "Il y a plus d'un dvd video détecté : Abandon"
exit 0
fi
DEVICE=${DEVICES[0]}
MOUNT_POINT=${MOUNT_POINTS[0]}
## LABEL DVD-VIDÉO & NOMBRE TOTAL DE TITRES SUR CELUI-CI.
idx=0
TITLE_COUNT=0
regexp='^Title: '
while read -r line; do
idx=$((idx+1))
if [[ "$idx" -eq 1 ]]; then
TITLE=${line#*: }
elif [[ "$line" =~ $regexp ]]; then
TITLE_COUNT=$((TITLE_COUNT+1))
fi
done < <(lsdvd "$DEVICE" 2>/dev/null)
unset regexp dev mnt idx BLKID DEVICES MOUNT_POINTS
if [[ -z "$TITLE" ]]; then
echo "Pas de dvd vidéo trouvé : abandon"
exit 0
fi
echo "Proceed..."
echo "DVD-Vidéo : $TITLE"
read -r -p "Ce nom convient-il ? [Y/n] " input
case $input in
[yY][eE][sS]|[yY])
echo "Yes"
mkdir -p "$TITLE/IFOS"
;;
[nN][oO]|[nN])
echo "No"
read -p "Entrer un nouveau nom: " TITLE
mkdir -p "$TITLE/IFOS"
;;
*)
echo "Invalid input..."
echo "Quit"
exit 1
;;
esac
for (( i=1; i<=TITLE_COUNT; i++ ))
do
## TITRES D4UNE DURÉE ÉGALE OU PLUS DE .... SECONDES [ ICI, 2 SECONDES]
LENGTH=$(mplayer -noconfig all -nocache -vo null -ao null -frames 0 -identify -dvd-device "$DEVICE" dvdnav://"$i" 2>/dev/null | \
sed -E -n 's/^.*ID_LENGTH=([0-9]+).*$/\1/p')
LIMIT=5
[[ "$LENGTH" -le "$LIMIT" ]] && continue
## FRAMES 15
COUNT_AUDIO_MPLAYER=$(mplayer -noconfig all -nocache -vo null -ao null -frames 15 -identify -dvd-device "$DEVICE" dvdnav://"$i" 2>/dev/null | grep -c "AUDIO:")
## POUR N'AVOIR QUE LE FRANÇAIS.
AUDIO_FRENCH=$(lsdvd -a "$DEVICE" -t "$i" 2> /dev/null | grep "Language: fr" | awk '{print$4}' )
COUNT_AUDIO_FRENCH=$(lsdvd -a "$DEVICE" -t "$i" 2> /dev/null |grep -c 'Language: fr')
AUDIO_LANG_LIST_FRENCH=$(echo $AUDIO_FRENCH | sed 's/[[:blank:]]/,/g')
## ICI BITRATE ET RATIO ORIGINAUX.
BITRATE=$(mplayer -noconfig all -nocache -vo null -ao null -frames 0 -identify -dvd-device "$DEVICE" dvdnav://"$i" 2>/dev/null | \
grep "VIDEO:" | awk '{print$8}' | sed 's/\.[^ ]*/ /g')
RATIO=$(lsdvd -x $DEVICE -t "$i" | grep -m1 "Aspect ratio:" | awk '{print$11}' | sed -e 's/\//\:/g' | tr -d ',')
## ENCODAGE DE TOUS LES TITRES DU DVD-VIDÉO.
if [[ "$COUNT_AUDIO_MPLAYER" -ge "0" ]]; then
HandBrakeCLI --no-dvdnav \
--input $DEVICE --title $i \
--all-audio --all-subtitles --subtitle-lang-list fr \
-e nvenc_h265 -b $BITRATE --loose-anamorphic --modulus 2 \
--hqdn3d=y-spatial=1.5:cb-spatial=1.5:cr-spatial=1.5:y-temporal=4:cb-temporal=4:cr-temporal=4 --unsharp=y-strength=0.5:y-size=5:cb-strength=0.5:cb-size=5 \
--crop 0:0:0:0 \
--aencoder copy \
--output "$TITLE/$i-$TITLE.mkv"
### SI LE TITRE N'A PAS D'AUDIO, ON NE FRANCHIRA PAS LES ÉTAPES SUIVANTES.
fi
## AUDIO(S) INDIQUÉS PAR LSDVD ET AUDIO(S) INDIQUÉS PAR FFPROBE EN CIBLANT KB/S.
COUNT_AUDIO=$(lsdvd -a "$DEVICE" -t "$i" 2> /dev/null |grep -c 'Audio:')
#COUNT_VALID_AUDIO=$(ffprobe "$TITLE/$i-$TITLE.mkv" 2>&1 | awk '/Audio:/ && /Stream/ && /ac3,/ && /kb\/s/ { print $2 }'| cut -c4-4 | wc -w)
COUNT_VALID_AUDIO=$(ffprobe "$TITLE/$i-$TITLE.mkv" 2>&1 | awk '/Audio:/ && /Stream/ && /kb\/s|\(LC),/ { print $2 }'| cut -c4-4 | wc -w)
## UN OU PLUSIEURS STREAMS AUDIO.
if [[ "$COUNT_AUDIO_MPLAYER" -ge "1" ]] && [[ -e "$TITLE/$i-$TITLE.mkv" ]] && [[ "$COUNT_AUDIO" != "$COUNT_VALID_AUDIO" ]] ; then
#### VÉRIFICATION ET REJET DES STREAMS AUDIOS INVALIDES (AU CAS OÙ).
DETECT_VALID_AUDIO=$(ffprobe "$TITLE/$i-$TITLE.mkv" 2>&1 | awk '/Audio:/ && /Stream/ && /kb\/s|\(LC),/ { print $2 }'| cut -c4-4)
VALID_AUDIO_PREPARE=$(echo $DETECT_VALID_AUDIO | sed -e 's/\ /\,/g' >> "$TITLE/$i-choix.txt")
VALID_AUDIO=$(head -n 1 "$TITLE/$i-choix.txt" | tail -n 1)
mkvmerge -o "$TITLE/$i-$TITLE-[vérifié].mkv" --atracks $VALID_AUDIO "$TITLE/$i-$TITLE.mkv"
mv "$TITLE/$i-$TITLE-[vérifié].mkv" "$TITLE/$i-$TITLE.mkv"
#rm -f "$TITLE/$i-choix.txt"
fi
## CETTE ÉTAPE NE SERA UTILISÉE QUE SI IL Y A QU'UN SEUL STREAM AUDIO ET SANS INFO SUR LE LANGUAGE. ON NE PARLE PAS ICI DE (XX ou UNKNOWN)
COUNT=$(mplayer -vo null -ao null -frames 0 -identify "$TITLE/$i-$TITLE.mkv" 2>/dev/null | grep -c "aid")
NULL_INFO=$(mplayer -vo null -ao null -frames 0 -identify "$TITLE/$i-$TITLE.mkv" 2>/dev/null | \
awk '/alang/ { print $9 }' | wc -w)
if [[ -e "$TITLE/$i-$TITLE.mkv" ]] && [[ "$COUNT" -eq "1" ]] && [[ "$NULL_INFO" -eq "0" ]] ; then
mkvpropedit "$TITLE/$i-$TITLE.mkv" --edit track:a1 --set language=und
fi
## CETTE ÉTAPE NE SERA UTILISÉE QUE SI IL Y A UN OU PLUSIEURS STREAMS AUDIOS FR AVEC DES STREAMS AUDIOS ETRANGERS (POUR NE LAISSER QUE CELLES-CI).
## SI IL N'Y A QUE DU FRANÇAIS, CETTE OPTION NE SERA PAS UTILISÉE.
VERIF_AUDIO_ALL=$(mplayer -vo null -ao null -frames 0 -identify "$TITLE/$i-$TITLE.mkv" 2>/dev/null | \
grep -c "alang")
VERIF_AUDIOFR=$(mplayer -vo null -ao null -frames 0 -identify "$TITLE/$i-$TITLE.mkv" 2>/dev/null | \
grep -c "alang fre,")
if [[ -e "$TITLE/$i-$TITLE.mkv" ]] && [[ "$VERIF_AUDIOFR" -ge "1" ]] && [[ "$VERIF_AUDIO_ALL" != "$VERIF_AUDIOFR" ]] ; then
mkvmerge -o "$TITLE/$i-$TITLE-[Language: Français].mkv" -a fre "$TITLE/$i-$TITLE.mkv"
rm -f "$TITLE/$i-$TITLE.mkv"
mv "$TITLE/$i-$TITLE-[Language: Français].mkv" "$TITLE/$i-$TITLE.mkv"
fi
## CETTE ÉTAPE NE SERA UTILISÉE QUE SI IL Y A UN STREAM AUDIO AU FORMAT LPCM.
## DUMPAUDIO ET SAUVEGARDE DU LPCM EN WAVE D'UN DVD DE CONCERT LIVE.
AIDS_LPCM=$(lsdvd -a "$DEVICE" -t "$i" 2>/dev/null | awk '/lpcm|id:/ { print $22 }')
COUNT_AUDIO_LPCM=$(lsdvd -a "$DEVICE" -t "$i" 2>/dev/null | grep -c "lpcm" )
if [[ -e "$TITLE/$i-$TITLE.mkv" ]] && [[ "$COUNT_AUDIO_LPCM" -ge "1" ]]; then
mkdir -p "$TITLE/WAVE"
for n in $AIDS_LPCM; do
mplayer -noconfig all -nocache -benchmark -vc null -vo null \
-ao pcm:fast:file="$TITLE/WAVE/[$i-($n)]-$TITLE.wav" \
-identify -dvd-device "$DEVICE" dvdnav://$i -ni -aid $n
done
fi
## ON INDIQUE LA LANGUE DE L'AUDIO DANS LE RENOMAGE DU TITRE ET LE NOMBRE.
INFO=$(mplayer -vo null -ao null -frames 0 -identify "$TITLE/$i-$TITLE.mkv" 2>/dev/null | \
awk '/alang/ { x = x $9 ""}
END { sub(/,*$/, "", x); print x }')
COUNT_INFO=$(mplayer -vo null -ao null -frames 0 -identify "$TITLE/$i-$TITLE.mkv" 2>/dev/null | grep -c "alang")
COUNT=$(mplayer -vo null -ao null -frames 0 -identify "$TITLE/$i-$TITLE.mkv" 2>/dev/null | grep -c "aid")
## UNE OU PLUSIEURS INFOS SUR L'AUDIO ET UN OU PLUSIEURS AUDIOS.
if [[ -e "$TITLE/$i-$TITLE.mkv" ]] && [[ "$COUNT_INFO" -ge "1" ]] && [[ "$COUNT" -ge "1" ]] ; then
mv "$TITLE/$i-$TITLE.mkv" "$TITLE/$i-$TITLE-[Audio: $INFO].mkv"
mediainfo "$TITLE/$i-$TITLE-[Audio: $INFO].mkv" >> "$TITLE/IFOS/$i-$TITLE-[Audio: $INFO].log"
fi
## PAS D'INFO ET UN SEUL AUDIO.
if [[ -e "$TITLE/$i-$TITLE.mkv" ]] && [[ "$COUNT_INFO" -eq "0" ]] && [[ "$COUNT" -eq "1" ]] ; then
mv "$TITLE/$i-$TITLE.mkv" "$TITLE/$i-$TITLE-[Audio: und].mkv"
mediainfo "$TITLE/$i-$TITLE-[Audio: und].mkv" >> "$TITLE/IFOS/$i-$TITLE-[Audio: und].log"
fi
## PAS D'AUDIO DONC PAS D'INFO.
if [[ -e "$TITLE/$i-$TITLE.mkv" ]] && [[ "$COUNT_INFO" -eq "0" ]] && [[ "$COUNT" -eq "0" ]] ; then
mv "$TITLE/$i-$TITLE.mkv" "$TITLE/$i-$TITLE-[Audio: nosound].mkv"
mediainfo "$TITLE/$i-$TITLE-[Audio: nosound].mkv" >> "$TITLE/IFOS/$i-$TITLE-[Audio: nosound].log"
fi
done
Voilà
Dernière modification par Anonyme (25-04-2020 10:45:48)