Quando estou simplesmente copiando a.MOV (do meu iPhone) para c.MOV, ffmpeg elimina muitos metadados, (incluindo a hora e localização do vídeo).

Eu tentei -metadata, mas ffmpeg ainda descarta a informação (parece que os metadados não são eliminados quando o ffmpeg imprime Output #0, mas é eliminado quando uso o ffprobe para ver os metadados do arquivo de saída)

O que devo fazer para forçar o ffmpeg a preservar esses metadados?

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

Comentários

  • Tenho o mesmo problema; o acima não ‘ não funciona. Estou usando ffmpeg versão ffmpeg versão 3.4.4-1 ~ 16.04.york0 Copyright (c) 2000-2018 os desenvolvedores FFmpeg e este ffmpeg -i a.MOV -map_metadata 0 -c copy c.MOV ainda faz com que isso seja eliminado: – Biblioteca de gravação: 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 e deve ser substituído por: – Aplicativo de escrita: Lavf57.83.100

Resposta

Outro as respostas aqui funcionam apenas com as ” ” meta chaves conhecidas, para meta chaves arbitrárias / personalizadas, -map_metadata 0 não é suficiente para mantê-los todos.

Em meu projeto de transcodificador, muitos fabricantes de câmeras gostam de injetar meta chaves personalizadas no contêiner MP4 / MOV e eu quero mantê-los no arquivos MP4 / MOV transcodificados. Depois de muito coçar a cabeça, o ffmpeg tem uma opção para este propósito:

-movflags use_metadata_tags 

O crédito vai para o autor deste tópico e para o Google:

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

Comentários

  • Boa dica – obrigado. Uma coisa que notei quando converti um monte de arquivos mov que gravei em iphones, a tag Rotation nos dados exif dizia 180. ffmpeg por padrão gira automaticamente o vídeo – mas se você também copiar as tags mov para o mp4, ele ainda diz ao jogador para girar 180 mesmo que o ffmpeg tenha girado automaticamente o mp4 durante a conversão. Então, meus vídeos acabaram ficando de cabeça para baixo quando os reproduzi 🙂 – A solução no meu caso foi dizer ao ffmpeg para não girar automaticamente usando -noautorotate – uma solução rápida é usar Exiftool e defina a rotação para 0 – exiftool -Rotation=0 file.mp4

Resposta

O -metadata opção é para manipular os metadados. Se você deseja apenas copiar os metadados de um arquivo de entrada para um arquivo de saída, deve usar a opção -map_metadata :

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

O especificador de arquivo é um número indexado por zero, então “0” pega os metadados do primeiro arquivo de entrada.

Comentários

  • Alguma ideia de como fazer isso funcionar com concat? por exemplo. ffmpeg -nostdin -f concat -safe 1 -i "${concatlist}" -map_metadata 0 -c copy "$outfile" onde $concatlist é /tmp/concat.list que possui linhas como file 'filenamehere.mp3'
  • ok, entendi : ffmpeg -nostdin -i "${infile}" -f ffmetadata "${metadatafile}" e ffmpeg -nostdin -f concat -safe 1 -i "${concatlist}" -i "${metadatafile}" -map_metadata 1 -c copy "$outfile"
  • -map_metadata 0 ou -map_metadata 1?
  • @evandrix Como declarado na resposta, 0 seleciona o primeiro arquivo de entrada como a fonte. Para obter detalhes, consulte esta seção da documentação do ffmpeg .
  • ok, muito obrigado ~

Resposta

FFmpeg, por padrão, disponibiliza todos os metadados do primeiro arquivo de entrada , para o muxer do arquivo de saída, para gravação. -map_metadata permite sobrescrever isso, apontando para uma entrada diferente ou dizendo ao ffmpeg para descartar metadados globais de entrada (valor de -1) .

No entanto, qual dos metadados disponíveis é realmente gravado no arquivo de saída, depende de o muxer de saída. O muxer QT / ISOBMFF (para MOV / MP4 / 3GP ..) considera apenas um número limitado de tags, principalmente relacionadas ao iTunes. Como @JerryTian observou, com -movflags use_metadata_tags, todas as outras tags são gravadas no arquivo. No entanto, eles são escritos de uma maneira não convencional – Quicktime, em particular, não reconhece essas entradas de metadados adicionais. Outros s / w baseados em ffmpeg devem lê-los. Ou qualquer pessoa que esteja usando s / w personalizado, como @JerryTian, pode adaptar seu s / w para lê-los.

Observe que movflags só se aplica à saída do muxer QT. Matroska (MKV) escreverá qualquer coisa. Outros muxers variam.

Comentários

  • Estou tentando manter metadados ao converter música. Tenho um CATALOGID personalizado, mas ao converter de wav para flac. O campo não é preservado. ffmpeg -i bb.wav bb2.flac -movflags use_metadata_tags. Alguma ideia?
  • Então, se bem entendi, você ‘ está dizendo que usar FFmpeg para codificar em um .mkv deve preservar todos os metadados da fonte por padrão , sem precisar especificar nenhuma opção adicional?

Resposta

Não encontrei uma maneira de ter ffmpeg preservar os dados. Mas descobri que, para minhas necessidades, eu queria os metadados exif e o exiftool era um solução conveniente.

Você pode copiar metadados entre arquivos de vídeo: https://unix.stackexchange.com/a/492338/83370

Existe um truque para copiar todos os metadados usando a opção -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 

Comentários

  • Tentei tudo acima em arquivos do Canon 200D e este é na verdade, mais útil. Ainda torna exiftool c.MOV muito menor do que a saída do original, mas preserva a data de criação real (-map_metadata conseguiu também, mas não -movflags) e nome da câmera, mas as informações da lente ainda sumiram.
  • OK, este foi realmente um ótimo ponto de partida – tudo que eu tive que fazer é pular a parte do mapeamento. Basta usar exiftool -TagsFromFile in.mp4 out.mp4 para fazer o trabalho!

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *