Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ffmpeg does not copy custom metadata

I'm trying to fix some videos made with an iDevice. The videos have a rotation in the metadata which is only understood by Apple and its software but noone else. Fixing this is quite simple, but I also would like to keep the other metadata in the files like the geolocation.

I tried a couple of versions, all with the same result, e.g.:

ffmpeg -i input.mov -vf vflip,hflip -map_metadata 0 -metadata:s:v:0 rotate=0  -acodec copy output.mp4

This should work, it already gives the correct preview of metadata:

ffmpeg version 1.1.2 Copyright (c) 2000-2013 the FFmpeg developers
built on Feb  8 2013 23:55:22 with Apple clang version 4.0 (tags/Apple/clang-421.0.60) (based on LLVM 3.1svn)
configuration: --prefix=/usr/local/Cellar/ffmpeg/1.1.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
libavutil      52. 13.100 / 52. 13.100
libavcodec     54. 86.100 / 54. 86.100
libavformat    54. 59.106 / 54. 59.106
libavdevice    54.  3.102 / 54.  3.102
libavfilter     3. 32.100 /  3. 32.100
libswscale      2.  1.103 /  2.  1.103
libswresample   0. 17.102 /  0. 17.102
libpostproc    52.  2.100 / 52.  2.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '2013-02-17 00.39.36.mov':
  Metadata:
    major_brand     : qt  
    minor_version   : 0
    compatible_brands: qt  
    creation_time   : 2013-02-16 23:39:25
    model           : iPhone 5
    model-deu       : iPhone 5
    encoder         : 6.1
    encoder-deu     : 6.1
    date            : 2013-02-17T00:39:25+0100
    date-deu        : 2013-02-17T00:39:25+0100
    location        : +48.2683+007.7205+172.710/
    location-deu    : +48.2683+007.7205+172.710/
    make            : Apple
    make-deu        : Apple
  Duration: 00:00:09.67, start: 0.000000, bitrate: 16764 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 16696 kb/s, 24 fps, 24 tbr, 600 tbn, 1200 tbc
    Metadata:
      rotate          : 180
      creation_time   : 2013-02-16 23:39:25
      handler_name    : Core Media Data Handler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 61 kb/s
    Metadata:
      creation_time   : 2013-02-16 23:39:25
      handler_name    : Core Media Data Handler
w:1920 h:1080 pixfmt:yuv420p tb:1/600 fr:24/1 sar:0/1 sws_param:flags=2
[libx264 @ 0x7fc248829a00] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.2 AVX
[libx264 @ 0x7fc248829a00] profile High, level 4.0
[libx264 @ 0x7fc248829a00] 264 - core 125 - H.264/MPEG-4 AVC codec - Copyleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=24 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00

Output #0, mp4, to 'output.mp4':
Metadata:
  major_brand     : qt  
  minor_version   : 0
  compatible_brands: qt  
  creation_time   : 2013-02-16 23:39:25
  model           : iPhone 5
  model-deu       : iPhone 5
  encoder-deu     : 6.1
  date            : 2013-02-17T00:39:25+0100
  date-deu        : 2013-02-17T00:39:25+0100
  location        : +48.2683+007.7205+172.710/
  location-deu    : +48.2683+007.7205+172.710/
  make            : Apple
  make-deu        : Apple
  encoder         : Lavf54.59.106
Stream #0:0(und): Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1080, q=-1--1, 12288 tbn, 24 tbc
Metadata:
  handler_name    : Core Media Data Handler
  creation_time   : 2013-02-16 23:39:25
  rotate          : 0
Stream #0:1(und): Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, mono, 61 kb/s
Metadata:
  creation_time   : 2013-02-16 23:39:25
  handler_name    : Core Media Data Handler
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> libx264)
  Stream #0:1 -> #0:1 (copy)

But the resulting file keeps only some of these metadata tags:

ffmpeg -i output.mp4

shows:

fmpeg version 1.1.2 Copyright (c) 2000-2013 the FFmpeg developers
  built on Feb  8 2013 23:55:22 with Apple clang version 4.0 (tags/Apple/clang-421.0.60) (based on LLVM 3.1svn)
configuration: --prefix=/usr/local/Cellar/ffmpeg/1.1.2 --enable-shared --enable-pthreads -  -enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
libavutil      52. 13.100 / 52. 13.100
libavcodec     54. 86.100 / 54. 86.100
libavformat    54. 59.106 / 54. 59.106
libavdevice    54.  3.102 / 54.  3.102
libavfilter     3. 32.100 /  3. 32.100
libswscale      2.  1.103 /  2.  1.103
libswresample   0. 17.102 /  0. 17.102
libpostproc    52.  2.100 / 52.  2.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':
Metadata:
  major_brand     : isom
  minor_version   : 512
  compatible_brands: isomiso2mp41
  creation_time   : 2013-02-16 23:39:25
  date            : 2013-02-17T00:39:25+0100
  encoder         : Lavf54.59.106
Duration: 00:00:09.67, start: 0.000000, bitrate: 3286 kb/s
  Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 3219 kb/s, 24 fps, 24 tbr, 12288 tbn, 24 tbc
  Metadata:
    creation_time   : 2013-02-16 23:39:25
    handler_name    : VideoHandler
  Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 61 kb/s
  Metadata:
    creation_time   : 2013-02-16 23:39:25
    handler_name    : SoundHandler

I also tried to add the one tag I'm interested in by hand with

-metadata:g location=+48.2683+007.7205+172.710/

with no change in the result.

Output as .mov doesn't change anything, neither.

Is there any trick to add non-standard metadata? How do I get the location back in there?

Thanks in advance to anyone who can give some insight on this.

like image 923
e110c0 Avatar asked Feb 19 '13 15:02

e110c0


2 Answers

The FFmpeg mp4 muxer only writes a select list of known metadata types. Some muxers, like AVI, will write all metadata fields using custom tags (partially to allow such remuxing use cases), but movenc.c doesn't do that yet (see the code blocks in line 2911 or 3064). You could potentially implement it yourself.

like image 192
Ronald S. Bultje Avatar answered Sep 20 '22 17:09

Ronald S. Bultje


Apparently FFMPEG has a documented bug about this issue:

https://trac.ffmpeg.org/ticket/4209

like image 41
avibrazil Avatar answered Sep 22 '22 17:09

avibrazil