Gdy po prostu kopiuję a.MOV (z mojego iPhonea) do c.MOV, ffmpeg porzuca wiele metadanych (w tym czas i lokalizację wideo).

Próbowałem -metadata, ale ffmpeg nadal upuszcza informacje (wydaje się, że metadane nie są porzucane podczas drukowania ffmpeg Output #0, ale jest usuwany, gdy używam ffprobe do przeglądania metadanych pliku wyjściowego)

Co mam zrobić, aby wymusić na ffmpeg zachowanie tych metadanych?

$ 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 $ 

Komentarze

  • Mam ten sam problem; powyższe ' nie działa. Używam wersji ffmpeg ffmpeg w wersji 3.4.4-1 ~ 16.04.york0 Copyright (c) 2000-2018 deweloperzy FFmpeg i ta ffmpeg -i a.MOV -map_metadata 0 -c kopia c.MOV nadal powoduje, że to jest usuwane: – Biblioteka do pisania: 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 i do zastąpienia przez: – Zgłoszenie do pisania: Lavf57.83.100

Odpowiedź

Inne tutaj odpowiedzi działają tylko z ” znanymi ” kluczami meta, dla niestandardowych / dowolnych kluczy meta, -map_metadata 0 nie wystarczy, aby zachować je wszystkie.

W moim projekcie transkodera wielu producentów kamer lubi wstawiać niestandardowe meta klucze do kontenera MP4 / MOV, a ja chcę je zachować w transkodowane pliki MP4 / MOV. Po wielu drapaniach po głowie ffmpeg ma przełącznik służący do tego celu:

-movflags use_metadata_tags 

Podziękowania należą się autorowi tego wątku i Google:

https://superuser.com/questions/1208273/add-new-and-non-defined-metadata-to-a-mp4-file

Komentarze

  • Dobra wskazówka – dzięki. Jedna rzecz, którą zauważyłem, kiedy przekonwertowałem kilka plików mov, które nagrałem na iPhoneach, tag Rotation w danych exif powiedział 180. ffmpeg domyślnie automatycznie obraca wideo – ale jeśli skopiujesz również tagi mov do mp4, to nadal mówi odtwarzaczowi, aby obrócił o 180, mimo że ffmpeg automatycznie obrócił mp4 podczas konwersji. Więc moje filmy były do góry nogami, kiedy je odtwarzałem 🙂 – Obejściem w moim przypadku było poinformowanie ffmpeg, aby nie obracał się automatycznie za pomocą -noautorotate – szybkim rozwiązaniem jest użycie Exiftool i ustaw rotację na 0 – exiftool -Rotation=0 file.mp4

Odpowiedź

Opcja -metadata służy do manipulowania metadanymi. Jeśli chcesz tylko skopiować metadane z pliku wejściowego do pliku wyjściowego, użyj opcji -map_metadata :

ffmpeg -i a.MOV -map_metadata 0 -c copy c.MOV

Specyfikator pliku jest liczbą indeksowaną przez zero, więc „0” pobiera metadane z pierwszego pliku wejściowego.

Komentarze

  • Masz pomysł, jak to zadziałać z concat? na przykład. ffmpeg -nostdin -f concat -safe 1 -i "${concatlist}" -map_metadata 0 -c copy "$outfile" gdzie $concatlist to /tmp/concat.list z liniami takimi jak file 'filenamehere.mp3'
  • ok, rozumiem : ffmpeg -nostdin -i "${infile}" -f ffmetadata "${metadatafile}" następnie ffmpeg -nostdin -f concat -safe 1 -i "${concatlist}" -i "${metadatafile}" -map_metadata 1 -c copy "$outfile"
  • -map_metadata 0 lub -map_metadata 1?
  • @evandrix As podanej w odpowiedzi, 0 wybiera pierwszy plik wejściowy jako źródło. Aby uzyskać szczegółowe informacje, zobacz tę sekcję dokumentów ffmpeg .
  • ok, bardzo dziękuję ~

Odpowiedź

FFmpeg domyślnie udostępnia wszystkie metadane z pierwszego pliku wejściowego , do muxera pliku wyjściowego, w celu zapisu. -map_metadata pozwala to zmienić, wskazując inne dane wejściowe lub nakazując programowi ffmpeg odrzucenie globalnych metadanych wejściowych (wartość -1) .

Jednak to, który z dostępnych metadanych jest faktycznie zapisany do pliku wyjściowego, zależy od wyjściowy muxer. Muxer QT / ISOBMFF (dla MOV / MP4 / 3GP ..) uwzględnia tylko ograniczoną liczbę tagów, głównie związanych z iTunes. Jak zauważył @JerryTian, w przypadku -movflags use_metadata_tags wszystkie inne tagi są zapisywane w pliku. Są one jednak napisane w niekonwencjonalny sposób – w szczególności Quicktime nie rozpoznaje tych dodatkowych wpisów metadanych. Inne, oparte na ffmpeg, powinny je czytać. Lub każdy, kto używa niestandardowego s / w, takiego jak @JerryTian, może dostosować swoje s / w, aby je odczytać.

Zauważ, że movflags dotyczy tylko wyjścia z muxera QT. Matroska (MKV) zapisze cokolwiek. Inne muksery są różne.

Komentarze

  • Próbuję zachować metadane podczas konwersji muzyki. Mam niestandardowy KATALOGID, ale podczas konwertowania z wav na flac. Pole nie jest zachowywane. ffmpeg -i bb.wav bb2.flac -movflags use_metadata_tags. Masz jakiś pomysł?
  • Więc jeśli dobrze cię rozumiem, ' mówisz, że użycie FFmpeg do kodowania do pliku .mkv powinno domyślnie zachować wszystkie metadane ze źródła bez konieczności określania żadnych dodatkowych opcji?

Odpowiedź

Nie znalazłem sposobu na uzyskanie ffmpeg zachować dane. Odkryłem jednak, że do moich potrzeb potrzebowałem metadanych exif, a exiftool był wygodne rozwiązanie.

Możesz kopiować metadane między plikami wideo: https://unix.stackexchange.com/a/492338/83370

Istnieje sztuczka polegająca na skopiowaniu wszystkich metadanych za pomocą opcji -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 

Komentarze

  • Wszystkie powyższe próby próbowałem na plikach z Canona 200D, a ten jest faktycznie najbardziej przydatne. Nadal sprawia, że exiftool c.MOV jest dużo mniejsze niż oryginał, ale zachowuje faktyczną datę utworzenia (-map_metadata też, ale nie -movflags) i nazwa aparatu, ale informacji o obiektywie nadal nie ma.
  • OK, to był naprawdę świetny punkt wyjścia – wszystko, co musiałem zrobić to pominięcie tej części dotyczącej mapowania. Po prostu użycie exiftool -TagsFromFile in.mp4 out.mp4 wykonało zadanie!

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *