Mes scripts à base de ffmpeg

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;

Par Bidouille De Bian

Bidouilleur sur Linux Debian 10 (Buster). Débutant dans le blog sur Wordpress.

Créez votre site Web avec WordPress.com
Commencer
%d blogueurs aiment cette page :