2015-03-30 23:07:55 -06:00
## react-native-video
2016-05-09 12:37:33 -06:00
A `<Video>` component for react-native, as seen in
2015-06-25 13:47:57 -06:00
[react-native-login ](https://github.com/brentvatne/react-native-login )!
2015-03-30 23:51:58 -06:00
2016-03-24 20:40:04 -06:00
Requires react-native >= 0.19.0
2015-06-10 11:28:51 -06:00
2015-03-30 23:51:58 -06:00
### Add it to your project
2016-08-16 14:34:14 -06:00
Run `npm i -S react-native-video`
2015-12-08 03:37:15 -07:00
#### iOS
2016-11-15 15:53:47 -07:00
Run `react-native link` to link the react-native-video library.
2015-03-30 23:51:58 -06:00
2016-04-28 22:40:46 -06:00
If you would like to allow other apps to play music over your video component, add:
**AppDelegate.m**
2016-08-16 14:34:14 -06:00
```objective-c
2016-04-28 22:40:46 -06:00
#import <AVFoundation/AVFoundation.h> // import
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary * )launchOptions
{
...
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil]; // allow
...
}
```
2015-12-08 03:37:15 -07:00
#### Android
2016-11-15 15:53:47 -07:00
Run `react-native link` to link the react-native-video library.
2016-05-03 19:23:10 -06:00
2016-11-15 15:53:47 -07:00
Or if you have trouble, make the following additions to the given files manually:
2015-12-08 03:37:15 -07:00
**android/settings.gradle**
2016-08-16 14:34:14 -06:00
2015-12-08 03:37:15 -07:00
```
2016-05-03 19:23:10 -06:00
include ':react-native-video'
project(':react-native-video').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-video/android')
2015-12-08 03:37:15 -07:00
```
**android/app/build.gradle**
2016-08-16 14:34:14 -06:00
2015-12-08 03:37:15 -07:00
```
dependencies {
...
2016-05-03 19:23:10 -06:00
compile project(':react-native-video')
2015-12-08 03:37:15 -07:00
}
```
**MainActivity.java**
On top, where imports are:
2016-08-16 14:34:14 -06:00
2015-12-08 03:37:15 -07:00
```java
import com.brentvatne.react.ReactVideoPackage;
```
Under `.addPackage(new MainReactPackage())` :
2016-08-16 14:34:14 -06:00
2015-12-08 03:37:15 -07:00
```java
.addPackage(new ReactVideoPackage())
```
2015-03-30 23:51:58 -06:00
2016-08-16 14:34:14 -06:00
### Note: In react-native >= 0.29.0 you have to edit `MainApplication.java`
2016-07-27 22:44:18 -06:00
**MainApplication.java** (react-native >= 0.29.0)
On top, where imports are:
2016-08-16 14:34:14 -06:00
2016-07-27 22:44:18 -06:00
```java
import com.brentvatne.react.ReactVideoPackage;
```
Under `.addPackage(new MainReactPackage())` :
2016-08-16 14:34:14 -06:00
2016-07-27 22:44:18 -06:00
```java
.addPackage(new ReactVideoPackage())
```
2016-11-09 12:31:42 -07:00
#### Windows
Make the following additions to the given files manually:
**windows/myapp.sln**
Add the `ReactNativeVideo` project to your solution.
2016-11-09 17:05:45 -07:00
2016-11-09 12:31:42 -07:00
1. Open the solution in Visual Studio 2015
2. Right-click Solution icon in Solution Explorer > Add > Existing Project...
3. Select `node_modules\react-native-video\windows\ReactNativeVideo\ReactNativeVideo.csproj`
**windows/myapp/myapp.csproj**
2016-11-10 13:27:26 -07:00
Add a reference to `ReactNativeVideo` to your main application project. From Visual Studio 2015:
2016-11-09 17:05:45 -07:00
2016-11-09 12:31:42 -07:00
1. Right-click main application project > Add > Reference...
2. Check `ReactNativeVideo` from Solution Projects.
**MainPage.cs**
Add the `ReactVideoPackage` class to your list of exported packages.
```cs
using ReactNative;
using ReactNative.Modules.Core;
using ReactNative.Shell;
using ReactNativeVideo; // < -- Add this
using System.Collections.Generic;
...
public override List< IReactPackage > Packages
{
get
{
return new List< IReactPackage >
{
new MainReactPackage(),
new ReactVideoPackage(), // < -- Add this
};
}
}
...
```
2015-05-12 17:11:14 -06:00
## Usage
2015-03-30 23:51:58 -06:00
```javascript
// Within your render function, assuming you have a file called
2015-04-04 18:57:35 -06:00
// "background.mp4" in your project. You can include multiple videos
// on a single screen if you like.
2016-10-01 12:23:50 -06:00
< Video source = {{uri: " background " } } / / Can be a URL or a local file .
2016-11-03 14:43:09 -06:00
ref={(ref) => {
this.player = ref
}} // Store reference
2016-10-01 12:23:50 -06:00
rate={1.0} // 0 is paused, 1 is normal.
volume={1.0} // 0 is muted, 1 is normal.
muted={false} // Mutes the audio entirely.
paused={false} // Pauses playback entirely.
resizeMode="cover" // Fill the whole screen at aspect ratio.
repeat={true} // Repeat forever.
playInBackground={false} // Audio continues to play when app entering background.
playWhenInactive={false} // [iOS] Video continues to play when control or notification center are shown.
progressUpdateInterval={250.0} // [iOS] Interval to fire onProgress (default to ~250ms)
onLoadStart={this.loadStart} // Callback when video starts to load
onLoad={this.setDuration} // Callback when video loads
onProgress={this.setTime} // Callback every ~250ms with currentTime
onEnd={this.onEnd} // Callback when playback finishes
onError={this.videoError} // Callback when video cannot be loaded
2017-01-11 05:51:45 -07:00
onBuffer={this.onBuffer} // Callback when remote video is buffering
2016-10-01 12:23:50 -06:00
style={styles.backgroundVideo} />
2015-03-30 23:51:58 -06:00
2016-11-03 14:43:09 -06:00
// Later to trigger fullscreen
this.player.presentFullscreenPlayer()
// To set video position in seconds (seek)
this.player.seek(0)
2015-03-30 23:51:58 -06:00
// Later on in your styles..
2016-02-28 09:50:45 -07:00
var styles = StyleSheet.create({
2015-03-30 23:51:58 -06:00
backgroundVideo: {
position: 'absolute',
top: 0,
left: 0,
bottom: 0,
right: 0,
},
});
2015-03-30 23:57:04 -06:00
```
2015-12-08 03:37:15 -07:00
2016-09-14 05:28:06 -06:00
## Android Expansion File Usage
```javascript
// Within your render function, assuming you have a file called
// "background.mp4" in your expansion file. Just add your main and (if applicable) patch version
< Video source = {{uri: " background " , mainVer: 1 , patchVer: 0 } } / / Looks for . mp4 file ( background . mp4 ) in the given expansion version .
rate={1.0} // 0 is paused, 1 is normal.
volume={1.0} // 0 is muted, 1 is normal.
muted={false} // Mutes the audio entirely.
paused={false} // Pauses playback entirely.
resizeMode="cover" // Fill the whole screen at aspect ratio.
repeat={true} // Repeat forever.
onLoadStart={this.loadStart} // Callback when video starts to load
onLoad={this.setDuration} // Callback when video loads
onProgress={this.setTime} // Callback every ~250ms with currentTime
onEnd={this.onEnd} // Callback when playback finishes
onError={this.videoError} // Callback when video cannot be loaded
style={styles.backgroundVideo} />
// Later on in your styles..
var styles = Stylesheet.create({
backgroundVideo: {
position: 'absolute',
top: 0,
left: 0,
bottom: 0,
right: 0,
},
});
```
2016-08-16 14:34:14 -06:00
### Load files with the RN Asset System
2016-09-10 09:48:10 -06:00
The asset system [introduced in RN `0.14` ](http://www.reactnative.com/react-native-v0-14-0-released/ ) allows loading image resources shared across iOS and Android without touching native code. As of RN `0.31` [the same is true ](https://github.com/facebook/react-native/commit/91ff6868a554c4930fd5fda6ba8044dbd56c8374 ) of mp4 video assets for Android. As of [RN `0.33` ](https://github.com/facebook/react-native/releases/tag/v0.33.0 ) iOS is also supported. Requires `react-native-video@0.9.0` .
2016-08-16 14:34:14 -06:00
```
< Video
repeat
resizeMode='cover'
2016-08-21 00:29:36 -06:00
source={require('../assets/video/turntable.mp4')}
2016-08-16 14:34:14 -06:00
style={styles.backgroundVideo}
/>
```
2016-06-02 00:29:16 -06:00
### Play in background on iOS
2016-08-30 06:18:19 -06:00
To enable audio to play in background on iOS the audio session needs to be set to `AVAudioSessionCategoryPlayback` . See [Apple documentation][3] for additional details. (NOTE: there is now a ticket to [expose this as a prop ]( https://github.com/react-native-community/react-native-video/issues/310 ) )
2016-06-02 00:29:16 -06:00
2015-06-25 07:54:47 -06:00
## Static Methods
`seek(seconds)`
Seeks the video to the specified time (in seconds). Access using a ref to the component
2015-03-30 23:51:58 -06:00
2016-11-03 14:43:09 -06:00
`presentFullscreenPlayer()`
Toggles a fullscreen player. Access using a ref to the component.
2015-05-12 17:11:14 -06:00
## Examples
2016-08-16 14:34:14 -06:00
- See an [Example integration][1] in `react-native-login` *note that this example uses an older version of this library, before we used `export default` -- if you use `require` you will need to do `require('react-native-video').default` as per instructions above.*
2015-05-12 17:11:14 -06:00
- Try the included [VideoPlayer example][2] yourself:
```sh
git clone git@github.com:brentvatne/react-native-video.git
cd react-native-video/Examples/VideoPlayer
npm install
open VideoPlayer.xcodeproj
```
Then `Cmd+R` to start the React Packager, build and run the project in the simulator.
2016-08-16 14:34:14 -06:00
- [Lumpen Radio ](https://github.com/jhabdas/lumpen-radio ) contains another example integration using local files and full screen background video.
2015-03-31 00:06:54 -06:00
## TODOS
2015-04-05 11:26:40 -06:00
- [ ] Add support for captions
2015-04-05 11:25:04 -06:00
- [ ] Add support for playing multiple videos in a sequence (will interfere with current `repeat` implementation)
2017-01-11 05:51:45 -07:00
- [x] Callback to get buffering progress for remote videos
2016-08-16 14:41:35 -06:00
- [ ] Bring API closer to HTML5 `<Video>` [reference ](http://devdocs.io/html/element/video )
2015-05-12 17:11:14 -06:00
[1]: https://github.com/brentvatne/react-native-login/blob/56c47a5d1e23781e86e19b27e10427fd6391f666/App/Screens/UserInfoScreen.js#L32-L35
2016-10-06 15:34:20 -06:00
[2]: https://github.com/react-native-community/react-native-video/tree/master/example
2016-06-02 00:29:16 -06:00
[3]: https://developer.apple.com/library/ios/qa/qa1668/_index.html
2015-05-17 12:40:23 -06:00
---
**MIT Licensed**