- CropPlan: Ausschnitt-Offset pro Datei, mit Marken ab Zeitpunkt X (harte
Schnitte). CropEngine schneidet pro Frame nach Plan; cropRect ist die
gemeinsame Geometrie für Vorschau und Render.
- CropEngine wendet die Track-Transformation an: iPhone-Clips (quer
gespeichert, per 90°-Drehung hochkant) wurden bisher seitlich und mit
schwarzem Balken gerendert.
- FileNameParser erkennt 9x16/9X16/9×16, getrennt mit -, _ oder Leerzeichen,
Trenner bleiben erhalten; Rest hinter dem Format optional.
appendingTargetFormat hängt bei fehlendem Format "4x5" an.
- ConversionPipeline/JobQueue: appendFormatWhenMissing und CropPlan pro Job.
- Tests: Render-Richtung, Marken mitten im Clip, gedrehte Quelle, Parser-
Schreibweisen, Anhängen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ShKCZzkdZhym6mHuPqXQAT
Schritt 2 der Umsetzungsreihenfolge.
VideoInspector liest Dimension (orientierungskorrigiert), Codec,
Framerate, Dauer und Audiospur-Vorhandensein über die moderne
async AVFoundation-API.
CropEngine läuft über AVAssetReader/AVAssetWriter statt
AVAssetExportSession, weil das die volle Kontrolle über Zielbitrate
und Profil gibt. Zielformat ist fest MP4/H.264/AAC, unabhängig vom
Quellcodec — das Deliverable landet ausschließlich bei Meta Ads.
Bitrate wird aus Auflösung × Framerate abgeleitet (Faustregel,
überschreibbar über Options), Audio läuft nicht mehr per Passthrough,
sondern wird nach AAC-LC transkodiert. Crop bleibt volle Breite,
vertikal zentriert, Höhe auf gerade Zahl gerundet.
Tests synthetisieren ihre Clips zur Laufzeit per AVAssetWriter
(TestVideoFactory) statt Binärdateien einzuchecken.