web-dev-qa-db-fra.com

Comment changer les métadonnées avec ffmpeg / avconv sans créer de nouveau fichier?

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.

20
Stephan Kulla

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.“

12
Stephan Kulla

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.

24
blahdiblah

É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.

1
Cool Javelin