Convertir formatos de video y copiar etiquetas con ffmpeg

He estado tratando de convertir algunos videos que tomé con mi cámara a un formato comprimido para ahorrar espacio de almacenamiento. Descubrí cómo usar ffmpeg para convertir los videos al formato que quiero, pero lo que no he podido averiguar es cómo copiar los metadatos. Me gustaría copiar los metadatos originales de cuando se tomó el video (lo más importante, el tiempo de creación). Intenté ejecutar ffmpeg usando la opción -map_meta_data 0:0, pero eso no pareció funcionar. ¿Algunas ideas?

Parece que los datos que quiero copiar en este caso están en la sección de formato del video. Usando ffprobe con la opción show_format, obtengo este resultado:

[FORMAT]
filename=video.AVI
nb_streams=2
format_name=avi
format_long_name=AVI format
start_time=0.000000
duration=124.565421
size=237722700
bit_rate=15267331
TAG:creation_time=2012-02-07 12:15:27
TAG:encoder=CanonMVI06
[/FORMAT]

Me gustaría copiar las dos etiquetas en mi nuevo video.

preguntado el 29 de julio de 12 a las 02:07

3 Respuestas

Echa un vistazo a la documentación sobre volcado y carga de metadatos:

FFmpeg puede volcar metadatos de archivos multimedia en un archivo de texto similar a INI con codificación UTF-8 simple y luego volver a cargarlo usando el muxer/demuxer de metadatos.

El proceso podría ser algo como esto:

# First extract metadata
ffmpeg -i original.mov -f ffmetadata metadata.txt
# Next, transcode, including extracted metadata
ffmpeg -i original.mov -f ffmetadata -i metadata.txt compressed.mp4

No tengo un video lleno de metadatos para probar en este momento, pero algo así debería funcionar.

Respondido 29 Jul 12, 05:07

Parece que debería funcionar, pero cuando extraigo los metadatos, la etiqueta de tiempo de creación no se extrae. Esto es todo lo que se guarda en el archivo, lo que también podría explicar por qué la opción map_meta_data no funcionaba: ;FFMETADATA1 encoder=CanonMVI06 - Scott

@Scott De hecho, podría. Aunque es completamente poco elegante y no debería ser necesario, intenté usar ffprobe y grep para obtener el tiempo de creación y luego configurarlo directamente en la salida usando -metadata? - blahdiblah

Esto todavía no funcionó del todo, pero me apuntó en la dirección correcta. Finalmente, noté que salía un mensaje cuando ejecuté el comando ffmpeg que decía que stfptime no estaba disponible (he estado tratando de hacer esto en Windows). Resulta que, dado que esa biblioteca no estaba disponible en Windows, la fecha nunca se colocó en los metadatos. Por lo tanto, intenté convertir mis videos en Linux donde stfptime está disponible, y las opciones map_metadata y ffmetadata funcionaron para guardar la etiqueta creation_time en los metadatos del video. - Scott

El último comando no funcionará. Porque no le dijiste al ffmpeg qué metadatos debería elegir. necesita usar -map_metadata 1 para seleccionar la segunda entrada como metadatos. - Wang

Use "-map_metadata 0:g" para copiar todo global metadatos

0 significa Entrada #0. g significa global metadatos

Aquí está mi resultado de ffprobe. ¡disfrutar!

entrada.mp4

[FORMAT]
filename=input.mp4
nb_streams=2
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=60.560500
size=190252680
bit_rate=25132246
probe_score=100
TAG:major_brand=mp42
TAG:minor_version=1
TAG:compatible_brands=mp42avc1
TAG:creation_time=2016-05-14 10:01:17
[/FORMAT]

salida.mp4

[FORMAT]
filename=output.mp4
nb_streams=2
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=60.632000
size=38636429
bit_rate=5097826
probe_score=100
TAG:major_brand=isom
TAG:minor_version=512
TAG:compatible_brands=isomiso2avc1mp41
TAG:creation_time=2016-05-14 01:01:17
TAG:encoder=Lavf57.36.100
[/FORMAT]

contestado el 21 de mayo de 16 a las 09:05

Para escribir todos los metadatos (globales, video, audio) en un archivo, use

ffmpeg -i in.mp4 -c copy -map_metadata 0 -map_metadata:s:v 0:s:v -map_metadata:s:a 0:s:a -f ffmetadata in.txt

Para agregar todos los metadatos de un archivo, use

ffmpeg -i in.mp4 -f ffmetadata -i in.txt -c copy -map_metadata 1 out.mp4

contestado el 29 de mayo de 18 a las 09:05

Estoy intentando esto y vuelve a codificar todo el archivo, ¿se esperaba eso? ¿Hay un cambio para tal vez solo insertar los metadatos? Por cierto, lo que quiero es leer la información del video (altura del cuadro, ancho, velocidad, etc.), con ffmpeg or ffprobey guárdelo en los metadatos del archivo de video. - André Levy

No, no se espera volver a codificar. -c copy debería copiar. - franco breitling

No sé si está recodificado, para ser sincero, pero lo que veo es que se arrastra por todo el video, minuto a minuto. ¿Es eso lo que -c copy se supone que debe hacer? Por cierto, descubrí que mi problema no era que faltaran los metadatos en los archivos, sino que Windows no lee de forma nativa los metadatos de los archivos mkv en su sistema de archivos, como lo hace con mp4. Los códecs Shark007 arreglaron eso (y posiblemente me dieron otros problemas). - André Levy

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.