2012-07-13 31 views
9

Estoy escribiendo un script de python para producir podcasts de audio y video. Hay muchos archivos multimedia grabados (audio y video) y archivos de texto que contienen la metainformación.¿Cómo cambiar los metadatos con ffmpeg/avconv sin crear un nuevo archivo?

Ahora quiero programar una función que agregará la información de los archivos de metadatos a todos los archivos multimedia (el original y los convertidos). Porque tengo que manejar muchos formatos de archivo diferentes (wav, flac, mp3, mp4, ogg, ogv ...) sería bueno tener una herramienta que añadir metadatos a formatos arbitrarios.

Mi Pregunta:

¿Cómo puedo cambiar los metadatos de un archivo con ffmpeg/avconv sin cambiar el audio o el vídeo de la misma y sin necesidad de crear un nuevo archivo? ¿Hay otra herramienta de línea de comando/python que me haga el trabajo?

lo que he intentado hasta ahora:

pensé ffmpeg/avconv podría ser una herramienta de este tipo, ya que puede manejar casi todos los formatos de medios. Esperaba que si establecía -i input_file y output_file en el mismo archivo, ffmpeg/avconv sería lo suficientemente inteligente como para dejar el archivo sin cambios. Entonces podría establecer -metadata key=value y solo se cambiarán los metadatos.

Pero noté que si escribo avconv -i test.mp3 -metadata title='Test title' test.mp3 el audio test.mp3 se reconvertirá en otra velocidad de bits.

Así que pensé en usar -c copy para copiar toda la información de audio y video. Por desgracia, también esto no funciona:

:~$ 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 

Usted ve, que no puedo usar -c copy si input_file y output_file son los mismos. Por supuesto que podría producir un archivo temporal:

:-$ avconv -i test.wav -c copy -metadata title='Test title' test_temp.mp3 
:-$ mv test_tmp.mp3 test.mp3 

Pero esta solución crearía (temporalmente) un nuevo archivo en el sistema de ficheros y por lo tanto no es preferible.

Respuesta

5

me preguntó sobre la mailing list of avconv y tiene the following answer:

“No, no es posible [para cambiar los metadatos sin crear un nuevo archivo], ni API libavformat ni avconv diseño permite la edición in situ de archivos."

+0

Winamp lo hace: $ Me pregunto cómo lo están haciendo. –

+0

@NikosBaxevanis Lo más probable es que genere un archivo temporal, elimine el original y cambie el nombre del nuevo. Sobrescribir un archivo mientras lo lee puede causar muchos problemas. Por ejemplo, ffmpeg destruirá su archivo de video si lo hace 'ffmpeg -i video.mkv -c: una copia -c: v copia video.mkv' –

+0

@ColeJohnson ¡Eso es probablemente lo que hace, y lo hace realmente bien! Es interesante para mí, porque incluso si está reproduciendo un archivo multimedia, ¡puede cambiar su etiqueta ID3 sobre la marcha! No estoy seguro si/cómo lo hace copiando en segundo plano, ¡pero Winamp lo hace realmente bien! –

13

Usted puede hacer esto con FFmpeg así:

ffmpeg -i input.avi -metadata key=value -codec copy output.avi 

Ejemplo:

$ 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 

Véase el documentation for -metadata y en stream copying para más información.

Tenga en cuenta también que no todos los formatos permiten establecer metadatos arbitrarios, por ejemplo, Quicktime haciendo -metadata title="my title" hace lo que cabría esperar, pero -metadata foo=bux no hace nada.

+2

En su solución crea un nuevo archivo. ¿Hay alguna manera de crear un nuevo archivo? –

+0

@tampis Me temo que no. – blahdiblah

Cuestiones relacionadas