Wanneer ik gewoon a.MOV
kopieer (van mijn iPhone) naar c.MOV
, ffmpeg laat veel metadata vallen (inclusief de tijd en locatie van de video).
Ik heb -metadata
geprobeerd, maar ffmpeg laat de informatie nog steeds vallen (het lijkt erop dat de metadata niet worden verwijderd wanneer ffmpeg Output #0
, maar wordt verwijderd als ik ffprobe gebruik om metadata van het outputbestand te zien)
Wat moet ik doen om ffmpeg te dwingen deze metadata te behouden?
$ 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 $
Reacties
- Ik heb hetzelfde probleem; het bovenstaande werkt niet ‘. Ik gebruik ffmpeg-versie ffmpeg-versie 3.4.4-1 ~ 16.04.york0 Copyright (c) 2000-2018 de FFmpeg-ontwikkelaars en deze ffmpeg -i a.MOV -map_metadata 0 -c kopie c.MOV zorgt er nog steeds voor dat dit wordt verwijderd: – Schrijfbibliotheek: 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 en te vervangen door: – Schrijftoepassing: Lavf57.83.100
Antwoord
Anders antwoorden hier werken alleen met de ” bekende ” meta-toetsen, voor aangepaste / willekeurige meta-toetsen, -map_metadata 0
is niet voldoende om ze allemaal te bewaren.
In mijn transcoderproject injecteren veel cameramakers graag aangepaste meta-keys in de MP4 / MOV-container, en ik wil ze in de getranscodeerde MP4 / MOV-bestanden. Na veel hoofd krabben heeft ffmpeg wel een schakelaar voor dit doel:
-movflags use_metadata_tags
Krediet gaat naar de auteur van deze thread en Google:
https://superuser.com/questions/1208273/add-new-and-non-defined-metadata-to-a-mp4-file
Reacties
- Leuke tip – bedankt. Een ding viel me op toen ik een aantal mov-bestanden converteerde die ik op iPhones had opgenomen, de Rotation-tag in de exif-gegevens zei 180. ffmpeg roteert standaard automatisch de video – maar als je ook de mov-tags naar de mp4 kopieert, dan nog steeds vertelt de speler dat hij 180 moet draaien, ook al heeft ffmpeg de mp4 automatisch gedraaid tijdens de conversie. Dus mijn videos stonden ondersteboven toen ik ze afspeelde 🙂 – De oplossing in mijn geval was om ffmpeg te vertellen om niet automatisch te roteren met
-noautorotate
– een snelle oplossing is om Exiftool te gebruiken en zet de rotatie op 0 –exiftool -Rotation=0 file.mp4
Antwoord
De -metadata
optie is voor het manipuleren van de metadata. Als u alleen de metadata van een invoerbestand naar een uitvoerbestand wilt kopiëren, moet u de optie -map_metadata
gebruiken :
ffmpeg -i a.MOV -map_metadata 0 -c copy c.MOV
De bestandsspecificatie is een nul-geïndexeerd getal, dus “0” haalt de metadata uit het eerste invoerbestand.
Reacties
- Enig idee hoe je dit kunt laten werken met
concat
? bijv.ffmpeg -nostdin -f concat -safe 1 -i "${concatlist}" -map_metadata 0 -c copy "$outfile"
waarbij$concatlist
/tmp/concat.list
is met regels alsfile 'filenamehere.mp3'
- ok, snap het :
ffmpeg -nostdin -i "${infile}" -f ffmetadata "${metadatafile}"
danffmpeg -nostdin -f concat -safe 1 -i "${concatlist}" -i "${metadatafile}" -map_metadata 1 -c copy "$outfile"
-
-map_metadata 0
of-map_metadata 1
? - @evandrix Zoals vermeld in het antwoord, 0 selecteert het eerste invoerbestand als de bron. Zie voor details dit gedeelte van de ffmpeg-documenten .
- ok, heel erg bedankt ~
Answer
FFmpeg maakt standaard alle metadata van het eerste invoerbestand beschikbaar , naar het uitvoerbestand muxer, om te schrijven. -map_metadata
maakt het mogelijk om dat te overschrijven door ofwel naar een andere invoer te verwijzen, of door ffmpeg te vertellen dat de globale metagegevens van de invoer moeten worden verwijderd (waarde van -1
) .
Welke van de beschikbare metadata echter daadwerkelijk naar het uitvoerbestand is geschreven, hangt af van de output muxer. De QT / ISOBMFF-muxer (voor MOV / MP4 / 3GP ..) houdt slechts rekening met een beperkt aantal tags, voornamelijk gerelateerd aan iTunes. Zoals @JerryTian opmerkte, met -movflags use_metadata_tags
, worden alle andere tags naar het bestand geschreven. Deze zijn echter op een onconventionele manier geschreven – met name Quicktime herkent deze extra metagegevens niet. Andere, op ffmpeg gebaseerde software, zouden ze moeten lezen. Of iedereen die aangepaste s / w gebruikt, zoals @JerryTian, kan zijn s / w aanpassen om ze te lezen.
Merk op dat movflags alleen van toepassing zijn op uitvoer van de QT-muxer. Matroska (MKV) zal schrijven alles. Andere muxers variëren.
Opmerkingen
- Ik probeer metadata te behouden bij het converteren van muziek. Ik heb een aangepaste CATALOGID, maar bij het converteren van wav naar flac. Het veld wordt niet bewaard. ffmpeg -i bb.wav bb2.flac -movflags gebruiken_metadata_tags. Enig idee?
- Dus als ik je goed begrijp, zeg je ‘ dat het gebruik van FFmpeg om te coderen in een .mkv standaard alle metadata van de bron zou moeten bewaren , zonder extra opties te hoeven specificeren?
Antwoord
Ik heb “geen manier gevonden om ffmpeg te hebben bewaar de gegevens. Maar ik “heb gemerkt dat ik voor mijn behoeften de exif-metadata wilde en de exiftool
een handige oplossing.
U kunt metadata tussen videobestanden kopiëren: https://unix.stackexchange.com/a/492338/83370
Er is een truc om alle metadata te kopiëren met de optie -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
Reacties
- Ik heb alles hierboven geprobeerd met bestanden van Canon 200D en deze is eigenlijk het meest bruikbaar. Het maakt
exiftool c.MOV
nog steeds veel kleiner dan de uitvoer van het origineel, maar het behoudt de werkelijke aanmaakdatum (-map_metadata
deed het ook, maar niet-movflags
) en cameranaam, maar de lensinformatie is nog steeds verdwenen. - Oké, dit was eigenlijk een prima startpunt – alles wat ik hoefde te doen is dat toewijzingsgedeelte overslaan. Gewoon
exiftool -TagsFromFile in.mp4 out.mp4
gebruiken deed het!