I want to use ffmpeg to copy all meta data not associated with core aspects of a video (frame rate, resolution) from one video to another. Is there a simple way to do this with a single command?
5 Answers
Use -map_metadata
.
In this example the global and stream metadata will be copied from in0.mkv
. The video and audio streams will be stream copied from in1.mkv
:
ffmpeg -i in0.mkv -i in1.mkv -map 1 -c copy \
# copies all global metadata from in0.mkv to out.mkv
-map_metadata 0 \
# copies video stream metadata from in0.mkv to out.mkv
-map_metadata:s:v 0:s:v \
# copies audio stream metadata from in0.mkv to out.mkv
-map_metadata:s:a 0:s:a \
out.mkv
This will result in something like:
Output #0, matroska, to 'out.mkv':
Metadata:
title : Global Title
AUTHOR : Global Author
Stream #0:0: Video: h264
Metadata:
title : Stream 0 Title
Stream #0:1: Audio: vorbis
Metadata:
title : Stream 1 Title
By default global metadata is copied from the first input file, so -map_metadata 0
could probably be omitted.
-
4If your source video is a .mov file you need to also add the flag
-movflags use_metadata_tags
or the output video won't contain the metadata. Commented Aug 28, 2019 at 20:55 -
It overwrites the output file.. Output file contains video from the input file now.. I would expect to leave the contents of the output file, just copy the metadata of the input file to output file.– hipokitoCommented Feb 11, 2021 at 21:17
-
@hipokito
ffmpeg
can't perform in-place editing. A new file must be created, and it will ask you if you want to overwrite any existing files.– lloganCommented Feb 12, 2021 at 0:09 -
Is
map_metadata
still required with ffmpeg 4.4 when there is only 1 input file? (For example if you want to optimise mp4 files withmovflag +faststart
while ensuring all metadata is also copied over tot he new file)?– sfxeditCommented Oct 20, 2021 at 3:12 -
1@sfxedit No, you don't need
-map_metadata
for a single file. ffmepg will attempt to copy all metadata. I should update this old answer to make it more clear.– lloganCommented Oct 20, 2021 at 5:53
From the comment in the answer How to make Handbrake preserve capture time / creation time?
A full command line adding the option to copy special tags will be:
ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy -movflags use_metadata_tags fixed.mp4
For decoding Flac to AIFF whilst preserving metadata, this answer worked better for me: Covert FLAC to AIFF while saving tags/metadata
When using ffmpeg at a file which has metadata (like a title) in its streams, you need to use -map_metadata again, as it will not hold those metadata in the new output
If all you need is the basics (creation date, etc), then touch -r FILE1 FILE2 Will work as a charm coping metadata from FILE1 to FILE2
-
3If you read the question, the objective is the video meta data, not the file meta data. Commented Oct 27, 2016 at 20:39