The Future of Video in React Native: Moving from Expo AV to Expo Video
Article Summary
Wiktor Gut from Software Mansion just migrated Expensify to expo-video, and the architectural shift is bigger than you think. Expo SDK 55 officially removes expo-av, forcing every React Native team to rethink video playback.
Software Mansion's Wiktor Gut led the migration from expo-av to expo-video at Expensify and breaks down the fundamental changes. This isn't just a library swap: it's a complete architectural redesign that separates playback logic from UI rendering, mirroring native iOS and Android patterns.
Key Takeaways
- VideoPlayer and VideoView replace monolithic Video component for logic/UI separation
- Synchronous function calls eliminate async/await boilerplate for play/pause/mute
- Event subscription model replaces massive onPlaybackStatusUpdate callback
- useEvent and useEventListener hooks prevent unnecessary re-renders on time updates
expo-video brings native-level control to React Native video with a hook-based API that dramatically reduces boilerplate and improves performance through granular event handling.
About This Article
React Native developers using expo-av ran into performance issues because the onPlaybackStatusUpdate callback fired constantly. It triggered on every state change, including multiple time updates each second, which meant handler logic got re-evaluated far too often.
expo-video switched to a subscription-based event model with useEvent and useEventListener hooks. These hooks break updates into separate, focused events so that logic only runs when something actually changes.
This approach cuts down on callback overhead. The isPlaying state now updates only when playingChange fires, and playbackRateChange logic runs only when the rate shifts. Previously, both would re-evaluate every time currentTime updated.