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?
In this example the global and stream metadata will be copied from
in0.mkv. The video and audio streams will be stream copied from
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.
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