Når jeg bare kopierer a.MOV
(fra min iPhone) til c.MOV
, ffmpeg taber mange metadata (inklusive tid og placering af videoen).
Jeg prøvede -metadata
, men ffmpeg taber stadig informationen (det ser ud til, at metadataene ikke tabes, når ffmpeg udskriver Output #0
, men droppes, når jeg bruger ffprobe til at se metadata for outputfilen)
Hvad skal jeg gøre for at tvinge ffmpeg til at bevare disse 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
- Jeg har det samme problem; ovenstående fungerer ikke ‘ t. Jeg bruger ffmpeg version ffmpeg version 3.4.4-1 ~ 16.04.york0 Copyright (c) 2000-2018 FFmpeg udviklerne og denne ffmpeg -i a.MOV -map_metadata 0 -c kopi c.MOV får stadig dette til at blive droppet: – Skrivebibliotek: 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 og skal erstattes af: – Skriveapplikation: Lavf57.83.100
Svar
Andet svar her fungerer kun med ” kendte ” metataster, til tilpassede / vilkårlige metataster, -map_metadata 0
er ikke tilstrækkelig til at beholde dem alle.
I mit transcoder-projekt kan mange kameraproducenter gerne injicere brugerdefinerede metataster i MP4 / MOV-beholderen, og jeg vil beholde dem i transkodede MP4 / MOV-filer. Efter meget hovedskrabe har ffmpeg en switch til dette formål:
-movflags use_metadata_tags
Kredit går til forfatteren af denne tråd og Google:
https://superuser.com/questions/1208273/add-new-and-non-defined-metadata-to-a-mp4-file
Kommentarer
- Dejligt tip – tak. En ting bemærkede jeg, da jeg konverterede en masse mov-filer, som jeg havde optaget på iPhones, sagde Rotation-tagget i exif-data 180. ffmpeg roterer som standard automatisk videoen – men hvis du også kopierer mov-tags til mp4, så er det stadig fortæller afspilleren at rotere 180, selvom ffmpeg automatisk roterede mp4 under konverteringen. Så mine videoer endte med at være på hovedet, da jeg spillede dem 🙂 – Løsningen i mit tilfælde var at fortælle ffmpeg om ikke automatisk at rotere ved hjælp af
-noautorotate
– en hurtig løsning er at bruge Exiftool og indstil rotationen til 0 –exiftool -Rotation=0 file.mp4
Svar
-metadata
mulighed for at manipulere metadataene. Hvis du bare vil kopiere metadataene fra en inputfil til en ouput-fil, skal du bruge indstillingen -map_metadata
:
ffmpeg -i a.MOV -map_metadata 0 -c copy c.MOV
Filspecifikatoren er et nulindekseret tal, så “0” tager metadataene fra den første inputfil.
Kommentarer
- Har du nogen idé om, hvordan du får dette til at fungere med
concat
? for eksempel.ffmpeg -nostdin -f concat -safe 1 -i "${concatlist}" -map_metadata 0 -c copy "$outfile"
hvor$concatlist
er/tmp/concat.list
som har linjer somfile 'filenamehere.mp3'
- ok, fik det :
ffmpeg -nostdin -i "${infile}" -f ffmetadata "${metadatafile}"
derefterffmpeg -nostdin -f concat -safe 1 -i "${concatlist}" -i "${metadatafile}" -map_metadata 1 -c copy "$outfile"
-
-map_metadata 0
eller-map_metadata 1
? - @evandrix As angivet i svaret, vælger 0 første inputfil som kilde. For detaljer, se dette afsnit af ffmpeg docs .
- ok, mange tak ~
Svar
FFmpeg gør som standard alle metadata fra den første inputfil tilgængelig , til outputfilmuxeren til skrivning. -map_metadata
gør det muligt at tilsidesætte det ved enten at pege på en anden input eller ved at bede ffmpeg om at kassere input-globale metadata (værdi -1
) .
Hvilken af de tilgængelige metadata er dog faktisk skrevet til outputfilen, afhænger af outputmuxeren. QT / ISOBMFF-muxeren (til MOV / MP4 / 3GP ..) overvejer kun et begrænset antal tags, primært iTunes-relateret. Som @JerryTian bemærkede, med -movflags use_metadata_tags
, skrives alle andre tags til filen. Disse er imidlertid skrevet på en ukonventionel måde – især Quicktime genkender ikke disse yderligere metadataindgange. Andet, ffmpeg-baseret s / w, skal læse dem. Eller enhver, der bruger brugerdefineret s / w, som @JerryTian, kan tilpasse deres s / w til at læse dem.
Bemærk, at movflags kun gælder for output fra QT-muxeren. Matroska (MKV) skriver alt andet. Andre muxers varierer.
Kommentarer
- Jeg prøver at beholde metadata ved konvertering af musik. Jeg har et brugerdefineret CATALOGID, men når jeg konverterer fra wav til flac. Feltet er ikke bevaret. ffmpeg -i bb.wav bb2.flac -movflags use_metadata_tags. Enhver idé?
- Så hvis jeg forstår dig korrekt, skal du ‘ sige at bruge FFmpeg til at kode til en .mkv skal som standard bevare alle metadata fra kilden uden at skulle specificere yderligere muligheder?
Svar
Jeg har ikke fundet en måde at få ffmpeg på bevare dataene. Men jeg har fundet ud af, at jeg til mine behov ville have exif-metadataene, og at exiftool
var en praktisk løsning.
Du kan kopiere metadata mellem videofiler: https://unix.stackexchange.com/a/492338/83370
Der er et trick til at kopiere alle metadata ved hjælp af indstillingen -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
- Jeg prøvede alle ovenstående på filer fra Canon 200D, og denne er faktisk mest nyttigt. Det gør stadig
exiftool c.MOV
meget mindre end output fra originalen, men det bevarer faktisk oprettelsesdato (-map_metadata
gjorde det også, men ikke-movflags
) og kameranavn, men linsen er stadig væk. - OK, dette var faktisk et godt udgangspunkt – alt hvad jeg havde at gøre springer denne kortlægningsdel over. Bare ved at bruge
exiftool -TagsFromFile in.mp4 out.mp4
gjorde jobbet!