J'écris un script python pour produire des podcasts audio et vidéo. Il y a un tas de fichiers multimédias enregistrés (audio et vidéo) et des fichiers texte contenant les méta-informations.
Maintenant, je veux programmer une fonction qui ajoutera les informations des fichiers de texte de métadonnées à tous les fichiers multimédias (ceux d'origine et convertis). Parce que je dois gérer de nombreux formats de fichiers différents (wav
, flac
, mp3
, mp4
, ogg
, ogv
...) ce serait formidable d'avoir un outil qui ajoute des métadonnées à des formats arbitraires.
Ma question:
Comment puis-je changer les métadonnées d'un fichier avec ffmpeg/avconv
sans en changer l'audio ou la vidéo et sans créer de nouveau fichier? Existe-t-il un autre outil en ligne de commande/python qui ferait le travail pour moi?
Ce que j'ai essayé jusqu'à présent:
J'ai pensé ffmpeg/avconv
pourrait être un tel outil, car il peut gérer presque tous les formats de médias. J'espérais que si je mettais -i input_file
et le output_file
dans le même fichier, ffmpeg/avconv
sera suffisamment intelligent pour laisser le fichier inchangé. Ensuite, je pourrais définir -metadata key=value
et seules les métadonnées seront modifiées.
Mais j'ai remarqué que si je tape avconv -i test.mp3 -metadata title='Test title' test.mp3
l'audio test.mp3
sera reconverti dans un autre débit binaire.
J'ai donc pensé à utiliser -c copy
pour copier toutes les informations vidéo et audio. Malheureusement, cela ne fonctionne pas non plus:
:~$ du -h test.wav # test.wav is 303 MB big
303M test.wav
:~$ avconv -i test.wav -c copy -metadata title='Test title' test.wav
avconv version 0.8.3-4:0.8.3-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the
Libav developers
built on Jun 12 2012 16:37:58 with gcc 4.6.3
[wav @ 0x846b260] max_analyze_duration reached
Input #0, wav, from 'test.wav':
Duration: 00:29:58.74, bitrate: 1411 kb/s
Stream #0.0: Audio: pcm_s16le, 44100 Hz, 2 channels, s16, 1411 kb/s
File 'test.wav' already exists. Overwrite ? [y/N] y
Output #0, wav, to 'test.wav':
Metadata:
title : Test title
encoder : Lavf53.21.0
Stream #0.0: Audio: pcm_s16le, 44100 Hz, 2 channels, 1411 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Press ctrl-c to stop encoding
size= 896kB time=5.20 bitrate=1411.3kbits/s
video:0kB audio:896kB global headers:0kB muxing overhead 0.005014%
:~$ du -h test.wav # file size of test.wav changed dramatically
900K test.wav
Vous voyez, que je ne peux pas utiliser -c copy
si input_file
et output_file
sont identiques. Bien sûr, je pourrais produire un fichier temporaire:
:-$ avconv -i test.wav -c copy -metadata title='Test title' test_temp.mp3
:-$ mv test_tmp.mp3 test.mp3
Mais cette solution créerait (temporairement) un nouveau fichier sur le système de fichiers et n'est donc pas préférable.
J'ai demandé sur liste de diffusion d'avconv et obtenu la réponse suivante :
„Non, il n'est pas possible [de changer les métadonnées sans créer un nouveau fichier], ni l'API libavformat ni la conception avconv ne permettent l'édition sur place des fichiers.“
Vous pouvez le faire avec FFmpeg comme ceci:
ffmpeg -i input.avi -metadata key=value -codec copy output.avi
Exemple:
$ du -h test.mov
27M test.mov
$ ffprobe -loglevel quiet -show_format out.mov | grep title # nothing found
$ ffmpeg -loglevel quiet -i test.mov -codec copy -metadata title="My title" out.mov
$ du -h out.mov
27M out.mov
$ ffprobe -loglevel quiet -show_format out.mov | grep title
TAG:title=My title
Voir la documentation pour -metadata
et sur copie de flux pour plus d'informations.
Notez également que tous les formats ne permettent pas de définir des métadonnées arbitraires, par exemple pour Quicktime faisant -metadata title="my title"
fait ce que vous attendez, mais -metadata foo=bux
ne fait rien.
Étant donné que la modification des métadonnées modifiera la longueur du fichier, et je m'attends à ce que les métadonnées soient proches du début du fichier, l'audio et la vidéo commenceraient à un décalage différent du début du fichier. Vous ne pouvez donc pas modifier les métadonnées sans d'abord créer un fichier temporaire, puis renommer les fichiers après.
Si les nouvelles métadonnées étaient exactement de la même taille, et vous savez où se trouvaient les métadonnées dans le conteneur (fichier) vous pourriez pouvoir utilisez un éditeur hexadécimal quelconque pour remplacer simplement les caractères. Bonne chance avec ça.
Aussi. vous pourriez être en mesure de mettre directement en place des données plus courtes si vous remplissez de valeurs nulles, mais cela pourrait être problématique pour certains joueurs.