81b42e7ca7
This PR adds support for DRM streams on iOS (Fairplay) and Android (Playready, Widevine, Clearkey) I am neither Android nor iOS developer, so feel free to provide feedback to improve this PR. **Test stream for ANDROID:** ``` testStream = { uri: 'http://profficialsite.origin.mediaservices.windows.net/c51358ea-9a5e-4322-8951-897d640fdfd7/tearsofsteel_4k.ism/manifest(format=mpd-time-csf)', type: 'mpd', drm: { type: DRMType.PLAYREADY, licenseServer: 'http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(persist:false,sl:150)' } }; ``` or ``` { uri: 'https://media.axprod.net/TestVectors/v7-MultiDRM-SingleKey/Manifest_1080p.mpd', drm: { type: 'widevine', //or DRMType.WIDEVINE licenseServer: 'https://drm-widevine-licensing.axtest.net/AcquireLicense', headers: { 'X-AxDRM-Message': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ2ZXJzaW9uIjoxLCJjb21fa2V5X2lkIjoiYjMzNjRlYjUtNTFmNi00YWUzLThjOTgtMzNjZWQ1ZTMxYzc4IiwibWVzc2FnZSI6eyJ0eXBlIjoiZW50aXRsZW1lbnRfbWVzc2FnZSIsImZpcnN0X3BsYXlfZXhwaXJhdGlvbiI6NjAsInBsYXlyZWFkeSI6eyJyZWFsX3RpbWVfZXhwaXJhdGlvbiI6dHJ1ZX0sImtleXMiOlt7ImlkIjoiOWViNDA1MGQtZTQ0Yi00ODAyLTkzMmUtMjdkNzUwODNlMjY2IiwiZW5jcnlwdGVkX2tleSI6ImxLM09qSExZVzI0Y3Iya3RSNzRmbnc9PSJ9XX19.FAbIiPxX8BHi9RwfzD7Yn-wugU19ghrkBFKsaCPrZmU' }, } } ``` **Test stream for iOS:** Sorry but I can not provide free streams to test. If anyone can provide test streams, or found some we can use, please let me know to also test them. It has been tested with a private provider and they work, at least with the `getLicense` override method. (An example implementation is provided in the README)
68 lines
3.2 KiB
Objective-C
68 lines
3.2 KiB
Objective-C
#import <AVFoundation/AVFoundation.h>
|
|
#import "AVKit/AVKit.h"
|
|
#import "UIView+FindUIViewController.h"
|
|
#import "RCTVideoPlayerViewController.h"
|
|
#import "RCTVideoPlayerViewControllerDelegate.h"
|
|
#import <React/RCTComponent.h>
|
|
#import <React/RCTBridgeModule.h>
|
|
|
|
#if __has_include(<react-native-video/RCTVideoCache.h>)
|
|
#import <react-native-video/RCTVideoCache.h>
|
|
#import <DVAssetLoaderDelegate/DVURLAsset.h>
|
|
#import <DVAssetLoaderDelegate/DVAssetLoaderDelegate.h>
|
|
#endif
|
|
|
|
@class RCTEventDispatcher;
|
|
#if __has_include(<react-native-video/RCTVideoCache.h>)
|
|
@interface RCTVideo : UIView <RCTVideoPlayerViewControllerDelegate, DVAssetLoaderDelegatesDelegate, AVAssetResourceLoaderDelegate>
|
|
#elif TARGET_OS_TV
|
|
@interface RCTVideo : UIView <RCTVideoPlayerViewControllerDelegate, AVAssetResourceLoaderDelegate>
|
|
#else
|
|
@interface RCTVideo : UIView <RCTVideoPlayerViewControllerDelegate, AVPictureInPictureControllerDelegate, AVAssetResourceLoaderDelegate>
|
|
#endif
|
|
|
|
@property (nonatomic, copy) RCTDirectEventBlock onVideoLoadStart;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onVideoLoad;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onVideoBuffer;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onVideoError;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onVideoProgress;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onBandwidthUpdate;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onVideoSeek;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onVideoEnd;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onTimedMetadata;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onVideoAudioBecomingNoisy;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onVideoFullscreenPlayerWillPresent;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onVideoFullscreenPlayerDidPresent;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onVideoFullscreenPlayerWillDismiss;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onVideoFullscreenPlayerDidDismiss;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onReadyForDisplay;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onPlaybackStalled;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onPlaybackResume;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onPlaybackRateChange;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onVideoExternalPlaybackChange;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onPictureInPictureStatusChanged;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onRestoreUserInterfaceForPictureInPictureStop;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onGetLicense;
|
|
|
|
typedef NS_ENUM(NSInteger, RCTVideoError) {
|
|
RCTVideoErrorFromJSPart,
|
|
RCTVideoErrorLicenseRequestNotOk,
|
|
RCTVideoErrorNoDataFromLicenseRequest,
|
|
RCTVideoErrorNoSPC,
|
|
RCTVideoErrorNoDataRequest,
|
|
RCTVideoErrorNoCertificateData,
|
|
RCTVideoErrorNoCertificateURL,
|
|
RCTVideoErrorNoFairplayDRM,
|
|
RCTVideoErrorNoDRMData
|
|
};
|
|
|
|
- (instancetype)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher NS_DESIGNATED_INITIALIZER;
|
|
|
|
- (AVPlayerViewController*)createPlayerViewController:(AVPlayer*)player withPlayerItem:(AVPlayerItem*)playerItem;
|
|
|
|
- (void)save:(NSDictionary *)options resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject;
|
|
- (void)setLicenseResult:(NSString * )license;
|
|
- (BOOL)setLicenseResultError:(NSString * )error;
|
|
|
|
@end
|