J'aimerais normaliser ma collection de vidéos sur un codec vidéo spécifique (par exemple, le codec vidéo haute efficacité x265). Je sais que je peux obtenir le codec en cours d'utilisation à partir d'un seul fichier en utilisant par exemple 'mediainfo nom_fichier | grep "Codec ID" 'qui générera le codec vidéo suivi du codec audio pour chaque fichier comme:
Codec ID : V_VP8
Codec ID : A_VORBIS
J'ai examiné man find
mais je n'arrive pas à comprendre comment y parvenir. Des idées?
Vous pouvez obtenir une liste triée de vos fichiers multimédias spécifiques au codec dans le répertoire de travail en
$ mediainfo * | grep -v id_codec | grep .file_extension | cut -f2 -d:> list.txt
où id_codec est le codec en question (ex. h264) et extension_fichier est l'extension du conteneur en question (ex. .mkv)
mais si les noms de fichiers comportent des espaces vides, la commande ne fonctionnera pas comme vous le souhaitez.
Une combinaison de find
, ffprobe
, jq
peut être utilisée pour imprimer des informations sur tous les fichiers *.avi
, *.mp4
(dans l’arborescence de répertoires actuelle de manière récursive) non codés à l’aide du codec vidéo "h264"
:
$ find -name \*.avi -o -name \*.mp4 \
-exec ffprobe -v quiet -show_streams -show_format -of json {} \; |
jq -c '.format.filename as $path |
.streams[]? |
select(.codec_type=="video" and .codec_name!="h264") |
{codec: .codec_name, path: $path}'
Pour installer les utilitaires, exécutez:
$ Sudo apt-get install ffmpeg jq findutils
L'exemple fonctionne sur jq
1.4
. Si apt-get
version fournit une version plus ancienne; vous pourriez télécharger un plus récent binaire jq
(placez simplement le fichier téléchargé quelque part dans $PATH
, renommez-le en jq
et rendez-le exécutable: chmod +x jq
) .
Vous pouvez utiliser ce petit script python avec find pour imprimer tous les fichiers avec un codec spécifique:
filterByCodec.py
import os
import sys
import json
inputPath = sys.argv[1]
codec = sys.argv[2]
type = sys.argv[3]
cmd = 'ffprobe -v quiet -show_streams -print_format json ' + inputPath
output = os.popen(cmd).read()
output = json.loads(output)
if not 'streams' in output:
sys.exit(0)
for stream in output['streams']:
if stream['codec_name'] == codec and stream['codec_type'] == type:
print inputPath
sys.exit(0)
Ceci appellera ffprobe
, stockera sa sortie dans une chaîne json, itérera sur tous les flux et imprimera le chemin d'entrée en cas de correspondance du nom et du type de codec. Vous aurez besoin de ffprobe
pour cela. Vous pouvez l'obtenir sous forme de compilation statique à partir de ici si vous ne l'avez pas installé sur votre système.
Ensuite, vous pouvez l'appeler sur chaque fichier en utilisant find
comme ceci:
find . -type f -exec python filterByCodec.py {} hevc video \;
toutes les vidéos contenant le codec vidéo HEVC seront imprimées. Plus d'exemples:
find . -type f -exec python filterByCodec.py {} h264 video \;
find . -type f -exec python filterByCodec.py {} mp3 audio \;
Vous pouvez étendre le script et déplacer ces fichiers dans un répertoire ou autre. Cela pourrait ressembler à ceci:
cmd = 'mv ' + inputPath + ' onlyhevcDir'
os.system(cmd)
Je sais que ce n'est pas la meilleure façon de le faire, mais utiliser python c'est assez simple à faire.