Farbschema
Ansicht
Hero-Effekt
Alle Einträge
2025 · #pipeline

90 GB Google-Fotos-Videos auf 8,5 GB verkleinert

Meine Fotos von Google geholt und die Videos um 90 % verkleinert, ohne Datum und Ort zu verlieren.

Ergebnis
89,93 GB → 8,51 GB
Kontext
Eigenes Projekt
Stack
Python · FFmpeg (H.265) · ExifTool
Gemessen an
909 Videos

Das Problem

Mein Speicher bei Google Fotos war voll, und das meiste davon waren Videos, jahrelang aufgenommene Handyvideos bis zurück ins Jahr 2013. Der einfache Ausweg wäre gewesen, auf einen größeren Google-Fotos-Tarif zu wechseln und mehr zu zahlen. Das wollte ich aber eigentlich nicht. Ich hatte schon einen Mini-PC mit einem Immich-Server eingerichtet, also dachte ich mir: Ich exportiere die Originale aus Google Fotos, lege sie über den Immich-Server auf meinem HDD-NAS ab und lade stattdessen die konvertierten, kleineren Versionen wieder zu Google Fotos hoch.

Warum nicht einfach neu kodieren und wieder hochladen

Takeout liefert zwar die Videos, aber Datum und Ort jedes Videos stehen in einer separaten JSON-Datei daneben. Wenn man nur das Video komprimiert und wieder hochlädt, sind diese Informationen weg und die Zeitleiste gerät durcheinander. Außerdem sind die JSON-Dateien nicht einmal einheitlich benannt. Google kürzt lange Dateinamen, sodass dieselbe Art von Datei auf .supplemental-metadata.json, .supp.json oder eine der Varianten dazwischen enden kann.

Eine einzige Kompressionseinstellung passte auch nicht für alles. Bei kleinen Clips lohnte es sich nicht, und die wirklich großen 4K-Videos brauchten deutlich mehr als der Rest.

Was ich gemacht habe

Ich habe ein Python-Skript rund um FFmpeg und ExifTool geschrieben. Nichts Besonderes, klar, aber ein paar Dinge daran haben den Unterschied gemacht:

  • Es wählt die Kompressionsstufe nach Dateigröße. Unter 15 MB wird die Datei nur kopiert. Zwischen 15 MB und 3 GB wird sie in H.265 mit 1080p und CRF 28 umgewandelt, über 3 GB in H.265 mit 720p und CRF 32.
  • Es liest für jedes Video die Takeout-JSON, probiert alle gekürzten Dateinamen durch und schreibt Datum und GPS mit ExifTool zurück in die neue Datei. Videos ohne JSON behalten ihre eigenen Metadaten.
  • Es überspringt Dateien, die schon fertig sind, sodass ich es anhalten und später wieder starten konnte. Auch praktisch, wenn neue Videos dazukommen.
  • Es schreibt ein CSV-Log mit Größe vorher und nachher, Dauer und Status für jede Datei, dazu eine Zusammenfassung am Ende.

Laufen lassen habe ich es auf meinem Laptop mit Pop!_OS.

Ergebnis

Videos 909
Größe vorher 89,93 GB
Größe nachher 8,51 GB
Gespart 81,41 GB (90,53 %)
Kopiert / normal / aggressiv 427 / 481 / 1
Fehlgeschlagen 0
Gesamtdauer 6 h 43 min, etwa 27 s pro Video

Danach gingen die komprimierten Videos zurück zu Google Fotos, die Originale auf den Immich-Server, und den größeren Tarif brauchte ich nicht.

Was ich heute anders machen würde

Die Qualität habe ich nur nach Augenmaß an einigen Videos beurteilt, und für mich sah sie gut aus. Als ich den Code später noch einmal durchgegangen bin, ist mir aufgefallen, dass die Skalierung die Höhe auf 1080 setzt. Möglicherweise wurden also nicht alle Videos richtig skaliert oder komprimiert (herunter- oder hochskaliert). Beim nächsten Mal würde ich diesen Teil wahrscheinlich dynamischer machen und mich stärker an den Eigenschaften des jeweiligen Videos orientieren.

Wie es weitergeht

Das Skript hat seinen Zweck erfüllt, aber ich will es verbessern:

Nächste Fallstudie →Alte Suche: von 50 Sekunden auf unter 4