#! /bin/bash
IFS=$'\n'
option_F_found=0
option_T_found=0usage()
{
echo "usage: ./subtitles.sh -f [srt file] -t '[+/- time]'"
echo "ex : ./subtitles.sh -f /home/std/lecuisinierlevoleursafemmeetsonamant.srt -t '- 18.100'"
echo "ex : ./subtitles.sh -f /home/std/lecuisinierlevoleursafemmeetsonamant.srt -t '+ 18.100'"
echo ""
exit 3
}while getopts f:t: OPTNAME; do
case "$OPTNAME" in
f)
FILE="$OPTARG"
option_F_found=1
;;t)
TIME="$OPTARG"
option_T_found=1
;;*)
usage
;;
esac
doneif [ "$option_F_found" -eq "0" ] || [ "$option_T_found" -eq "0" ]; then
usage
fiFunctionDuration()
{
duration_temp=$(date -d "1983-12-12 $1" "+%s.%3N")
duration_diff=$(echo "scale=3; $duration_temp $TIME" | bc -l)
duration_dest=$(date -d"@$duration_diff" "+%H:%M:%S,%3N")
echo "$duration_dest"
}for i in $(grep -E "[0-9]{2}:[0-9]{2}\,[0-9]{3}" "$FILE");
do
A=$(echo "$i" | sed 's/\([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\,[0-9]\{3\}\) --> \([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\,[0-9]\{3\}\)/\1/')
B=$(echo "$i" | sed 's/\([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\,[0-9]\{3\}\) --> \([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\,[0-9]\{3\}\)/\2/')
VAL1=$(FunctionDuration "$A")
VAL2=$(FunctionDuration "$B")
echo "working on $A --> $B"
sed -i "s/$i/$VAL1 --> $VAL2/" "$FILE"
done
video
Ripper un DVD
Le seul préalable :
# apt install ffmpeg
Tout d'abord, on concatène les fichiers VOB qui nous intéresse après avoir monter le DVD :
# mount /dev/sr0 /mnt
$ cat /mnt/VIDEO_TS/VTS_01_1.VOB /mnt/VIDEO_TS/VTS_01_2.VOB /mnt/VIDEO_TS/VTS_01_3.VOB /mnt/VIDEO_TS/VTS_01_4.VOB > /home/user/Vidéos/monfilm.VOB
On repère les flux vidéos (généralement le 1), audios et sous-titres :
$ ffmpeg -i monfilm.VOB
Le flux vidéo est généralement le premier, on repère ensuite les flux audio et le flux de sous-titre si besoin. Ici, on suppose que l flux video est 0:1, les flux audios 0:10 (cantonnais) et 0:11 (français). Le flux sous-titre est le 0:3.
On encode ainsi :
$ ffmpeg -i monfilm.VOB -map 0:1 -map 0:10 -map 0:11 -map 0:3 -c:v libx264 -preset slow -crf 16 -c:a copy -c:s copy -metadata:s:a:0 language=yue -metadata:s:a:1 language=fra -metadata:s:s:0 language=fra mon_film.mp4
-map 0:1 donne l'ordre des flux de la future vidéo. Le premier flux sera la vidéo (flux 0:1 du DVD), le deuxième sera l'audio en cantonnais (flux 0:10) puis l'audio en français (0:11) et enfin les sous-titres (0:3).
-c:v libx264 : le codec vidéo sera h264
-c:a copy : on copie le flux audio
-c:s copy : on copie le flux de sous-titres
-preset veryslow : vitesse d'encodage, inversement proportionnelle à la qualité de l'image. Les options sont : ultrafast, superfast, fast, medium, slow, slower, veryslow. Medium est le réglage par défaut.
-crf : définit le niveau de qualité (q). L'échelle va de 0 à 51 (petit nombre = + de temps de calcul)
-metadata:s:a:0 : définit la metadata du flux audio 0 (a:0) avec language =yue (cantonnais), même chose pour le a:1 en français
-metadata:s:s:0 définit la langue des sous-titres (français)
Puis, en dernier, le nom du fichier en sortie.
Une alternative pour encoder en bitrate variable et en deux passes :
ffmpeg -i input.VOB -c:v libx264 -b:v 2000k -pass 1 -an -f null /dev/null && ffmpeg -i input.VOB -c:v libx264 -b:v 2000k -pass 2 -c:a aac-b:a 128k c:s copy output.mp4
En cas d'erreur, remplacer -na par -vsync cfr
La doc complète : https://ffmpeg.org/documentation.html dont le wiki : https://trac.ffmpeg.org/
Une autre doc : https://forum.hardware.fr/hfr/VideoSon/Traitement-Video/encodage-ffmpeg-dummies-sujet_154546_1.htm
Encodage de sous-titres (Handbrake défaillant)
Sur ubuntu :
apt install ffmpeg ogmrip tesseract-ocr tesseract-ocr-fra subtitleeditor
Disposer des infos avec ffmpeg :
ffmpeg -i VTS_01_1.VOB
Récupérer les .idx et .sub pour le titre 1:
mencoder dvd://1 -nosound -ovc frameno -o /dev/null -vobsuboutindex 0 -sid 0 -vobsubout nom_du_fichier
Le sid est la piste à lire, elle sera passée en sid 0 par l'instruction vobsuboutindex.
Script d'ocr (Tesseract.sh) à placer dans le dossier (le paquet tesseract-ocr-fra est nécessaire):
#!/bin/bash
NPROC=$(nproc --all| awk '{ print $1 - 1 }') # Set number of processor
for fichier in *.tif
do
(
echo "$fichier"
tesseract "$fichier" "$fichier" -l fra --psm 6 &>/dev/null
) &
if [[ $(jobs -r -p | wc -l) -gt $NPROC ]]; then
wait -n
fi
done
wait
Création des fichiers tiff et du xml indexé :
subp2tiff --sid=0 -n nom_du_fichier
On lance le script qui va océriser les fichiers:
./Tesseract.sh
C'est long.
On assemble les fichiers txt et l'index xml :
subptools -s -w -t srt -i nom_du_fichier.xml -o nom_du_fichier.srt
Normalement, le tour est joué.
Concaténer des vidéos
Tout simplement avec la commande cat !
cat film1.avi film2.avi film3.avi > gros_film.avi
Simple, efficace. Ne fonctionne pas avec les mkv, bien sûr.
Capture d'écran video
Un exemple de ligne de commande :
ffmpeg -s 1920x1080 -r 25 -f x11grab -i :0.0 -f mp4 video.mp4