107 votes

Récupérer et enregistrer les métadonnées des médias en utilisant FFmpeg

Je veux lire les métadonnées dans les fichiers multimédias, puis enregistrer ces métadonnées dans un fichier texte/xml, afin de pouvoir ensuite insérer ces données dans ma base de données. Je préférerais utiliser ffmpeg.

Est-il également possible de faire la même chose avec MediaInfo?? Je sais que je peux obtenir les métadonnées pour des pistes individuelles en utilisant MediaInfo, mais je voudrais automatiser cela ; c'est-à-dire que chaque fois qu'un nouveau fichier multimédia est trouvé, lire ses métadonnées et les stocker dans un fichier txt/xml.

Ou, existe-t-il un autre outil/utilitaire/API que je peux utiliser pour cela?

1voto

Vinod KC Points 23

Suppose que j'ai besoin du nombre de trames et de la durée. Pour obtenir cela avec MediaInfo en ligne de commande, utilisez ce code. MediaInfo --inform="Video;%FrameCount%,%Duration/String4%" nomdelavideo.mp4

La sortie ressemblera à ceci - 63525,00:42:21:00

0voto

Donut Points 1

Je combine bash, ffmpeg, sed pour écrire dans un fichier uniquement les informations métadonnées de base qui m'intéressent : type de fichier et nom, titre(s), détails des flux vidéo, audio et sous-titres. Un seul fichier ou tous les fichiers dans un dossier. Linux. Seulement testé sur une poignée de vidéos mkv au fait.

script: ffmpeg_metadata.sh
fichier de sortie: ffmpeg_metadata.txt

Les commandes sed font toutes sortes de choses pour 'purifier' la sortie ffmpeg donnée.

Voici non pas l'ensemble du script mais le code qui fait des choses (j'espère que cela rend bien, car j'ai eu des problèmes avec les sauts de ligne dans ce post)...

echo -e "Nom(s) de fichier (spécifique ou générique,
pas d'espaces ou de caractères spéciaux, sauf '-' '_')?"

read -p "" INPUT

echo

for i in ${INPUT}; do ffmpeg -i "$i" -hide_banner; done |& tee ./ffmpeg_metadata.txt

sed -r -i "/Input|title|Stream/!d;s/[[:space:]]*[[:space:]]/ /g;s/^[[:space:]]//g;s/[[:space:]]:/:/g;s/Input/\n&/g;1i METADONNÉES MULTIMÉDIA" ./ffmpeg_metadata.txt

le /Input|title|Stream/!d dit : ne supprimez pas les lignes contenant exactement ces mots aka chaînes. Autrement dit, gardez uniquement ces lignes.

Ici, pour deux fichiers mkv, cela donne :

METADONNÉES MULTIMÉDIA

Input #0, matroska,webm, depuis 'film1.mkv':
title: film1
Stream #0:0: Video: h264 (High), yuv420p(progressive), 1276x686 \[SAR 1:1 DAR 638:343\], SAR 343:359 DAR 638:359, 23.97 fps, 23.97 tbr, 1k tbn, 47.94 tbc (default)
title: film1\_Track
Stream #0:1: Audio: aac (LC), 48000 Hz, stereo, fltp (default)
title: film1\_Track

Input #0, matroska,webm, depuis 'film2.mkv':
title: film2
Stream #0:0: Video: h264 (High), yuv420p(tv, bt709, progressive), 640x360 \[SAR 1:1 DAR 16:9\], 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
title: film2\_Track
Stream #0:1(eng): Audio: aac (LC), 44100 Hz, stereo, fltp (default)
title: film2\_Track
Stream #0:2(eng): Subtitle: ass (default)
title: film2\_Track
Stream #0:3(es): Subtitle: subrip (default)
title: film2\_Track

Pourrait être encore réduit en laissant de côté le mot 'title' dans sed. Donc, seulement le nom de fichier et les flux. Ou, par exemple, on pourrait ajouter les lignes contenant le mot 'Duration', qui incluent également le débit binaire. Etcetera, etcetera. Le jour où le développement de ffmpeg commence à épeler des mots différemment, ce script devra aussi être réécrit :-D

Au revoir (non inclus dans le fichier de sortie ;-) )!

0voto

Aurelien Points 163

Lors de la conversion de vidéos de H.265 à H.264, j'ai trouvé que la meilleure solution est de combiner ffmpeg et exiftool. Convertissez d'abord la vidéo :

ffmpeg -i input.mp4 -vcodec libx264 -acodec aac output.mp4

Ensuite, importez les métadonnées du fichier d'entrée au fichier de sortie :

exiftool -tagsFromFile input.mp4 -all:all output.mp4

L'option -all:all est importante lorsque vous transférez des métadonnées de vidéos créées par des produits Apple, sinon le temps ne correspondrait pas. Plus de détails sur la FAQ officielle.

Astuce : pour éviter de créer un fichier _original, ajoutez simplement l'option -overwrite_original.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X