web-dev-qa-db-fra.com

Comment trouver des fichiers multimédia non codés avec un codec spécifique?

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?

2
Elder Geek

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

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.

1
Pavel Sayekat

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 jq1.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) .

1
jfs

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.

1
incBrain