När jag bara kopierar a.MOV
(från min iPhone) till c.MOV
, ffmpeg släpper mycket metadata, (inklusive tid och plats för videon).
Jag försökte -metadata
, men ffmpeg tappar fortfarande informationen (det verkar som att metadata inte tappas när ffmpeg skriver ut Output #0
, men tappas när jag använder ffprobe för att se metadata för utdatafilen)
Vad ska jag göra för att tvinga ffmpeg att bevara dessa metadata?
$ ffmpeg -i a.MOV -c copy c.MOV -y Input #0, mov,mp4,m4a,3gp,3g2,mj2, from "a.MOV": Metadata: major_brand : qt minor_version : 0 compatible_brands: qt creation_time : 2018-03-... com.apple.quicktime.location.ISO6709: .../ com.apple.quicktime.make: Apple com.apple.quicktime.model: iPhone ... com.apple.quicktime.software: 11.... com.apple.quicktime.creationdate: 2018-03-... Duration: 00:00:01.77, start: 0.000000, bitrate: 7868 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, 7707 kb/s, 30 fps, 30 tbr, 600 tbn, 1200 tbc (default) Metadata: creation_time : 2018-03-... handler_name : Core Media Data Handler encoder : H.264 Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 87 kb/s (default) Metadata: creation_time : 2018-03-... handler_name : Core Media Data Handler Stream #0:2(und): Data: none (mebx / 0x7862656D), 0 kb/s (default) Metadata: creation_time : 2018-03-... handler_name : Core Media Data Handler Stream #0:3(und): Data: none (mebx / 0x7862656D), 0 kb/s (default) Metadata: creation_time : 2018-03-... handler_name : Core Media Data Handler Output #0, mov, to "c.MOV": Metadata: major_brand : qt minor_version : 0 compatible_brands: qt com.apple.quicktime.creationdate: 2018-03-... com.apple.quicktime.location.ISO6709: .../ com.apple.quicktime.make: Apple com.apple.quicktime.model: iPhone ... com.apple.quicktime.software: 11.... encoder : Lavf57.71.100 Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, q=2-31, 7707 kb/s, 30 fps, 30 tbr, 19200 tbn, 600 tbc (default) Metadata: creation_time : 2018-03-... handler_name : Core Media Data Handler encoder : H.264 Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 87 kb/s (default) Metadata: creation_time : 2018-03-... handler_name : Core Media Data Handler Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #0:1 -> #0:1 (copy) Press [q] to stop, [?] for help frame= 23 fps=0.0 q=-1.0 Lsize= 732kB time=00:00:01.76 bitrate=7827.5kbits/s speed= 971x video:921kB audio:9kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.291216% $ ffprobe c.MOV Input #0, mov,mp4,m4a,3gp,3g2,mj2, from "c.MOV": Metadata: major_brand : qt minor_version : 512 compatible_brands: qt encoder : Lavf57.71.100 Duration: 00:00:00.77, start: 0.000000, bitrate: 7819 kb/s Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, 7707 kb/s, 30 fps, 30 tbr, 19200 tbn, 38400 tbc (default) Metadata: handler_name : DataHandler encoder : H.264 Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 92 kb/s (default) Metadata: handler_name : DataHandler $
Kommentarer
- Jag har samma problem; ovanstående fungerar inte ’. Jag använder ffmpeg version ffmpeg version 3.4.4-1 ~ 16.04.york0 Copyright (c) 2000-2018 FFmpeg utvecklarna och denna ffmpeg -i a.MOV -map_metadata 0 -c kopia c.MOV gör fortfarande att detta tappas: – Skrivbibliotek: Apple QuickTime com.apple.quicktime.make: Apple com.apple.quicktime.model: iPhone 5s com.apple.quicktime.software: 10.3.3 com.apple.quicktime.creationdate: 2018-06-06T01: 15: 37 + 0800 och ska ersättas med: – Skrivansökan: Lavf57.83.100
Svar
Övrigt svar här fungerar bara med ” kända ” metatangenter, för anpassade / godtyckliga metatangenter, -map_metadata 0
räcker inte för att behålla dem alla.
I mitt transcoderprojekt gillar många kameratillverkare att injicera anpassade metatangenter i MP4 / MOV-behållaren och jag vill behålla dem i omkodade MP4 / MOV-filer. Efter mycket huvudskrapning har ffmpeg en omkopplare för detta ändamål:
-movflags use_metadata_tags
Tack till författaren till denna tråd och Google:
https://superuser.com/questions/1208273/add-new-and-non-defined-metadata-to-a-mp4-file
Kommentarer
- Trevligt tips – tack. En sak som jag märkte när jag konverterade ett gäng mov-filer som jag hade spelat in på iphones sa Rotation-taggen i exif-data 180. ffmpeg roterar automatiskt videon automatiskt – men om du också kopierar mov-taggarna till mp4 så är berättar för spelaren att rotera 180 även om ffmpeg automatiskt roterade mp4 under konverteringen. Så mina videor hamnade upp och ner när jag spelade upp dem 🙂 – Lösningen i mitt fall var att säga till ffmpeg att inte rotera automatiskt med
-noautorotate
– en snabb lösning är att använda Exiftool och ställ in rotationen till 0 –exiftool -Rotation=0 file.mp4
Svar
-metadata
alternativet är att manipulera metadata. Om du bara vill kopiera metadata från en inmatningsfil till en ouput-fil, bör du använda alternativet -map_metadata
:
ffmpeg -i a.MOV -map_metadata 0 -c copy c.MOV
Filspecifikatorn är ett nollindexerat tal, så ”0” tar metadata från den första inmatningsfilen.
Kommentarer
- Har du någon idé om hur du får detta att fungera med
concat
? t.ex.ffmpeg -nostdin -f concat -safe 1 -i "${concatlist}" -map_metadata 0 -c copy "$outfile"
där$concatlist
är/tmp/concat.list
som har rader somfile 'filenamehere.mp3'
- ok, fick det :
ffmpeg -nostdin -i "${infile}" -f ffmetadata "${metadatafile}"
sedanffmpeg -nostdin -f concat -safe 1 -i "${concatlist}" -i "${metadatafile}" -map_metadata 1 -c copy "$outfile"
-
-map_metadata 0
eller-map_metadata 1
? - @evandrix As anges i svaret väljer 0 den första inmatningsfilen som källa. Mer information finns i det här avsnittet i ffmpeg-dokumenten .
- ok, tack så mycket ~
Svar
FFmpeg gör som standard alla metadata från den första inmatningsfilen tillgänglig , till utdatafilmuxern för att skriva. -map_metadata
gör det möjligt att åsidosätta detta genom att antingen peka på en annan ingång eller genom att be ffmpeg att kasta inmatade globala metadata (värde på -1
) .
Vilken av tillgängliga metadata är dock som faktiskt skrivs till utdatafilen, beror på utgångsmuxern. QT / ISOBMFF-muxern (för MOV / MP4 / 3GP ..) beaktar endast ett begränsat antal taggar, främst iTunes-relaterade. Som @JerryTian noterade, med -movflags use_metadata_tags
skrivs alla andra taggar till filen. Dessa är dock skrivna på ett okonventionellt sätt – i synnerhet Quicktime känner inte igen dessa ytterligare metadataposter. Annat, ffmpeg-baserat s / w, bör läsa dem. Eller någon som använder anpassad s / w, som @JerryTian, kan anpassa sin s / w för att läsa dem.
Observera att movflags endast gäller för utdata från QT-muxern. Matroska (MKV) skriver vad som helst. Andra muxers varierar.
Kommentarer
- Jag försöker behålla metadata när jag konverterar musik. Jag har en anpassad CATALOGID, men när jag konverterar från wav till flac. Fältet bevaras inte. ffmpeg -i bb.wav bb2.flac -movflags use_metadata_tags. Någon idé?
- Så om jag förstår dig rätt, säger du ’ att du använder FFmpeg för att koda in i en .mkv bör bevara alla metadata från källan som standard utan att behöva specificera några ytterligare alternativ?
Svar
Jag har inte hittat ett sätt att få ffmpeg bevara data. Men jag har upptäckt att för mina behov ville jag exif-metadata och exiftool
var en bekväm lösning.
Du kan kopiera metadata mellan videofiler: https://unix.stackexchange.com/a/492338/83370
Det finns ett knep för att kopiera alla metadata med alternativet -all:all>all:all
: http://u88.n24.queensu.ca/exiftool/forum/index.php?topic=3440.0
exiftool -TagsFromFile a.MOV "-all:all>all:all" c.MOV
Kommentarer
- Jag försökte alla ovan på filer från Canon 200D och den här är faktiskt mest användbara. Det gör fortfarande
exiftool c.MOV
mycket mindre än originalet, men det bevarar det faktiska skapelsedatumet (-map_metadata
gjorde det också, men inte-movflags
) och kamerans namn, men objektivinformation är fortfarande borta. - OK, det här var faktiskt en utmärkt utgångspunkt – allt jag var tvungen att göra hoppar över den kartläggningsdelen. Bara att använda
exiftool -TagsFromFile in.mp4 out.mp4
gjorde jobbet!