Nous compterons les images et leur volumétrie avant d'encoder en h.264
export jour="2017-08-15" echo "$(ls $jour | wc -l) photos" && du -sh $jour | awk '{print $1"o"}' && du -s $jour | awk '{print $1" octets"}' 8466 photos 40Go 41220124 octets
Cas d'usage: montage d'un timelapse de plusieurs milliers de photos dans un dossier
time ffmpeg -framerate 10 -f image2 -pattern_type glob -i $jour/'*.JPG' -r 10 -c:v libx264 -s hd1080 9.mp4 real 74m43,036s user 145m8,072s sys 1m4,452sInspiré de cet article et les options y sont expliquées, sinon man ffmpeg..
ffmpeg -framerate 10 -f image2 -start_number 42 -i G00%d.JPG -c:v libx264 -s hd1080 9.mp4
Concaténation de plusieurs vidéos de même encodage:
# via un fichier for f in ./*.mp4; do echo "file '$f'" >> liste.txt; done ffmpeg -f concat -safe 0 -i liste.txt -c copy final.mp4 # directement ffmpeg -safe 0 -f concat -i <(find . -type f -name '*.mp4' -printf "file '$PWD/%p'\n" | sort) -c copy final.mp4Voir doc et des commentaires
#!/bin/bash # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # Auteur : Xanatos # License : GPL-V3 - voir https://www.gnu.org/licenses/quick-guide-gplv3.html # Nom: duration.sh # Version : 0.1 # Date création : 10/06/17 # Date MAJ : 10/06/17 # Description : Ce script parcrous le dossier donné en paramètre # utilise ffmpeg pour récupérer la durée d'un fichier vidéo # utilise du pour connaitre sa taille # en sortie nous aurons le cumul des temps, taille et quantité # Dépendances : ffmpeg, du, find, bc, sed, grep, cut, awk # Entrée(s) : # Sortie(s) : console # Usage : ./duration.sh un_dossier/ chemin="$1" debut="$2" fin="$3" suffixe="$4" fichier="$(echo "$chemin" | cut -f1 -d".")" extension="$(echo "$chemin" | cut -f2 -d".")" fichier_cut="$fichier$suffixe.$extension" ffmpeg -i "$chemin" -vcodec copy -acodec copy -ss "$debut" -to "$fin" "$fichier_cut" exit 0Exemples en sortie:
~$ /opt/cut.sh ~/20170818_110425.MOV 00:01:40 00:03:45 _1 ffmpeg version 3.2.5-1 Copyright (c) 2000-2017 the FFmpeg developers built with gcc 6.3.0 (Debian 6.3.0-18) 20170516 configuration: --prefix=/usr --extra-version=1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libebur128 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared libavutil 55. 34.101 / 55. 34.101 libavcodec 57. 64.101 / 57. 64.101 libavformat 57. 56.101 / 57. 56.101 libavdevice 57. 1.100 / 57. 1.100 libavfilter 6. 65.100 / 6. 65.100 libavresample 3. 1. 0 / 3. 1. 0 libswscale 4. 2.100 / 4. 2.100 libswresample 2. 3.100 / 2. 3.100 libpostproc 54. 1.100 / 54. 1.100 Guessed Channel Layout for Input Stream #0.1 : stereo Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/USEER/20170818_110425.MOV': Metadata: major_brand : qt minor_version : 0 compatible_brands: qt creation_time : 2017-08-18T11:04:25.000000Z Duration: 00:04:19.00, start: 0.000000, bitrate: 31456 kb/s Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 30039 kb/s, 60 fps, 60 tbr, 60k tbn, 120k tbc (default) Metadata: creation_time : 2017-08-18T11:04:25.000000Z handler_name : iCatch Alias Data Handler encoder : iCatch AVCC Stream #0:1(eng): Audio: pcm_s16le (sowt / 0x74776F73), 44100 Hz, stereo, s16, 1411 kb/s (default) Metadata: creation_time : 2017-08-18T11:04:25.000000Z handler_name : iCat Alias Data Handler Output #0, mov, to '/home/USER/20170818_110425_1.MOV': Metadata: major_brand : qt minor_version : 0 compatible_brands: qt encoder : Lavf57.56.101 Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, q=2-31, 30039 kb/s, 60 fps, 60 tbr, 60k tbn, 60k tbc (default) Metadata: creation_time : 2017-08-18T11:04:25.000000Z handler_name : iCatch Alias Data Handler encoder : iCatch AVCC Stream #0:1(eng): Audio: pcm_s16le (sowt / 0x74776F73), 44100 Hz, stereo, 1411 kb/s (default) Metadata: creation_time : 2017-08-18T11:04:25.000000Z handler_name : iCat Alias Data Handler Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #0:1 -> #0:1 (copy) Press [q] to stop, [?] for help frame= 0 fps=0.0 q=-1.0 size= 0kB time=00:00:00.00 bitrate=N/A speed= frame= 0 fps=0.0 q=-1.0 size= 0kB time=00:00:00.00 bitrate=N/A speed= frame= 700 fps=466 q=-1.0 size= 45104kB time=00:00:11.85 bitrate=31181.0kbitsframe= 2212 fps=1105 q=-1.0 size= 140531kB time=00:00:37.05 bitrate=31072.4kbitframe= 3658 fps=1462 q=-1.0 size= 232576kB time=00:01:01.15 bitrate=31157.2kbitframe= 4384 fps=1461 q=-1.0 size= 279122kB time=00:01:13.25 bitrate=31215.9kbitframe= 4976 fps=1420 q=-1.0 size= 317509kB time=00:01:23.11 bitrate=31293.8kbitframe= 5762 fps=1414 q=-1.0 size= 367583kB time=00:01:36.21 bitrate=31296.4kbitframe= 6538 fps=1428 q=-1.0 size= 417772kB time=00:01:49.15 bitrate=31354.9kbitframe= 6708 fps=1321 q=-1.0 size= 428465kB time=00:01:51.99 bitrate=31341.1kbitframe= 7488 fps=1417 q=-1.0 Lsize= 478603kB time=00:02:04.99 bitrate=31367.5kbits/s speed=23.7x video:456891kB audio:21533kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.037355%
#!/bin/bash # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # Auteur : Xanatos # License : GPL-V3 - voir https://www.gnu.org/licenses/quick-guide-gplv3.html # Nom: duration.sh # Version : 0.1 # Date création : 10/06/17 # Date MAJ : 10/06/17 # Description : Ce script parcrous le dossier donné en paramètre # utilise ffmpeg pour récupérer la durée d'un fichier vidéo # utilise du pour connaitre sa taille # en sortie nous aurons le cumul des temps, taille et quantité # Dépendances : ffmpeg, du, find, bc, sed, grep, cut, awk # Entrée(s) : # Sortie(s) : console # Usage : ./duration.sh un_dossier/ # Temps total T=0 # Nombre de fichiers NB=0 # Taille totale SI=0 # Cherchons tout les fichiers dont le mimetype est vidéo find "$1" -type f -exec file -i {} + | sed -n '/video/s/:[^:]\+$//p' | \ { # et redirection du résultat dans une boucle while read -r chemin do # ffmpeg et isolation de l'attribut Duration et convertision en secondes d="$(ffmpeg -i "$chemin" 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,// | \ awk '{ split($1, A, ":"); print 3600*A[1] + 60*A[2] + A[3] }')" # bc pour additioner des float c="$(bc <<< "$T"+"$d")" T="$c" # du pour récupérer la taille du fichier ((SI+="$(du -s "$chemin" | cut -f1)")) # et on compte ((NB++)) done # verbeux echo -e "\ $NB fichiers $SI octets, soit: $(bc <<< "scale=2;($SI/1000000)") Go. Temps cumulé: $T secondes soit: \c" # split SSS.MMS en 2 variables MMS="$(echo "$T" | cut -f2 -d".")" T="$(echo "$T" | cut -f1 -d".")" # conversion en DD:HH:MM:SS:MMS D=$((T/60/60/24)) H=$((T/60/60%24)) M=$((T/60%60)) S=$((T%60)) (( D > 0 )) && echo -e "$D jours \c" (( H > 0 )) && echo -e "$H heures \c" (( M > 0 )) && echo -e "$M minutes \c" (( D > 0 || H > 0 || M > 0 )) && echo -e "$S secondes \c" (( D > 0 || H > 0 || M > 0 || MMS > 0)) && echo "$MMS millisecondes" } exit 0Exemples en sortie:
$ ./duration.sh Nouveau\ dossier/ 3 fichiers 573232 octets, soit: .57 Go. Temps cumulé: 131.06 secondes soit: 2 minutes 11 secondes 06 millisecondes $ ./duration.sh 2017-06-09/ 42 fichiers 23043816 octets, soit: 23.04 Go. Temps cumulé: 5044.18 secondes soit: 1 heure 24 minutes 4 secondes 18 millisecondes
Je possède un casque FPV Eachine qui permet de faire des DVR (Direct Video Recorder).
En voulant partager sur Mega; j'utilise un compte gratuit de 25Go qui sert exclusivement à ce genre de partage et surtout permet le streaming; je m'apperçois que la vidéo ne se lit pas en streaming avec le lecteur intégré, seulement le son et sur un DVR le son c'est les parasite des fréquences…
Fouinons…
$ ffmpeg -hide_banner -i PICT0045.AVI [avi @ 0x557325e6ac80] non-interleaved AVI Guessed Channel Layout for Input Stream #0.1 : mono Input #0, avi, from 'PICT0045.AVI': Duration: 00:02:58.39, start: 0.000000, bitrate: 7963 kb/s Stream #0:0: Video: mjpeg (Baseline) (MJPG / 0x47504A4D), yuvj420p(pc, bt470bg/unknown/unknown), 720x480, 7779 kb/s, 25.06 fps, 25.06 tbr, 25.06 tbn, 25.06 tbc Stream #0:1: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 8000 Hz, mono, s16, 128 kb/s At least one output file must be specifiedMJPEG, connait pas et puis le “non-interleaved AVI”
$ ffmpeg -hide_banner -i RC_VID_0000.MOV [mov,mp4,m4a,3gp,3g2,mj2 @ 0x556598d6cc80] st: 0 edit list: 1 Missing key frame while searching for timestamp: 2000 [mov,mp4,m4a,3gp,3g2,mj2 @ 0x556598d6cc80] st: 0 edit list 1 Cannot find an index entry before timestamp: 2000. Guessed Channel Layout for Input Stream #0.1 : stereo Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '../2020-07-23_mission_epave/RC_VID_0000.MOV': Metadata: major_brand : qt minor_version : 0 compatible_brands: qt creation_time : 2015-04-27T12:34:35.000000Z Duration: 00:03:28.00, start: 0.000000, bitrate: 21745 kb/s Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 20047 kb/s, 30 fps, 30 tbr, 60k tbn, 120k tbc (default) Metadata: creation_time : 2015-04-27T12:34:35.000000Z handler_name : Video Handler encoder : iCatch AVCC Stream #0:1(eng): Audio: pcm_s16le (sowt / 0x74776F73), 44100 Hz, stereo, s16, 1411 kb/s (default) Metadata: creation_time : 2015-04-27T12:34:35.000000Z handler_name : Audio Handler At least one output file must be specifiedJe n'ai pas trouvé les formats supportés par le lecteur intégré de Mega, je sais par expérience que le 2e fichier réencodé en h.264 en conteneur AVI passe.
$ ffmpeg -i PICT0045.AVI -c:v libx264 -an test.mp4 # encodage en 1 passe en h.264, le crf par défaut de 23 et suppression piste audio avec -an $ ffmpeg -i PICT0045.AVI -pix_fmt yuv420p -b:v 4000k -c:v libx264 -an testchroma.mp4 # encodage en 1 passe en h.264, crf par défaut, suppression piste audio et modification chromaPour la 2e solution c'est suite à une recherche
The usual reason for this is the pixel format. The MJPEG may have 4:2:2 or 4:4:4 chroma sampling which most players don't support in H264. So try
Source
Le chrominance est la balance des couleurs et de la luminosité encodées dans une image, un bonne explication, c'est ce qui semble coincer.
La commande réduit au passge le poids des vidéos d'un facteur de 1.6-1.8 environ, la qualité semble la même, sur 720×480 cela suffit amplement, ce sont des DVR…
Et la commande qui va bien pour traiter en boucle dans le dossier courrant en concervant le nom d'origine:
for file in *.AVI ; do name=`echo "$file" | cut -d'.' -f1` ; echo "$name" ; ffmpeg -loglevel panic -i "$file" -pix_fmt yuv420p -b:v 4000k -c:v libx264 -an "${name}.mp4" ; done && notify-send 'Transcodage fini' --icon=dialog-information