A native iOS video speed editor built with Swift and SwiftUI. Pick videos from your Photos library, preview them at adjustable playback speeds, and export time-scaled copies — with audio — back to your library.
AVQueuePlayer and AVPlayerLooperAVMutableComposition, preserving sync at any speedShape-based lightning bolt animation with staggered easingaccessibilityAdjustableAction), semantic colors for dark/light mode, Dynamic Type support| Technology | Usage |
|---|---|
| Swift / SwiftUI | UI layer, state management, navigation |
| AVFoundation | AVQueuePlayer, AVPlayerLooper, AVMutableComposition, AVAssetExportSession |
| PhotosUI | PhotosPicker for native Photos library access |
| Photos | PHImageManager, PHPhotoLibrary for asset fetching and saving |
| CoreMedia | CMTime arithmetic for time-scaling composition tracks |
| UniformTypeIdentifiers | Transferable conformance for video file handling |
SpeedUPSIApp → App entry point
├── SplashView → Animated launch screen (transitions to ContentView)
└── ContentView → Main screen: video player, speed controls, export
├── VideoView → AVQueuePlayer wrapper with looping and speed binding
├── SpeedPicker → Custom horizontal scroll speed selector
└── VideoSlot → State-driven card (empty → uploading → ready)
State management: Local @State properties in ContentView with @Binding passed to child views.
Export pipeline: AVMutableComposition → insert video + audio tracks → scaleTimeRange by 1/speed → AVAssetExportSession at highest quality → save to Photos library → clean up temp file.
SpeedUPSI/
├── SpeedUPSIApp.swift # App entry point
├── ContentView.swift # Main view, video loading, export engine, Photos fetchers
├── SpeedPicker.swift # Custom horizontal scroll speed picker
├── SplashView.swift # Animated splash screen with LightningBolt shape
├── VideoSlot.swift # VideoState enum and state-driven card component
├── Info.plist # App configuration
└── Assets.xcassets/ # App icon and asset catalog
SpeedUPSITests/
└── SpeedUPSITests.swift # Unit tests (speed label formatting, VideoState, time-scaling math)
SpeedUPSI.xcodeproj in XcodeCmd + R)No external dependencies or package managers required.
xcodebuild test -scheme SpeedUPSI -destination 'platform=iOS Simulator,name=iPhone 15'
Tests cover:
cleanSpeedLabel() — trailing zero stripping and decimal formattingVideoState enum — all cases construct correctlyCMTime arithmetic at 0.25x, 0.5x, 1x, 2x, and 10x speedsThis project is part of a personal 90-day iOS + AI learning challenge.