Converting video formats and copying tags with ffmpeg
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
Scott
Updated on May 29, 2020Comments
-
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 almost 12 yearsThat 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 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 almost 12 yearsThis 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 over 9 yearsThe 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 over 3 yearsI'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
orffprobe
, and save that to the video file metadata. -
Frank Breitling about 3 yearsNo,reencoding its not expected.
-c copy
should copy. -
André Levy about 3 yearsI 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).