Converting video formats and copying tags with ffmpeg

25,967

Solution 1

Have a look at the documentation on dumping and loading metadata:

FFmpeg is able to dump metadata from media files into a simple UTF-8-encoded INI-like text file and then load it back using the metadata muxer/demuxer.

The process might look something like this:

# 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

I don't have a metadata-ful video to test with right now, but something like that should work.

Solution 2

Use "-map_metadata 0:g" to copy all global metadata.

0 means Input #0. g means global metadata.

Here's my ffprobe result. enjoy!

input.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]

output.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]

Solution 3

To write all metadata (global, video, audio) to a file 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

To add all metadata from a file use

ffmpeg -i in.mp4 -f ffmetadata -i in.txt -c copy -map_metadata 1 out.mp4
Share:
25,967
Scott
Author by

Scott

Updated on May 29, 2020

Comments

  • Scott
    Scott about 4 years

    I've been trying to convert some videos I took on my camera to a compressed format in order to save some storage space. I figured out how to use ffmpeg to convert the videos to the format I want, but what I haven't been able to figure out is how to copy the metadata. I'd like to copy the original metadata from when the video was taken (most importantly the creation time). I've tried running ffmpeg using the -map_meta_data 0:0 option, but that didn't seem to work. Any ideas?

    It looks like the data I want to copy in this case is in the format section of the video. Using ffprobe with the show_format option, I get this output:

    [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]
    

    I would like to copy the two tags to my new video.

  • Scott
    Scott almost 12 years
    That seems like it should work, but when I extract the metadata the creation_time tag isn't extracted. This is all that is saved to the file, which could also explain why the map_meta_data option wasn't working: ;FFMETADATA1 encoder=CanonMVI06
  • blahdiblah
    blahdiblah almost 12 years
    @Scott Indeed it might. Though it's completely inelegant and shouldn't be necessary, have tried using ffprobe and grep to get the creation time and then setting it directly in the output using -metadata?
  • Scott
    Scott almost 12 years
    This still didn't quite work, but it pointed me in the right direction. I finally noticed a message getting output when I ran the ffmpeg command that said stfptime was not available (I've been trying to do this on Windows). It turns out that since that library wasn't available on Windows, the date never got placed into the metadata. So, I tried converting my videos in Linux where stfptime is available, and both the map_metadata and the ffmetadata options worked for saving the creation_time tag into the video metadata.
  • Wang
    Wang over 9 years
    The last command won't work. Because you did not tell the ffmpeg which metadata it should choose. you need to use -map_metadata 1 to select the 2nd input as metadata.
  • André Levy
    André Levy over 3 years
    I'm trying this and it reencodes the whole file--is that expected? Is there a switch to perhaps only insert the metadata? Btw, what I want is to read the video info (frame height, width, rate, etc), with ffmpeg or ffprobe, and save that to the video file metadata.
  • Frank Breitling
    Frank Breitling about 3 years
    No,reencoding its not expected. -c copy should copy.
  • André Levy
    André Levy about 3 years
    I don't know if it's reencoding, tbh, but what I see is it crawling through the whole video, minute by minute. Is that what -c copy is supposed to do? Btw, I found out my problem wasn't that the metadata was lacking on the files, but that Windows doesn't natively read metadata from mkv files in its file system, as it does with mp4. Shark007 codecs fixed that (and possibly afforded me other problems).