Définitions des valeurs de résolution en pixels
http://icar.cnrs.fr/projets/corvis/qualiteSDHD.html
# définition: largeur x hauteur
#
# 480p SD DVD 720 x 480
# c'est une valeur historique batarde car
# en 4/3 ça devrait être 640 x 480
# en 16/9 ça devrait être 854 x 480
#
# 720p HD 1280 x 720 pixels 16/9
# appelation commerciale: HDTV, HD 720p, 720p, HD Ready
# On peut réduire à 640 x 360 pour diminuer la taille du fichier
#
# 1080p Full HD 1920 x 1080 pixels 16/9
# appelation commerciale: HDTV 1080p, HD 1080p, 1080p, Full HD
#
Limitation de l’utilisation de la cpu pour ffmpeg
cpulimit -P /usr/bin/ffmpeg -l 60
A propos de cpulimit https://www.howtoforge.com/how-to-limit-cpu-usage-of-a-process-with-cpulimit-debian-ubuntu
ça me permets d’éviter que le P.C ne se mette à trop chauffer.
converth264.sh
On calcule une proportion 16/9 à partir de la hauteur du fichier d’origine.
16/9=1,777777778
#!/bin/bash
#set -x
#
nom=$1
file=${nom%???}
#
cpulimit -P /usr/bin/ffmpeg -l 75&
#
# calcul de la proportion 16/9 à partir de la hauteur
#
height=$(ffprobe -v error -select_streams v:0 -show_entries stream=height -of default=nw=1:nk=1 "$nom")
echo "hauteur du film original = " $height
width=$(echo "scale=0; ($height*1.777777778)/1" | bc -l)
echo "largeur calculée = " $width
if [ $(($width%2)) -eq 0 ]
then
echo "nombre pair."
else
echo "nombre impaire."
width=$((width+1))
echo "largeur recalculée = " $width
fi
echo "traitement du fichier" "$file"$height"x"$width"-h264-aac.mp4
/usr/bin/ffmpeg -hide_banner -threads 1 -i "$nom" -map_metadata -1 -metadata author="Debian" -vcodec libx264 -filter:v scale=w=$width:h=$height -profile:v baseline -pix_fmt yuv420p -c:a aac -ar 44100 -filter:a loudnorm -movflags +faststart -r 25 "$file"$height"x"$width"-h264-aac.mp4
#
notify-send --icon=/usr/share/pixmaps/debian-logo.png ' conversion h264 terminée'
killall cpulimit
Conversion en 720p
#!/bin/bash
#set -x
#
nom=$1
file=${nom%???}
#
cpulimit -P /usr/bin/ffmpeg -l 75&
#
# HD 1280x720
height=720
width=1280
echo "traitement du fichier" "$file""$height"x"$width"-h264-aac.mp4
#
/usr/bin/ffmpeg -hide_banner -threads 1 -i "$nom" -map_metadata -1 -metadata author="Debian" -vcodec libx264 -filter:v scale=w=$width:h=$height -profile:v baseline -pix_fmt yuv420p -c:a aac -ar 44100 -filter:a loudnorm -movflags +faststart -r 25 "$file""$height"x"$width"-h264-aac.mp4
#
notify-send --icon=/usr/share/pixmaps/debian-logo.png ' conversion 720 terminée'
#
killall cpulimit
converth265.sh
#!/bin/bash
#set -x
#
#
file=$1
echo "traitement du fichier" $file
# 640x360 smartphone
# 1280x720 -filter:v scale=w=1280:h=720 -profile:v main -pix_fmt yuv420p
#time ffmpeg -hide_banner -i "$file" -map_metadata -1 -c:v libx265 -preset faster -filter:v scale=w=640:h=360 -profile:v main -pix_fmt yuv420p -c:a aac "H265_$file"
# -c:v libx265 -s 1280x720 -preset slow -profile:v main -x265-params keyint=48:min-keyint=48:scenecut=0:ref=5:bframes=3:b-adapt=2:bitrate=1000:vbv-maxrate=1100:vbv-bufsize=4000
#
# sans changement de taille
time ffmpeg -hide_banner -i "$file" -map_metadata -1 -c:v libx265 -preset faster -profile:v main -pix_fmt yuv420p -c:a aac "H265_$file".mp4
notify-send --icon=/usr/share/pixmaps/debian-logo.png ' conversion h265 terminée'
ffprobe -hide_banner "H265_$file".mp4
SVCD et DVD
#!/bin/bash
#set -x
#
#encodage
#ffmpeg codec taille trame fps vidéo kbps audio
#pal-svcd MPEG-2 480 x 576 25 2500 mp2, 44100 Hz, stereo, s16, 224 kb/s
#
#pal-dvd MPEG-2 720 x 576 25 6000 ac3, 48000 Hz, stereo, fltp, 448 kb/s
#
#file=$1
#
nom=$1
file=${nom%???}
echo "traitement du fichier" "$file".mpg
#
cpulimit -P /usr/bin/ffmpeg -l 75&
#
/usr/bin/ffmpeg -hide_banner -i "$nom" -map_metadata -1 -target pal-svcd "$file".mpg
#
notify-send --icon=/usr/share/pixmaps/debian-logo.png ' conversion dvd terminée'
killall cpulimit
joint.sh
#!/bin/bash
# renommer les fichiers sur 4 chiffres de 0001 à 0459 avant de construire le fichier pour ffmpeg
#for f in ./*.ts; do echo "file '$f'" >> mylist.txt; done
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.ts
mylist.txt
file './0001.ts'
file './0002.ts'
file './0003.ts'
file './0004.ts'
file './0005.ts'
colle.sh
#!/bin/bash
#set -x
#
file=$1
ffmpeg -hide_banner -i "$file".m4a -i "$file".mp4 -map_metadata -1 -c copy -ss 0 "$file"-ff.mp4
Sous-titrage d’une vidéo avec les sous-titres fournis par youtube ou arte.
On utilise gnome-subtitles et yt-dlp
On édite le fichier .vtt pour vérifier sa stucture afin que ffmpeg puisse le convertir en .srt
Un fichier correcte ne contient que le tag WEBVTT et les sous-titres:
WEBVTT
00:00:03.880 --> 00:00:05.600 line:91% align:center
La moisson a été inexistante.
00:00:06.240 --> 00:00:10.120 line:83% align:center
C'était tellement sec
que rien ne pouvait pousser.
On affiche gnome-subtitles pour vérifier que ça se présente bien, et faire les corrections syntaxiques et orthographiques.
Dans les deux cas faire save et quitter pour continuer subvid.
Contenu d’un fichier subvid.sh, attention aux { } , au » » et au ‘ ‘ c’est subtil.
#!/bin/bash
#set -x
#
# Paramètre à fournir: url de la video youtube
#
# exemple subvid https://www.youtube.com/watch?v=hBefLptZ2T
#
url="$1"
#echo $url
# Récupération du titre
#
nom=$(yt-dlp -e $url);
echo nom de la vidéo----- $nom
sub=${nom:0:5}
echo Nom des fichiers temporaires----- $sub
#
# Téléchargement de vidéo meilleure format mp4 et des sous-titres anglais dans deux fichiers
# on ne garde que le debut comme nom
# listage des sous-titres
#
yt-dlp --ignore-config --list-subs "$url"
yt-dlp --ignore-config --list-formats "$url"
#
echo -n "Entrez la valeur de la variable 'langue ou Entree si aucune valeur': "
read langue
echo -n "Entrez la valeur de la variable 'format' {un ou plusieurs avec un +): "
read format
# telechargement du format
#
yt-dlp --ignore-config --no-mtime -o "$sub".mp4 -f "$format" "$url"
#
if [ -z "$langue" ];
then
mv "$sub".mp4 "$nom".mp4
echo "fichier téléchargé: " "$nom".mp4
#
else
# téléchargement des sous-titres langue à adapter selon ce qui existe
#
yt-dlp --ignore-config --no-mtime -o "$sub" --write-subs --write-auto-subs --sub-langs "$langue" --skip-download "$url"
#
# conversion des sous-titres
/usr/bin/gedit "$sub"."$langue".vtt
ffmpeg -hide_banner -loglevel panic -y -i "$sub"."$langue".vtt "$sub".srt
/usr/lib/x86_64-linux-gnu/gnome-subtitles/gnome-subtitles.exe "$sub".srt 2> /dev/null
#
# Incrustation des sous-titres dans la vidéo en police de caractères Georgia jaune taille 26
#
echo "CREATION DU FICHIER: " "$nom"-st-"$langue".mp4
cpulimit -P /usr/bin/ffmpeg -l 75&
ffmpeg -hide_banner -loglevel warning -stats -y -i "$sub".mp4 -vf "subtitles='$sub.srt':force_style='FontName=Georgia,Fontsize=26,PrimaryColour=&H0000FFFF&'" -map_metadata -1 -c:a copy "$nom"-st-"$langue".mp4
#
# On tire la chasse en sortant des toilettes
#
rm "$sub"."$langue".vtt
rm "$sub".srt
rm "$sub".mp4
killall cpulimit
fi
Exemple
subvid https://www.youtube.com/watch?v=5TqetBMBTww
nom de la vidéo----- Angèle - Démons feat. Damso [ CLIP OFFICIEL ]
Nom des fichiers temporaires----- Angèl
[youtube] 5TqetBMBTww: Downloading webpage
[youtube] 5TqetBMBTww: Downloading android player API JSON
[info] Available automatic captions for 5TqetBMBTww:
...
...
[info] Available formats for 5TqetBMBTww:
ID EXT RESOLUTION FPS CH │ FILESIZE TBR PROTO │ VCODEC VBR ACODEC ABR ASR MORE INFO
...
...
Entrez la valeur de la variable 'langue ou Entree si aucune valeur': fr
Entrez la valeur de la variable 'format' {un ou plusieurs avec un +): 18
[youtube] 5TqetBMBTww: Downloading webpage
[youtube] 5TqetBMBTww: Downloading android player API JSON
[info] 5TqetBMBTww: Downloading 1 format(s): 18
[download] Destination: Angèl.mp4
[download] 100% of 20.44MiB in 00:17 at 1.19MiB/s
[youtube] 5TqetBMBTww: Downloading webpage
[youtube] 5TqetBMBTww: Downloading android player API JSON
[info] 5TqetBMBTww: Downloading 1 format(s): 248+251
[info] Writing video subtitles to: Angèl.fr.vtt
[download] Destination: Angèl.fr.vtt
[download] 100% of 5.77KiB in 00:00 at 78.33KiB/s
...
...
CREATION DU FICHIER: Angèle - Démons feat. Damso [ CLIP OFFICIEL ]-st-fr.mp4
Process 5595 detected
frame= 6770 fps= 17 q=-1.0 Lsize= 24834kB time=00:04:30.86 bitrate= 751.1kbits/s speed=0.665x
Process 5595 dead!
Warning: no target process found. Waiting for it...
Exiting...
Sous-titrage d’une vidéo dont on possède déjà les fichiers .mp4 et .srt
#!/bin/bash
#set -x
#
#
echo 'Donnez le nom du fichier sans extension, (mp4 et srt doivent exister)'
echo 'Exemple: Elisa, Matilda De Angelis - Litoranea '
read nom
#echo "$nom"
echo "Donnez la taille de la police"
read size
echo "Donnez la position du texte: haut ou bas"
read pos
echo Création du fichier "$nom"-st-"$size"-"$pos".mp4
if [ $"$pos" = bas ]
then
ffmpeg -hide_banner -i "$nom".mp4 -vf "subtitles='$nom'.srt:force_style='FontName=Georgia,Fontsize="$size",PrimaryColour=&H0000FFFF&'" -map_metadata -1 -c:a copy "$nom"-st-"$size"-"$pos".mp4
else
# en haut
ffmpeg -hide_banner -i "$nom".mp4 -vf "subtitles='$nom'.srt:force_style='Alignment=6,FontName=Georgia,Fontsize="$size",PrimaryColour=&H0000FFFF&'" -map_metadata -1 -c:a copy "$nom"-st-"$size"-"$pos".mp4
fi;