A comprehensive React Native video player component with streaming, DRM, and Picture-in-Picture support
—
Expo Config Plugins for configuring native features like Picture-in-Picture, background audio, advertisement integration, video caching, and ExoPlayer extensions for seamless React Native Video integration in Expo projects.
Primary configuration plugin that orchestrates all React Native Video native features.
/**
* Main Expo Config Plugin for React Native Video
* Configures native features based on provided options
*/
declare const withRNVideo: ConfigPlugin<ConfigProps>;
/**
* Configuration options for React Native Video Expo plugin
*/
interface ConfigProps {
reactNativeTestApp?: boolean;
enableNotificationControls?: boolean;
enableAndroidPictureInPicture?: boolean;
enableBackgroundAudio?: boolean;
enableADSExtension?: boolean;
enableCacheExtension?: boolean;
androidExtensions?: AndroidExtensionsConfig;
}Usage Examples:
// app.config.js - Basic configuration
export default {
expo: {
name: "My Video App",
plugins: [
["react-native-video", {
enableNotificationControls: true,
enableAndroidPictureInPicture: true,
enableBackgroundAudio: true
}]
]
}
};
// app.config.js - Advanced configuration with all features
export default {
expo: {
name: "Advanced Video App",
plugins: [
["react-native-video", {
enableNotificationControls: true,
enableAndroidPictureInPicture: true,
enableBackgroundAudio: true,
enableADSExtension: true,
enableCacheExtension: true,
androidExtensions: {
useExoplayerRtsp: true,
useExoplayerSmoothStreaming: true,
useExoplayerDash: true,
useExoplayerHls: true
}
}]
]
}
};Enable media session controls and lock screen playback information.
/**
* Configuration for media notification controls
* Enables lock screen controls and media session integration
* Platforms: iOS, Android
*/
interface NotificationControlsConfig {
enableNotificationControls: boolean;
}Usage Examples:
// Enable notification controls
{
plugins: [
["react-native-video", {
enableNotificationControls: true
}]
]
}Features Enabled:
FOREGROUND_SERVICE, FOREGROUND_SERVICE_MEDIA_PLAYBACK (Android)Configure Picture-in-Picture support for Android devices.
/**
* Configuration for Picture-in-Picture functionality
* Platform: Android
*/
interface PictureInPictureConfig {
enableAndroidPictureInPicture: boolean;
}Usage Examples:
// Enable Android Picture-in-Picture
{
plugins: [
["react-native-video", {
enableAndroidPictureInPicture: true
}]
]
}Features Enabled:
Enable background audio playback capabilities.
/**
* Configuration for background audio playback
* Platforms: iOS, Android
*/
interface BackgroundAudioConfig {
enableBackgroundAudio: boolean;
}Usage Examples:
// Enable background audio
{
plugins: [
["react-native-video", {
enableBackgroundAudio: true
}]
]
}Features Enabled:
Configure IMA SDK integration for video advertisements.
/**
* Configuration for advertisement support using IMA SDK
* Platforms: iOS, Android
*/
interface ADSConfig {
enableADSExtension: boolean;
testApp?: boolean;
}Usage Examples:
// Enable advertisement support
{
plugins: [
["react-native-video", {
enableADSExtension: true
}]
]
}
// Enable ads for test app
{
plugins: [
["react-native-video", {
enableADSExtension: true,
reactNativeTestApp: true
}]
]
}Features Enabled:
Enable video caching capabilities for iOS.
/**
* Configuration for video caching functionality
* Platform: iOS
*/
interface CacheConfig {
enableCacheExtension: boolean;
testApp?: boolean;
}Usage Examples:
// Enable video caching (iOS)
{
plugins: [
["react-native-video", {
enableCacheExtension: true
}]
]
}Features Enabled:
Configure ExoPlayer protocol extensions for Android.
/**
* Configuration for ExoPlayer extensions on Android
* Controls which streaming protocols are included to optimize app size
* Platform: Android
*/
interface AndroidExtensionsConfig {
useExoplayerRtsp?: boolean;
useExoplayerSmoothStreaming?: boolean;
useExoplayerDash?: boolean;
useExoplayerHls?: boolean;
}Usage Examples:
// Default configuration (recommended)
{
plugins: [
["react-native-video", {
androidExtensions: {
useExoplayerRtsp: false, // Minimal use case
useExoplayerSmoothStreaming: true, // Common for streaming
useExoplayerDash: true, // Common for adaptive streaming
useExoplayerHls: true // Very common for streaming
}
}]
]
}
// All extensions enabled
{
plugins: [
["react-native-video", {
androidExtensions: {
useExoplayerRtsp: true,
useExoplayerSmoothStreaming: true,
useExoplayerDash: true,
useExoplayerHls: true
}
}]
]
}
// Minimal configuration for basic MP4 playback
{
plugins: [
["react-native-video", {
androidExtensions: {
useExoplayerRtsp: false,
useExoplayerSmoothStreaming: false,
useExoplayerDash: false,
useExoplayerHls: false
}
}]
]
}Protocol Support:
// app.config.js - Comprehensive streaming app setup
export default {
expo: {
name: "StreamMax",
slug: "streammax",
version: "1.0.0",
platforms: ["ios", "android"],
plugins: [
["react-native-video", {
// Core features
enableNotificationControls: true,
enableBackgroundAudio: true,
enableAndroidPictureInPicture: true,
// Monetization
enableADSExtension: true,
// Offline support
enableCacheExtension: true,
// Streaming protocols
androidExtensions: {
useExoplayerHls: true, // For live streaming
useExoplayerDash: true, // For adaptive streaming
useExoplayerSmoothStreaming: true, // For legacy content
useExoplayerRtsp: false // Not needed for most apps
}
}]
]
}
};// app.config.js - Educational content with offline support
export default {
expo: {
name: "EduVideo",
plugins: [
["react-native-video", {
// Essential for educational content
enableBackgroundAudio: true,
enableNotificationControls: true,
// Offline learning support
enableCacheExtension: true,
// No ads for educational content
enableADSExtension: false,
// Basic streaming support
androidExtensions: {
useExoplayerHls: true,
useExoplayerDash: false,
useExoplayerSmoothStreaming: false,
useExoplayerRtsp: false
}
}]
]
}
};// app.config.js - Live streaming focused configuration
export default {
expo: {
name: "LiveStream",
plugins: [
["react-native-video", {
// Live streaming essentials
enableNotificationControls: true,
enableBackgroundAudio: true,
enableAndroidPictureInPicture: true,
// Comprehensive protocol support for live content
androidExtensions: {
useExoplayerHls: true, // Primary live streaming
useExoplayerDash: true, // Alternative live streaming
useExoplayerRtsp: true, // Direct live streams
useExoplayerSmoothStreaming: false // Not common for live
}
}]
]
}
};// app.config.js - Minimal setup for basic video playback
export default {
expo: {
name: "SimpleVideo",
plugins: [
["react-native-video", {
// Basic functionality only
enableNotificationControls: false,
enableBackgroundAudio: false,
enableAndroidPictureInPicture: false,
enableADSExtension: false,
enableCacheExtension: false,
// No additional protocols (supports basic MP4/MOV)
androidExtensions: {
useExoplayerHls: false,
useExoplayerDash: false,
useExoplayerSmoothStreaming: false,
useExoplayerRtsp: false
}
}]
]
}
};The main plugin orchestrates several specialized sub-plugins:
/**
* Individual plugin components (internal)
*/
declare const withNotificationControls: ConfigPlugin<boolean>;
declare const withAndroidPictureInPicture: ConfigPlugin<boolean>;
declare const withBackgroundAudio: ConfigPlugin<boolean>;
declare const withAds: ConfigPlugin<{ enableADSExtension: boolean; testApp?: boolean }>;
declare const withCaching: ConfigPlugin<{ enableCachingExtension: boolean; testApp?: boolean }>;
declare const withAndroidExtensions: ConfigPlugin<AndroidExtensionsConfig>;The plugins modify native project files to enable features:
iOS (ios/Podfile, Info.plist):
Android (android/app/build.gradle, AndroidManifest.xml):
// Enable only features you actually use to minimize app size
{
plugins: [
["react-native-video", {
// Only enable features your app actually uses
enableNotificationControls: true, // If you want lock screen controls
enableBackgroundAudio: false, // If no background playback needed
enableAndroidPictureInPicture: true, // If PiP is desired
enableADSExtension: false, // If no advertisements
androidExtensions: {
// Only include protocols you actually support
useExoplayerHls: true, // Most common
useExoplayerDash: false, // Only if needed
useExoplayerSmoothStreaming: false, // Legacy protocol
useExoplayerRtsp: false // Specialized use case
}
}]
]
}// Development/testing configuration
{
plugins: [
["react-native-video", {
reactNativeTestApp: true, // Enable test app specific configurations
enableADSExtension: true,
enableCacheExtension: true
}]
]
}// Production configuration - optimized for performance and size
{
plugins: [
["react-native-video", {
// Core features most apps need
enableNotificationControls: true,
enableBackgroundAudio: true,
enableAndroidPictureInPicture: true,
// Only enable if monetizing
enableADSExtension: false,
// Only enable if offering offline content
enableCacheExtension: false,
// Minimal protocol support
androidExtensions: {
useExoplayerHls: true, // Essential for streaming
useExoplayerDash: false, // Add only if needed
useExoplayerSmoothStreaming: false,
useExoplayerRtsp: false
}
}]
]
}Install with Tessl CLI
npx tessl i tessl/npm-react-native-video