Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

expo-video

expo216.9kMIT2.1.8TypeScript support: included

A cross-platform, performant video component for React Native and Expo with Web support

react-native, expo, video, player

readme

Expo logo

Expo

Expo SDK version Chat or ask a question License: MIT Downloads

Try Expo in the Browser  •  Read the Documentation  •  Learn more on our blog  •  Request a feature

Follow us on

Expo on X   Expo on GitHub   Expo on Reddit   Expo on Bluesky   Expo on LinkedIn

Introduction

Expo is an open-source platform for making universal native apps that run on Android, iOS, and the web. It includes a universal runtime and libraries that let you build native apps by writing React and JavaScript.

This repository includes the Expo SDK, Modules API, Go app, CLI, Router, documentation, and various other supporting tools. Expo Application Services (EAS) is a platform of hosted services that are deeply integrated with Expo open source tools. EAS helps you build, ship, and iterate on your app as an individual or a team.

Read the Expo Community Guidelines before interacting in the repository. Thank you for helping keep the Expo community open and welcoming!

Table of contents

📚 Documentation

Learn about building and deploying universal apps in our official docs!

🗺 Project Layout

  • packages All the source code for Expo modules, if you want to edit a library or just see how it works this is where you'll find it.
  • apps This is where you can find Expo projects which are linked to the development modules. You'll do most of your testing in here.
  • apps/expo-go This is where you can find the source code for Expo Go.
  • apps/expo-go/ios/Exponent.xcworkspace is the Xcode workspace. When developing iOS, always open this instead of Exponent.xcodeproj because the workspace also loads the CocoaPods dependencies.
  • docs The source code for https://docs.expo.dev
  • templates The template projects you get when you run npx create-expo-app
  • react-native-lab This is our fork of react-native used to build Expo Go.
  • guides In-depth tutorials for advanced topics like contributing to the client.
  • tools contain build and configuration tools.
  • template-files contains templates for files that require private keys. They are populated using the keys in template-files/keys.json.
  • template-files/ios/dependencies.json specifies the CocoaPods dependencies of the app.

🏅 Badges

Let everyone know your app can be run instantly in the Expo Go app!

runs with Expo Go

runs with Expo Go

[![runs with Expo Go](https://img.shields.io/badge/Runs%20with%20Expo%20Go-000.svg?style=flat-square&logo=EXPO&labelColor=f3f3f3&logoColor=000)](https://expo.dev/client)

[![runs with Expo Go](https://img.shields.io/badge/Runs%20with%20Expo%20Go-4630EB.svg?style=flat-square&logo=EXPO&labelColor=f3f3f3&logoColor=000)](https://expo.dev/client)

👏 Contributing

If you like Expo and want to help make it better then check out our contributing guide! Check out the CLI package to work on the Expo CLI.

❓ FAQ

If you have questions about Expo and want answers, then check out our Frequently Asked Questions!

If you still have questions you can ask them on our Discord and Forums or X @expo.

💙 The Team

Curious about who makes Expo? Here are our team members!

License

The Expo source code is made available under the MIT license. Some of the dependencies are licensed differently, with the BSD license, for example.

Star the Expo repo on GitHub to support the project

changelog

Changelog

Unpublished

🛠 Breaking changes

🎉 New features

🐛 Bug fixes

💡 Others

2.1.8 — 2025-04-30

This version does not introduce any user-facing changes.

2.1.7 — 2025-04-28

🎉 New features

  • Introduce replaceAsync method, which doesn't load the asset on the main thread. (#36308 by @behenate)

🐛 Bug fixes

  • [iOS] Fix main thread being locked while the VideoPlayer is replacing or being created with a source. (#36308 by @behenate)

2.1.6 — 2025-04-25

🎉 New features

  • [Android] Add an option to choose the surface type. (#36212 by @behenate)

2.1.5 — 2025-04-23

🎉 New features

2.1.4 — 2025-04-22

🎉 New features

2.1.3 — 2025-04-21

This version does not introduce any user-facing changes.

2.1.2 — 2025-04-14

This version does not introduce any user-facing changes.

2.1.1 — 2025-04-09

This version does not introduce any user-facing changes.

2.1.0 — 2025-04-04

🎉 New features

  • [Android][iOS] Added an option to generateThumbnailsAsync to set the maximum size of generated thumbnails. (#33599 by @tsapeta), (#33712 by @behenate)
  • [Android][iOS] Add support for listing available video tracks and currently played video track. (#33458 by @behenate)
  • [Android][iOS] Add sourceLoad event. (#33458 by @behenate)
  • [Android][iOS] Add caching functionality. (#31781 by @behenate)
  • Add onFirstFrameRender event to the VideoView. (#35346 by @behenate)
  • Add useExoShutter property to the VideoView. (#35366 by @behenate)

🐛 Bug fixes

  • [Android] Fix ConcurrentModificationException app crashes (#35356 by @voslartomas)
  • [Web] Fix playbackRate not being applied in the setup function.(#34182 by @behenate)
  • Fix safe area insets not updating for native controls on iOS. (#32864 by @behenate)
  • [iOS] Fix the Now Playing notification disappearing after the video is paused. (#35273 by @behenate)
  • [iOS] Fix a race condition in setting the targets for the Now Playing controls causing the controls to sometimes not work. (#35274 by @behenate)
  • [iOS] Fix disabling the Now Playing controls for multiple players at the same time causing the notification to break. (#35275 by @behenate)
  • [Android] Fix touch events not being emitted for VideoView. (#35479 by @behenate)

💡 Others

  • Fixed generateThumbnailsAsync not being available on Android in the types. (#33491 by @hirbod)
  • Run VideoManager.setAppropriateAudioSessionOrWarn on a different queue for a lower load on the main thread. (#33127 by @behenate)
  • [Android] Started using expo modules gradle plugin. (#34176 by @lukmccall)
  • [apple] Migrate remaining expo-module.config.json to unified platform syntax. (#34445 by @reichhartd)
  • [iOS] SharedRef: migrate from pointer to ref (#30359 by @behenate)
  • [iOS] Fix warnings which will become errors in Swift 6. (#35288 by @behenate), (#35428 by @behenate)

2.0.5 - 2025-01-10

This version does not introduce any user-facing changes.

2.0.4 - 2025-01-08

🐛 Bug fixes

  • [iOS] Fix AVPlayer not deallocating when the player is unmounted. (#33922 by @behenate)

2.0.3 - 2024-12-19

🐛 Bug fixes

  • [iOS] Fix empty notification showing on iOS when showNowPlayingNotification is set to false. (#33698 by @behenate)
  • [iOS] Dispatch current player item changes on main queue to fix KVO-related crashes. (#33123 by @behenate)

2.0.2 - 2024-11-29

This version does not introduce any user-facing changes.

2.0.1 — 2024-11-19

🐛 Bug fixes

  • [Android] Fixed border related props weren't applied correctly. (#33075 by @lukmccall)
  • [Android] Fix controls sometimes flashing on initial display of the view, when useNativeControls is false (#33238 by @behenate)

2.0.0 — 2024-11-11

💡 Others

  • [Android] Modify aspect ratio coverage of Android PiP to be more specific (#32551 by @YangJonghun)

2.0.0-preview.2 — 2024-11-07

🎉 New features

  • [Android][iOS] Add support for listing and selecting closed captions. (#32582 by @behenate)

2.0.0-preview.1 — 2024-11-05

🎉 New features

  • [Android][iOS] Add audioMixingMode property to control how the player interacts with other audio in the system. (#32428 by @behenate)
  • Add support for creating a direct instance of VideoPlayer. (#32228 by @behenate)

🐛 Bug fixes

  • [Android] Fix errors when passing a source with an undefined uri field. (#32585 by @behenate)

2.0.0-preview.0 — 2024-10-22

🛠 Breaking changes

  • Bumped iOS and tvOS deployment target to 15.1. (#30840, #30859 by @tsapeta)
  • Changed the return type of all player events to a single object for a better support of the useEvent hook. (#32104 by @behenate)
  • Separated the volumeChange event into volumeChange and mutedChange events. (#32104 by @behenate)

🎉 New features

  • [Android][iOS] Add support for controlling the buffering behavior. (#30602 by @behenate)
  • [iOS] Add 'allowsExternalPlayback' property to control the AirPlay to stream video or mirror the screen. (#30436 by @adsalihac)
  • [iOS] Fixed player.currentTime being NaN when source is not provided and player.duration being NaN inside the hook callback when the source is updated. (#31011 by @AlirezaHadjar)
  • [Android] Fix not being able to select subtitles in the player. (#31829 by @fobos531)
  • Added generating video thumbnails. (#31807 by @tsapeta & #32037 by @lukmccall)
  • [Android][iOS] Add support for video artwork. (#32129 by @AlirezaHadjar)

🐛 Bug fixes

  • [Android] Fix FullscreenPlayerActivity not closing when the system returned to the MainActivity after backgrounding and reopening the app via icon. (#32044 by @behenate)
  • [Android] Fix Activity auto-entering Picture in Picture after leaving the screen with video. (#32043 by @behenate)
  • [Android] Fix startsPictureInPictureAutomatically not working in fullscreen mode. (#32043 by @behenate)
  • [Android] Fix video pausing after auto-entering Picture in Picture. (#32043 by @behenate)
  • [Android] Fix MainActivity sometimes entering Picture in Picture when entering fullscreen. (#32043 by @behenate)
  • [Android] Fix support for local file playback. (#30472 by @behenate)
  • Only import from expo/config-plugins to follow proper dependency chains. (#30499 by @byCedric)
  • [Android] Fix an issue where using non-ASCII characters in the application name would cause the media to not play. (#31659 by @fobos531)
  • [Android] Fix an issue where the entire app would go into picture-in-picture after unmounting the video if the startsPictureInPictureAutomatically prop was enabled. (#31901 by @fobos531)

💡 Others

⚠️ Notices

1.2.7 - 2024-09-26

🐛 Bug fixes

1.2.6 - 2024-09-13

🛠 Breaking changes

  • showNowPlayingNotification property of the player now defaults to false. (#31261 by @behenate)

🎉 New features

  • [Android][iOS] Add properties for more advanced live stream configuration. (#30648 by @justjoostnl)
  • [iOS] Add live indicator in the now playing info. (#30629 by @justjoostnl)
  • Add fullscreen enter and exit events. (#30922 by @fobos531)
  • Add support for playback of local assets imported with the require function. (#30837 by @behenate)
  • [Web] Add support for Picture in Picture. (#30524 by @behenate)
  • Add timeUpdate event configured with timeUpdateEventInterval property.(#31327 by @behenate)

🐛 Bug fixes

  • [Android] Fix wrong event being sent when the volume is changed. (#30891 by @behenate)

💡 Others

  • Bump media3 version to 1.4.0. (#31239 by @behenate)
  • [Android] The media will now be buffered even when the player is unmounted to match iOS behavior. (#30626 by @behenate)

1.2.4 - 2024-07-30

🐛 Bug fixes

  • [Android] Fix Audio Manager pausing player on the wrong thread and conflicts between players. (#30453 by @behenate)

💡 Others

1.2.3 - 2024-07-11

🛠 Breaking changes

  • [Android][iOS] Now Picture in Picture has to be enabled via the config plugin to work. (#30068 by @behenate)

🎉 New features

🐛 Bug fixes

  • [Web] Fix AudioContext being created before user interaction causing playback issues. (#29695 by @behenate)
  • [iOS] Fix a race condition causing crashes when deallocating the player. (#30022 by @behenate)
  • Add missing react and react-native peer dependencies for isolated modules. (#30489 by @byCedric)

1.2.2 - 2024-07-03

🐛 Bug fixes

  • [iOS] Fix crashes on iOS 16 and lower when source HTTP headers are undefined. (#30104 by @behenate)

1.2.1 - 2024-06-27

🎉 New features

1.2.0 - 2024-06-20

🎉 New features

🐛 Bug fixes

  • [Android] Fix wrong content fit "fill" and "cover". (#29364 by @RRaideRR)
  • [iOS] Fix player status property always returning undefined on iOS. (#29505 by @behenate)
  • [Android] Fix VideoPlayer.replace not working when the previous source caused an error. (#29598 by @lukmccall)
  • [Web] Fix default behavior for nativeControls to match documentation. (#29667 by @nahn20)
  • [iOS] Fix crashes when creating new players. (#29428 by @behenate)
  • Fix errors on setting a null video source. (#29613 by @behenate)

💡 Others

  • [iOS] Make appropriate references weak in VideoPlayerObserver. (#29427 by @behenate)

1.1.10 - 2024-05-29

💡 Others

1.1.9 — 2024-05-13

🎉 New features

1.1.8 — 2024-05-07

This version does not introduce any user-facing changes.

1.1.7 — 2024-05-06

This version does not introduce any user-facing changes.

1.1.6 — 2024-05-01

🎉 New features

  • [Android] Add support for customizing the now playing notification. (#28390 by @behenate)

💡 Others

1.1.5 — 2024-04-26

🎉 New features

  • [iOS] Add support for customizing the now playing notification. (#28386 by @behenate)

1.1.4 — 2024-04-25

This version does not introduce any user-facing changes.

1.1.3 — 2024-04-24

This version does not introduce any user-facing changes.

1.1.2 — 2024-04-24

This version does not introduce any user-facing changes.

1.1.1 — 2024-04-23

This version does not introduce any user-facing changes.

1.1.0 — 2024-04-18

🎉 New features

🐛 Bug fixes

💡 Others

  • Removed deprecated backward compatible Gradle settings. (#28083 by @kudo)

0.3.1 — 2023-12-12

This version does not introduce any user-facing changes.

0.3.0 — 2023-12-12

🎉 New features

0.2.0 — 2023-11-14

🛠 Breaking changes

0.1.0 — 2023-10-30

🎉 New features

  • Initial release for iOS 🎉