Cuando simplemente estoy copiando a.MOV (desde mi iPhone) a c.MOV, ffmpeg suelta una gran cantidad de metadatos (incluida la hora y la ubicación del video).

Intenté -metadata, pero ffmpeg aún elimina la información (parece que los metadatos no se eliminan cuando ffmpeg imprime Output #0, pero se elimina cuando uso ffprobe para ver los metadatos del archivo de salida)

¿Qué debo hacer para forzar a ffmpeg a conservar estos metadatos?

$ ffmpeg -i a.MOV -c copy c.MOV -y Input #0, mov,mp4,m4a,3gp,3g2,mj2, from "a.MOV": Metadata: major_brand : qt minor_version : 0 compatible_brands: qt creation_time : 2018-03-... com.apple.quicktime.location.ISO6709: .../ com.apple.quicktime.make: Apple com.apple.quicktime.model: iPhone ... com.apple.quicktime.software: 11.... com.apple.quicktime.creationdate: 2018-03-... Duration: 00:00:01.77, start: 0.000000, bitrate: 7868 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, 7707 kb/s, 30 fps, 30 tbr, 600 tbn, 1200 tbc (default) Metadata: creation_time : 2018-03-... handler_name : Core Media Data Handler encoder : H.264 Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 87 kb/s (default) Metadata: creation_time : 2018-03-... handler_name : Core Media Data Handler Stream #0:2(und): Data: none (mebx / 0x7862656D), 0 kb/s (default) Metadata: creation_time : 2018-03-... handler_name : Core Media Data Handler Stream #0:3(und): Data: none (mebx / 0x7862656D), 0 kb/s (default) Metadata: creation_time : 2018-03-... handler_name : Core Media Data Handler Output #0, mov, to "c.MOV": Metadata: major_brand : qt minor_version : 0 compatible_brands: qt com.apple.quicktime.creationdate: 2018-03-... com.apple.quicktime.location.ISO6709: .../ com.apple.quicktime.make: Apple com.apple.quicktime.model: iPhone ... com.apple.quicktime.software: 11.... encoder : Lavf57.71.100 Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, q=2-31, 7707 kb/s, 30 fps, 30 tbr, 19200 tbn, 600 tbc (default) Metadata: creation_time : 2018-03-... handler_name : Core Media Data Handler encoder : H.264 Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 87 kb/s (default) Metadata: creation_time : 2018-03-... handler_name : Core Media Data Handler Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #0:1 -> #0:1 (copy) Press [q] to stop, [?] for help frame= 23 fps=0.0 q=-1.0 Lsize= 732kB time=00:00:01.76 bitrate=7827.5kbits/s speed= 971x video:921kB audio:9kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.291216% $ ffprobe c.MOV Input #0, mov,mp4,m4a,3gp,3g2,mj2, from "c.MOV": Metadata: major_brand : qt minor_version : 512 compatible_brands: qt encoder : Lavf57.71.100 Duration: 00:00:00.77, start: 0.000000, bitrate: 7819 kb/s Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, 7707 kb/s, 30 fps, 30 tbr, 19200 tbn, 38400 tbc (default) Metadata: handler_name : DataHandler encoder : H.264 Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 92 kb/s (default) Metadata: handler_name : DataHandler $ 

Comentarios

  • Tengo el mismo problema; lo anterior no ‘ t funciona. Estoy usando ffmpeg versión ffmpeg versión 3.4.4-1 ~ 16.04.york0 Copyright (c) 2000-2018 los desarrolladores de FFmpeg y este ffmpeg -i a.MOV -map_metadata 0 -c copy c.MOV todavía hace que esto se elimine: – Biblioteca de escritura: Apple QuickTime com.apple.quicktime.make: Apple com.apple.quicktime.model: iPhone 5s com.apple.quicktime.software: 10.3.3 com.apple.quicktime.creationdate: 2018-06-06T01: 15: 37 + 0800 y se reemplazará por: – Aplicación de escritura: Lavf57.83.100

Respuesta

Otro Las respuestas aquí solo funcionan con las » conocidas » meta claves, para claves meta personalizadas / arbitrarias, -map_metadata 0 no es suficiente para mantenerlos todos.

En mi proyecto de transcodificador, a muchos fabricantes de cámaras les gusta inyectar claves meta personalizadas en el contenedor MP4 / MOV, y quiero mantenerlas en el archivos MP4 / MOV transcodificados. Después de mucho rascarse la cabeza, ffmpeg tiene un interruptor para este propósito:

-movflags use_metadata_tags 

El crédito es para el autor de este hilo y Google:

https://superuser.com/questions/1208273/add-new-and-non-defined-metadata-to-a-mp4-file

Comentarios

  • Buen consejo: gracias. Una cosa que noté cuando convertí un montón de archivos mov que había grabado en iphones, la etiqueta de rotación en los datos exif decía 180. ffmpeg por defecto gira automáticamente el video, pero si también copia las etiquetas mov al mp4, entonces todavía le dice al jugador que gire 180 a pesar de que ffmpeg giró automáticamente el mp4 durante la conversión. Así que mis videos terminaron al revés cuando los reproduje 🙂 – La solución en mi caso fue decirle a ffmpeg que no rotase automáticamente usando -noautorotate – una solución rápida es usar Exiftool y establezca la rotación en 0 – exiftool -Rotation=0 file.mp4

Respuesta

El La opción -metadata es para manipular los metadatos. Si solo desea copiar los metadatos de un archivo de entrada a un archivo de salida, debe usar la opción -map_metadata :

ffmpeg -i a.MOV -map_metadata 0 -c copy c.MOV

El especificador de archivo es un número indexado a cero, por lo que «0» toma los metadatos del primer archivo de entrada.

Comentarios

  • ¿Alguna idea de cómo hacer que esto funcione con concat? p.ej. ffmpeg -nostdin -f concat -safe 1 -i "${concatlist}" -map_metadata 0 -c copy "$outfile" donde $concatlist es /tmp/concat.list que tiene líneas como file 'filenamehere.mp3'
  • ok, lo entendí : ffmpeg -nostdin -i "${infile}" -f ffmetadata "${metadatafile}" luego ffmpeg -nostdin -f concat -safe 1 -i "${concatlist}" -i "${metadatafile}" -map_metadata 1 -c copy "$outfile"
  • -map_metadata 0 o -map_metadata 1?
  • @evandrix como indicado en la respuesta, 0 selecciona el primer archivo de entrada como fuente. Para obtener más detalles, consulte esta sección de los documentos de ffmpeg .
  • ok, muchas gracias ~

Respuesta

FFmpeg, de forma predeterminada, hace que todos los metadatos del primer archivo de entrada estén disponibles , al archivo de salida muxer, para escribir. -map_metadata permite anular eso, ya sea apuntando a una entrada diferente o indicando a ffmpeg que descarte los metadatos globales de entrada (valor de -1) .

Sin embargo, cuál de los metadatos disponibles está escrito en el archivo de salida, depende de el muxer de salida. El muxer QT / ISOBMFF (para MOV / MP4 / 3GP ..) solo considera un número limitado de etiquetas, principalmente relacionadas con iTunes. Como señaló @JerryTian, con -movflags use_metadata_tags, todas las demás etiquetas se escriben en el archivo. Sin embargo, estos están escritos de una manera poco convencional: Quicktime, en particular, no reconoce estas entradas de metadatos adicionales. Otros s / w basados en ffmpeg deberían leerlos. O cualquiera que esté usando s / w personalizado, como @JerryTian, puede adaptar su s / w para leerlos.

Tenga en cuenta que movflags solo se aplica a la salida del muxer QT. Matroska (MKV) escribirá cualquier cosa. Otros muxers varían.

Comentarios

  • Estoy tratando de mantener los metadatos al convertir música. Tengo un CATALOGID personalizado, pero al convertir de wav a flac. El campo no se conserva. ffmpeg -i bb.wav bb2.flac -movflags use_metadata_tags. ¿Alguna idea?
  • Entonces, si te entiendo correctamente, ‘ estás diciendo que usar FFmpeg para codificar en un .mkv debería preservar todos los metadatos de la fuente por defecto , ¿sin necesidad de especificar opciones adicionales?

Respuesta

No he encontrado una manera de tener ffmpeg preservar los datos. Pero he descubierto que para mis necesidades quería los metadatos exif y exiftool era un solución conveniente.

Puede copiar metadatos entre archivos de video: https://unix.stackexchange.com/a/492338/83370

Existe un truco para copiar todos los metadatos usando la opción -all:all>all:all: http://u88.n24.queensu.ca/exiftool/forum/index.php?topic=3440.0

exiftool -TagsFromFile a.MOV "-all:all>all:all" c.MOV 

Comentarios

  • Probé todo lo anterior en archivos de Canon 200D y este es en realidad es más útil. Aún hace que exiftool c.MOV sea mucho más pequeño que el resultado del original, pero conserva la fecha de creación real (-map_metadata lo hizo también, pero no -movflags) y el nombre de la cámara, pero la información de la lente aún desapareció.
  • De acuerdo, este fue un gran punto de partida, todo lo que tenía que hacer es omitir esa parte del mapeo. ¡Solo usando exiftool -TagsFromFile in.mp4 out.mp4 hizo el trabajo!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *