@nativescript/canvas-media 2.0.0-rc.2 → 2.0.0-rc.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/platforms/ios/build.xcconfig +1 -0
- package/platforms/ios/src/NSCCanvasMediaUmbrella.h +3 -0
- package/platforms/ios/src/NSCPlayerState.h +23 -0
- package/platforms/ios/src/NSCVideoHelper.h +45 -0
- package/platforms/ios/src/NSCVideoHelper.m +231 -0
- package/platforms/ios/src/NSCVideoHelperListener.h +21 -0
- package/platforms/ios/src/module.modulemap +5 -0
- package/video/index.android.js +3 -2
- package/video/index.android.js.map +1 -1
- package/video/index.ios.js +4 -2
- package/video/index.ios.js.map +1 -1
- package/platforms/ios/src/NSCVideoHelper.swift +0 -359
- package/platforms/ios/src/NSCVideoHelperListener.swift +0 -14
package/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
OTHER_LDFLAGS = $(inherited) -framework "AVFoundation" -framework "CoreMedia" -framework "AVKit"
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//
|
|
2
|
+
// NSCPlayerState.h
|
|
3
|
+
// CanvasMedia
|
|
4
|
+
//
|
|
5
|
+
// Created by Osei Fortune on 20/05/2025.
|
|
6
|
+
//
|
|
7
|
+
#import <Foundation/Foundation.h>
|
|
8
|
+
|
|
9
|
+
typedef NS_ENUM(NSUInteger, NSCPlayerState) {
|
|
10
|
+
NSCPlayerStateIdle = 0,
|
|
11
|
+
NSCPlayerStatePlaying = 1,
|
|
12
|
+
NSCPlayerStatePaused = 2,
|
|
13
|
+
NSCPlayerStateStopped = 3,
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
typedef NS_ENUM(NSUInteger, NSCPlayerReadyState) {
|
|
18
|
+
NSCPlayerReadyStateHaveNothing = 0,
|
|
19
|
+
NSCPlayerReadyStateHaveMetadata = 1,
|
|
20
|
+
NSCPlayerReadyStateHaveCurrentData = 2,
|
|
21
|
+
NSCPlayerReadyStateHaveFutureData = 3,
|
|
22
|
+
NSCPlayerReadyStateHaveEnoughData = 4,
|
|
23
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
//
|
|
2
|
+
// NSCVideoHelper.h
|
|
3
|
+
// CanvasMedia
|
|
4
|
+
//
|
|
5
|
+
// Created by Osei Fortune on 20/05/2025.
|
|
6
|
+
//
|
|
7
|
+
#import <Foundation/Foundation.h>
|
|
8
|
+
#import <AVKit/AVKit.h>
|
|
9
|
+
#import <AVFoundation/AVFoundation.h>
|
|
10
|
+
#import <UIKit/UIKit.h>
|
|
11
|
+
#import <CoreMedia/CoreMedia.h>
|
|
12
|
+
|
|
13
|
+
#import "NSCPlayerState.h"
|
|
14
|
+
|
|
15
|
+
@class NSCVideoHelper;
|
|
16
|
+
|
|
17
|
+
@protocol NSCVideoHelperListener <NSObject>
|
|
18
|
+
- (void)onVideoFrameCallback;
|
|
19
|
+
- (void)onTimeUpdate:(double)seconds;
|
|
20
|
+
- (void)onStateChange:(NSCPlayerState)state;
|
|
21
|
+
@end
|
|
22
|
+
|
|
23
|
+
@interface NSCVideoHelper : NSObject
|
|
24
|
+
|
|
25
|
+
@property (nonatomic, strong, readonly) AVPlayerViewController *controller;
|
|
26
|
+
@property (nonatomic, strong, readonly) AVPlayer *player;
|
|
27
|
+
@property (nonatomic, strong, readonly) AVPlayerItem *currentItem;
|
|
28
|
+
@property (nonatomic, readonly) BOOL isInForeground;
|
|
29
|
+
@property (nonatomic, readonly) NSCPlayerState state;
|
|
30
|
+
@property (nonatomic, readonly) NSCPlayerReadyState readyState;
|
|
31
|
+
@property (nonatomic, readonly) CGSize videoSize;
|
|
32
|
+
@property (nonatomic, strong, readonly) AVPlayerItemVideoOutput *assetOutput;
|
|
33
|
+
@property (nonatomic, weak) id<NSCVideoHelperListener> listener;
|
|
34
|
+
@property (nonatomic) BOOL isLoop;
|
|
35
|
+
@property (nonatomic) BOOL muted;
|
|
36
|
+
@property (nonatomic) BOOL controls;
|
|
37
|
+
@property (nonatomic) BOOL playsinline;
|
|
38
|
+
@property (nonatomic, copy) NSString *src;
|
|
39
|
+
@property (nonatomic, readonly) double duration;
|
|
40
|
+
@property (nonatomic) double currentTime;
|
|
41
|
+
|
|
42
|
+
- (void)play;
|
|
43
|
+
- (void)pause;
|
|
44
|
+
|
|
45
|
+
@end
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
//
|
|
2
|
+
// NSCVideoHelper.m
|
|
3
|
+
// CanvasMedia
|
|
4
|
+
//
|
|
5
|
+
// Created by Osei Fortune on 20/05/2025.
|
|
6
|
+
//
|
|
7
|
+
#import "NSCVideoHelper.h"
|
|
8
|
+
|
|
9
|
+
@interface NSCVideoHelper ()
|
|
10
|
+
@property (nonatomic, strong) AVURLAsset *asset;
|
|
11
|
+
@property (nonatomic, copy) NSString *currentSrc;
|
|
12
|
+
@property (nonatomic, strong) id playEndNotificationId;
|
|
13
|
+
@property (nonatomic, strong) id resumeListenerId;
|
|
14
|
+
@property (nonatomic, strong) id suspendListenerId;
|
|
15
|
+
@property (nonatomic, strong) id playbackFramesObserver;
|
|
16
|
+
@property (nonatomic, strong) id playbackTimeObserver;
|
|
17
|
+
@property (nonatomic, assign) NSCPlayerState state;
|
|
18
|
+
@property (nonatomic, assign) NSCPlayerReadyState readyState;
|
|
19
|
+
@property (nonatomic, assign) BOOL inForeground;
|
|
20
|
+
@end
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@implementation NSCVideoHelper
|
|
27
|
+
|
|
28
|
+
- (instancetype)init {
|
|
29
|
+
if (self = [super init]) {
|
|
30
|
+
_controller = [[AVPlayerViewController alloc] init];
|
|
31
|
+
_player = [[AVPlayer alloc] init];
|
|
32
|
+
_inForeground = YES;
|
|
33
|
+
_readyState = NSCPlayerReadyStateHaveNothing;
|
|
34
|
+
_state = NSCPlayerStateIdle;
|
|
35
|
+
_controller.player = _player;
|
|
36
|
+
|
|
37
|
+
__weak typeof(self) weakSelf = self;
|
|
38
|
+
_suspendListenerId = [[NSNotificationCenter defaultCenter]
|
|
39
|
+
addObserverForName:UIApplicationDidEnterBackgroundNotification
|
|
40
|
+
object:nil queue:nil
|
|
41
|
+
usingBlock:^(NSNotification *note) {
|
|
42
|
+
weakSelf.inForeground = NO;
|
|
43
|
+
}];
|
|
44
|
+
|
|
45
|
+
_resumeListenerId = [[NSNotificationCenter defaultCenter]
|
|
46
|
+
addObserverForName:UIApplicationDidBecomeActiveNotification
|
|
47
|
+
object:nil queue:nil
|
|
48
|
+
usingBlock:^(NSNotification *note) {
|
|
49
|
+
weakSelf.inForeground = YES;
|
|
50
|
+
}];
|
|
51
|
+
}
|
|
52
|
+
return self;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
-(BOOL) isInForeground {
|
|
56
|
+
return _inForeground;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
- (void)setSrc:(NSString *)src {
|
|
60
|
+
_currentSrc = src;
|
|
61
|
+
_readyState = NSCPlayerReadyStateHaveNothing;
|
|
62
|
+
|
|
63
|
+
if (!src) return;
|
|
64
|
+
|
|
65
|
+
NSURL *url = [src hasPrefix:@"/"] ? [NSURL fileURLWithPath:src] : [NSURL URLWithString:src];
|
|
66
|
+
if (!url) return;
|
|
67
|
+
|
|
68
|
+
if (_playEndNotificationId) {
|
|
69
|
+
[[NSNotificationCenter defaultCenter] removeObserver:_playEndNotificationId];
|
|
70
|
+
_playEndNotificationId = nil;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
self.asset = [AVURLAsset URLAssetWithURL:url options:nil];
|
|
74
|
+
NSArray *keys = @[@"duration", @"tracks", @"commonMetadata"];
|
|
75
|
+
|
|
76
|
+
__weak typeof(self) weakSelf = self;
|
|
77
|
+
[self.asset loadValuesAsynchronouslyForKeys:keys completionHandler:^{
|
|
78
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
79
|
+
__strong typeof(self) strongSelf = weakSelf;
|
|
80
|
+
if (!strongSelf) return;
|
|
81
|
+
|
|
82
|
+
AVAssetTrack *videoTrack = [[weakSelf.asset tracksWithMediaType:AVMediaTypeVideo] firstObject];
|
|
83
|
+
strongSelf->_videoSize = videoTrack.naturalSize;
|
|
84
|
+
|
|
85
|
+
float fps = videoTrack.nominalFrameRate ?: 30.0;
|
|
86
|
+
CMTime interval = CMTimeMake(1, (int32_t)fps);
|
|
87
|
+
weakSelf.playbackFramesObserver = [weakSelf.player addPeriodicTimeObserverForInterval:interval queue:nil usingBlock:^(CMTime time) {
|
|
88
|
+
if (weakSelf.state == NSCPlayerStatePlaying) {
|
|
89
|
+
[weakSelf.listener onVideoFrameCallback];
|
|
90
|
+
}
|
|
91
|
+
}];
|
|
92
|
+
|
|
93
|
+
AVPlayerItem *item = [AVPlayerItem playerItemWithAsset:weakSelf.asset];
|
|
94
|
+
strongSelf->_currentItem = item;
|
|
95
|
+
|
|
96
|
+
NSDictionary *outputSettings = @{
|
|
97
|
+
(__bridge NSString *)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_32BGRA),
|
|
98
|
+
(__bridge NSString *)kCVPixelBufferOpenGLESCompatibilityKey: @YES,
|
|
99
|
+
(__bridge NSString *)kCVPixelBufferOpenGLCompatibilityKey: @YES
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
strongSelf->_assetOutput = [[AVPlayerItemVideoOutput alloc] initWithPixelBufferAttributes:outputSettings];
|
|
103
|
+
|
|
104
|
+
[item addObserver:weakSelf forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
|
|
105
|
+
[item addObserver:weakSelf forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial context:nil];
|
|
106
|
+
|
|
107
|
+
strongSelf->_playEndNotificationId = [[NSNotificationCenter defaultCenter]
|
|
108
|
+
addObserverForName:AVPlayerItemDidPlayToEndTimeNotification
|
|
109
|
+
object:item queue:nil usingBlock:^(NSNotification *note) {
|
|
110
|
+
if (weakSelf.isLoop) {
|
|
111
|
+
[weakSelf.player seekToTime:kCMTimeZero];
|
|
112
|
+
[weakSelf.player play];
|
|
113
|
+
weakSelf.state = NSCPlayerStatePlaying;
|
|
114
|
+
[weakSelf.listener onStateChange:NSCPlayerStatePlaying];
|
|
115
|
+
}
|
|
116
|
+
}];
|
|
117
|
+
|
|
118
|
+
[weakSelf.player replaceCurrentItemWithPlayerItem:item];
|
|
119
|
+
weakSelf.readyState = NSCPlayerReadyStateHaveMetadata;
|
|
120
|
+
if (weakSelf.isLoop) {
|
|
121
|
+
[weakSelf play];
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}];
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
- (NSString *)src {
|
|
128
|
+
return _currentSrc;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
- (void)observeValueForKeyPath:(NSString *)keyPath
|
|
132
|
+
ofObject:(id)object
|
|
133
|
+
change:(NSDictionary<NSKeyValueChangeKey,id> *)change
|
|
134
|
+
context:(void *)context {
|
|
135
|
+
|
|
136
|
+
if ([keyPath isEqualToString:@"status"]) {
|
|
137
|
+
if (self.player.currentItem.status == AVPlayerItemStatusReadyToPlay) {
|
|
138
|
+
self->_videoSize = [[self.asset tracksWithMediaType:AVMediaTypeVideo] firstObject].naturalSize;
|
|
139
|
+
[self.player.currentItem addOutput:self.assetOutput];
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
- (double)duration {
|
|
145
|
+
if (!_currentItem) return NAN;
|
|
146
|
+
return CMTimeGetSeconds(_currentItem.asset.duration);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
- (double)currentTime {
|
|
150
|
+
return CMTimeGetSeconds(self.player.currentTime);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
- (void)setCurrentTime:(double)currentTime {
|
|
154
|
+
CMTime time = CMTimeMakeWithSeconds(currentTime, self.player.currentTime.timescale);
|
|
155
|
+
[self.player seekToTime:time];
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
- (BOOL)controls {
|
|
159
|
+
return self.controller.showsPlaybackControls;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
- (void)setControls:(BOOL)controls {
|
|
163
|
+
self.controller.showsPlaybackControls = controls;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
- (BOOL)muted {
|
|
167
|
+
return self.player.muted;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
- (void)setMuted:(BOOL)muted {
|
|
171
|
+
self.player.muted = muted;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
- (BOOL)playsinline {
|
|
175
|
+
return !self.controller.entersFullScreenWhenPlaybackBegins;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
- (void)setPlaysinline:(BOOL)playsinline {
|
|
179
|
+
self.controller.entersFullScreenWhenPlaybackBegins = !playsinline;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
- (void)play {
|
|
183
|
+
if (self.state == NSCPlayerStatePlaying) return;
|
|
184
|
+
[self addTimeObserver];
|
|
185
|
+
[self.player play];
|
|
186
|
+
self.state = NSCPlayerStatePlaying;
|
|
187
|
+
[self.listener onStateChange:self.state];
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
- (void)addTimeObserver {
|
|
191
|
+
CMTime interval = CMTimeMake(1, 1);
|
|
192
|
+
__weak typeof(self) weakSelf = self;
|
|
193
|
+
self.playbackTimeObserver = [self.player addPeriodicTimeObserverForInterval:interval queue:nil usingBlock:^(CMTime time) {
|
|
194
|
+
if (weakSelf.state == NSCPlayerStatePlaying) {
|
|
195
|
+
[weakSelf.listener onTimeUpdate:CMTimeGetSeconds(time)];
|
|
196
|
+
}
|
|
197
|
+
}];
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
- (void)pause {
|
|
201
|
+
if (self.state != NSCPlayerStatePlaying) return;
|
|
202
|
+
if (self.playbackTimeObserver) {
|
|
203
|
+
[self.player removeTimeObserver:self.playbackTimeObserver];
|
|
204
|
+
self.playbackTimeObserver = nil;
|
|
205
|
+
}
|
|
206
|
+
[self.player pause];
|
|
207
|
+
self.state = NSCPlayerStatePaused;
|
|
208
|
+
[self.listener onStateChange:self.state];
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
- (void)dealloc {
|
|
212
|
+
if (self.state == NSCPlayerStatePlaying) {
|
|
213
|
+
[self.player pause];
|
|
214
|
+
self.state = NSCPlayerStateStopped;
|
|
215
|
+
[self.listener onStateChange:self.state];
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
if (_playEndNotificationId) {
|
|
219
|
+
[[NSNotificationCenter defaultCenter] removeObserver:_playEndNotificationId];
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (_resumeListenerId) {
|
|
223
|
+
[[NSNotificationCenter defaultCenter] removeObserver:_resumeListenerId];
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (_suspendListenerId) {
|
|
227
|
+
[[NSNotificationCenter defaultCenter] removeObserver:_suspendListenerId];
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
@end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//
|
|
2
|
+
// NSCVideoHelperListener.h
|
|
3
|
+
// CanvasMedia
|
|
4
|
+
//
|
|
5
|
+
// Created by Osei Fortune on 20/05/2025.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#import <Foundation/Foundation.h>
|
|
9
|
+
#import "NSCPlayerState.h"
|
|
10
|
+
|
|
11
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
12
|
+
|
|
13
|
+
@protocol NSCVideoHelperListener <NSObject>
|
|
14
|
+
|
|
15
|
+
- (void)onStateChange:(NSCPlayerState)state;
|
|
16
|
+
- (void)onTimeUpdate:(double)time;
|
|
17
|
+
- (void)onVideoFrameCallback;
|
|
18
|
+
|
|
19
|
+
@end
|
|
20
|
+
|
|
21
|
+
NS_ASSUME_NONNULL_END
|
package/video/index.android.js
CHANGED
|
@@ -66,8 +66,9 @@ export class Video extends VideoBase {
|
|
|
66
66
|
}
|
|
67
67
|
getCurrentFrame(context) {
|
|
68
68
|
const ctx = arguments[1];
|
|
69
|
-
|
|
70
|
-
const
|
|
69
|
+
//@ts-ignore
|
|
70
|
+
const flipY = context?.__flipY ?? false;
|
|
71
|
+
const ptr = ctx._canvas._canvas.getNativeContext();
|
|
71
72
|
this._instance.getCurrentFrame(!!this.isLoaded, ptr, flipY, arguments[4], arguments[5]);
|
|
72
73
|
}
|
|
73
74
|
play() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.android.js","sourceRoot":"","sources":["../../../../packages/canvas-media/video/index.android.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.android.js","sourceRoot":"","sources":["../../../../packages/canvas-media/video/index.android.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAiE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC3I,OAAO,EAAE,MAAM,EAAE,WAAW,EAAS,YAAY,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAE5B,MAAM,OAAO,KAAM,SAAQ,SAAS;IAiBnC;QACC,KAAK,EAAE,CAAC;QAhBT,gBAAW,GAAa,EAAE,CAAC;QAK3B,cAAS,GAAY,KAAK,CAAC;QAC3B,aAAQ,GAAY,KAAK,CAAC;QAE1B,gBAAW,GAAW,CAAC,CAAC;QACxB,gBAAW,GAAG,CAAC,CAAC;QAChB,iBAAY,GAAG,CAAC,CAAC;QAOhB,IAAI,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC,CAAA,CAAC;QAEf,MAAM,QAAQ,GAA6C,WAAW,CAAC,OAAO,CAAC,kBAAkB,IAAI,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC;QAEvI,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC;QAExG,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QAE9B,IAAI,CAAC,SAAS,CAAC,WAAW,CACzB,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC;YACtD,gBAAgB,CAAC,QAAQ;gBACxB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;gBACxB,IAAI,KAAK,EAAE,CAAC;oBACX,gBAAgB,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;oBACpD,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAClD,CAAC;YACF,CAAC;YAED,SAAS;gBACR,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;gBACxB,IAAI,KAAK,EAAE,CAAC;oBACX,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBAC3C,CAAC;YACF,CAAC;YAED,kBAAkB,CAAC,KAAK,EAAE,MAAM;gBAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;gBACxB,IAAI,KAAK,EAAE,CAAC;oBACX,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;oBAC1B,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC;gBAC7B,CAAC;YACF,CAAC;YAED,oBAAoB,CAAC,IAAI;gBACxB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;gBACxB,IAAI,KAAK,EAAE,CAAC;oBACX,mBAAmB,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;oBACnD,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;gBAC9C,CAAC;YACF,CAAC;YAED,YAAY;gBACX,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;gBACxB,IAAI,KAAK,EAAE,CAAC;oBACX,KAAK,CAAC,0BAA0B,EAAE,CAAC;gBACpC,CAAC;YACF,CAAC;SACD,CAAC,CACF,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,UAAU;QACb,OAAO,IAAI,CAAC,WAAW,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,gBAAgB;QACtB,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;QAC1B,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QACvB,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC;QAClB,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;QACnB,OAAO,KAAK,CAAC;IACd,CAAC;IACD,eAAe,CAAC,OAA+B;QAC9C,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAQ,CAAC;QAChC,YAAY;QACZ,MAAM,KAAK,GAAG,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC;QACxC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAEnD,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACzF,CAAC;IAED,IAAI;QACH,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;IAClC,CAAC;IAED,IAAI,KAAK,CAAC,KAAc;QACvB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,QAAQ;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;IACrC,CAAC;IAED,IAAI,WAAW;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;IACxC,CAAC;IAED,IAAI,WAAW,CAAC,KAAa;QAC5B,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,GAAG;QACN,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;IAChC,CAAC;IAED,IAAI,GAAG,CAAC,KAAa;QACpB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzD,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,YAAY;IACZ,IAAI,QAAQ;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;IACrC,CAAC;IAED,IAAI,QAAQ,CAAC,KAAc;QAC1B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,QAAQ;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;IACrC,CAAC;IAED,IAAI,QAAQ,CAAC,OAAgB;QAC5B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,aAAa;IACb,IAAI,IAAI;QACP,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;IAED,IAAI,IAAI,CAAC,KAAc;QACtB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,gBAAgB;QACf,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;IACvC,CAAC;IAED,cAAc;QACb,KAAK,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,oBAAoB,CAAC,IAAY,EAAE,KAAU;QAC5C,IAAI,KAAK,YAAY,MAAM,EAAE,CAAC;YAC7B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACF,CAAC;IAED,QAAQ;QACP,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjB,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACpC,CAAC;IACF,CAAC;IAED,aAAa;IACb,IAAI,KAAK;QACR,IAAI,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAChC,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;IAClC,CAAC;IAED,IAAI,KAAK,CAAC,KAAK;QACd,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACzB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,aAAa,EAAE,CAAC;QACtB,CAAC;IACF,CAAC;IAED,aAAa;IACb,IAAI,MAAM;QACT,IAAI,IAAI,CAAC,iBAAiB,EAAE,GAAG,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;IACnC,CAAC;IAED,IAAI,MAAM,CAAC,KAAK;QACf,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;QAC1B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,aAAa,EAAE,CAAC;QACtB,CAAC;IACF,CAAC;IAED,aAAa;QACZ,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAClB,YAAY;YACZ,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAClI,OAAO;YACR,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACrB,OAAO;YACR,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;YAClD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;YACpD,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACtD,CAAC;IACF,CAAC;;AApNc,cAAQ,GAAG,KAAK,AAAR,CAAS;AACzB,eAAS,GAAG,GAAG,AAAN,CAAO;AAChB,cAAQ,GAAG,KAAK,AAAR,CAAS"}
|
package/video/index.ios.js
CHANGED
|
@@ -68,12 +68,14 @@ export class Video extends VideoBase {
|
|
|
68
68
|
return this.helper.readyState;
|
|
69
69
|
}
|
|
70
70
|
getCurrentFrame(context) {
|
|
71
|
-
|
|
71
|
+
//@ts-ignore
|
|
72
|
+
const flipY = context?.__flipY ?? false;
|
|
73
|
+
if (!this.helper.isInForeground) {
|
|
72
74
|
return;
|
|
73
75
|
}
|
|
74
76
|
if (this.helper.assetOutput) {
|
|
75
77
|
try {
|
|
76
|
-
NSCCanvasUtils.drawFrame(this.helper.player, this.helper.assetOutput, this.helper.videoSize, arguments[4], arguments[5],
|
|
78
|
+
NSCCanvasUtils.drawFrame(this.helper.player, this.helper.assetOutput, this.helper.videoSize, arguments[4], arguments[5], flipY);
|
|
77
79
|
}
|
|
78
80
|
catch (e) {
|
|
79
81
|
if (Video.IS_DEBUG) {
|
package/video/index.ios.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.ios.js","sourceRoot":"","sources":["../../../../packages/canvas-media/video/index.ios.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,mBAAmB,EAAmD,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC7J,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCxD,MAAM,OAAO,KAAM,SAAQ,SAAS;IAQnC,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC3B,CAAC;IACD;QACC,KAAK,EAAE,CAAC;QART,cAAS,GAAY,KAAK,CAAC;QAC3B,mBAAc,GAAG,IAAI,CAAC;QAQrB,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC;YACJ,cAAc,CAAC,cAAc,EAAE,CAAC,gBAAgB,CAAC,8BAA8B,CAAC,CAAC;QAClF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;QACd,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,0BAA0B,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QACrC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,CAAC,gBAAgB;QACtB,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;QAC1B,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QACvB,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC;QAClB,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;QACnB,OAAO,KAAK,CAAC;IACd,CAAC;IAED,YAAY;IACZ,IAAI,UAAU;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;IAC/B,CAAC;IAED,eAAe,CAAC,OAAO;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"index.ios.js","sourceRoot":"","sources":["../../../../packages/canvas-media/video/index.ios.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,359 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// NSCVideoHelper.swift
|
|
3
|
-
// CanvasMedia
|
|
4
|
-
// Created by Osei Fortune on 27/08/24.
|
|
5
|
-
//
|
|
6
|
-
|
|
7
|
-
import Foundation
|
|
8
|
-
import UIKit
|
|
9
|
-
import AVKit
|
|
10
|
-
import AVFoundation
|
|
11
|
-
|
|
12
|
-
// #if canImport(Combine)
|
|
13
|
-
// import Combine
|
|
14
|
-
// #endif
|
|
15
|
-
|
|
16
|
-
@objc(NSCPlayerState)
|
|
17
|
-
public enum NSCPlayerState: Int, RawRepresentable {
|
|
18
|
-
public typealias RawValue = UInt32
|
|
19
|
-
case Idle
|
|
20
|
-
case Playing
|
|
21
|
-
case Paused
|
|
22
|
-
case Stopped
|
|
23
|
-
|
|
24
|
-
public var rawValue: RawValue {
|
|
25
|
-
switch self {
|
|
26
|
-
case .Idle:
|
|
27
|
-
return 0
|
|
28
|
-
case .Playing:
|
|
29
|
-
return 1
|
|
30
|
-
case .Paused:
|
|
31
|
-
return 2
|
|
32
|
-
case .Stopped:
|
|
33
|
-
return 3
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
public init?(rawValue: RawValue) {
|
|
38
|
-
switch rawValue {
|
|
39
|
-
case 0:
|
|
40
|
-
self = .Idle
|
|
41
|
-
case 1:
|
|
42
|
-
self = .Playing
|
|
43
|
-
case 2:
|
|
44
|
-
self = .Paused
|
|
45
|
-
case 3:
|
|
46
|
-
self = .Stopped
|
|
47
|
-
default:
|
|
48
|
-
return nil
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
@objc(NSCPlayerReadyState)
|
|
55
|
-
public enum NSCPlayerReadyState:Int, RawRepresentable {
|
|
56
|
-
public typealias RawValue = UInt32
|
|
57
|
-
case HAVE_NOTHING
|
|
58
|
-
case HAVE_METADATA
|
|
59
|
-
case HAVE_CURRENT_DATA
|
|
60
|
-
case HAVE_FUTURE_DATA
|
|
61
|
-
case HAVE_ENOUGH_DATA
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
public var rawValue: RawValue {
|
|
65
|
-
switch self {
|
|
66
|
-
case .HAVE_NOTHING:
|
|
67
|
-
return 0
|
|
68
|
-
case .HAVE_METADATA:
|
|
69
|
-
return 1
|
|
70
|
-
case .HAVE_CURRENT_DATA:
|
|
71
|
-
return 2
|
|
72
|
-
case .HAVE_FUTURE_DATA:
|
|
73
|
-
return 3
|
|
74
|
-
case .HAVE_ENOUGH_DATA:
|
|
75
|
-
return 4
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
public init?(rawValue: RawValue) {
|
|
80
|
-
switch rawValue {
|
|
81
|
-
case 0:
|
|
82
|
-
self = .HAVE_NOTHING
|
|
83
|
-
case 1:
|
|
84
|
-
self = .HAVE_METADATA
|
|
85
|
-
case 2:
|
|
86
|
-
self = .HAVE_CURRENT_DATA
|
|
87
|
-
case 3:
|
|
88
|
-
self = .HAVE_FUTURE_DATA
|
|
89
|
-
case 4:
|
|
90
|
-
self = .HAVE_ENOUGH_DATA
|
|
91
|
-
default:
|
|
92
|
-
return nil
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
@objcMembers
|
|
100
|
-
@objc(NSCVideoHelper)
|
|
101
|
-
public class NSCVideoHelper: NSObject {
|
|
102
|
-
public let controller = AVPlayerViewController()
|
|
103
|
-
public let player = AVPlayer()
|
|
104
|
-
private (set) public var currentItem: AVPlayerItem? = nil
|
|
105
|
-
private var currentSrc: String? = nil
|
|
106
|
-
private(set) public var state: NSCPlayerState = .Idle
|
|
107
|
-
private var asset: AVURLAsset? = nil
|
|
108
|
-
private(set) var videoSize: CGSize = .zero
|
|
109
|
-
private(set) var assetOutput: AVPlayerItemVideoOutput? = nil
|
|
110
|
-
private(set) var readyState: NSCPlayerReadyState = .HAVE_NOTHING
|
|
111
|
-
var listener: NSCVideoHelperListener? = nil
|
|
112
|
-
private(set) var isInForground = true
|
|
113
|
-
public override init(){
|
|
114
|
-
super.init()
|
|
115
|
-
suspendListenerId = NotificationCenter.default.addObserver(forName:UIApplication.didEnterBackgroundNotification , object: nil, queue: nil) { noti in
|
|
116
|
-
self.isInForground = false
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
resumeListenerId = NotificationCenter.default.addObserver(forName:UIApplication.didBecomeActiveNotification , object: nil, queue: nil) { noti in
|
|
120
|
-
self.isInForground = true
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
controller.player = player
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
public override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
|
|
127
|
-
if (keyPath == "status") {
|
|
128
|
-
if(player.currentItem?.status == .failed){
|
|
129
|
-
// let baseError = player.currentItem. .userInfo.objectForKey(NSUnderlyingErrorKey);
|
|
130
|
-
}else if(player.currentItem?.status == .readyToPlay){
|
|
131
|
-
videoSize = asset?.tracks(withMediaType: .video).first?.naturalSize ?? .zero
|
|
132
|
-
player.currentItem?.add(assetOutput!)
|
|
133
|
-
}
|
|
134
|
-
} else if (keyPath == "loadedTimeRanges") {
|
|
135
|
-
|
|
136
|
-
// let playerItem = object as? AVPlayerItem
|
|
137
|
-
// guard let playerItem = playerItem else {return}
|
|
138
|
-
// let ranges = playerItem.loadedTimeRanges
|
|
139
|
-
// guard let first = ranges.first else {return}
|
|
140
|
-
|
|
141
|
-
// let loaded = first.CMTimeRangeValue.duration.value / first.CMTimeRangeValue.duration.timescale
|
|
142
|
-
// let total = playerItem.duration.value / playerItem.duration.timescale
|
|
143
|
-
// console.log('loaded', loaded / total);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
public var controls: Bool {
|
|
148
|
-
get {
|
|
149
|
-
return controller.showsPlaybackControls
|
|
150
|
-
}
|
|
151
|
-
set {
|
|
152
|
-
controller.showsPlaybackControls = newValue
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
public var muted: Bool {
|
|
157
|
-
get {
|
|
158
|
-
return player.isMuted
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
set {
|
|
162
|
-
player.isMuted = newValue
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
public var duration: Double {
|
|
167
|
-
get {
|
|
168
|
-
guard let currentItem = currentItem else {return .nan}
|
|
169
|
-
|
|
170
|
-
return CMTimeGetSeconds(currentItem.asset.duration)
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
public var currentTime: Double {
|
|
175
|
-
get {
|
|
176
|
-
return CMTimeGetSeconds(player.currentTime())
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
set {
|
|
180
|
-
let time = CMTime(seconds: newValue, preferredTimescale: player.currentTime().timescale)
|
|
181
|
-
player.seek(to: time)
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
public var isLoop: Bool = false
|
|
186
|
-
|
|
187
|
-
public var playsinline: Bool {
|
|
188
|
-
get {
|
|
189
|
-
return !controller.entersFullScreenWhenPlaybackBegins
|
|
190
|
-
}
|
|
191
|
-
set {
|
|
192
|
-
controller.entersFullScreenWhenPlaybackBegins = !newValue
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
private var playEndNotificationId: Any?
|
|
197
|
-
private var resumeListenerId: Any?
|
|
198
|
-
private var suspendListenerId: Any?
|
|
199
|
-
// private var cancellables = Set<AnyCancellable>()
|
|
200
|
-
public var src: String? {
|
|
201
|
-
get {
|
|
202
|
-
return currentSrc
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
set {
|
|
206
|
-
guard let src = newValue else {
|
|
207
|
-
readyState = .HAVE_NOTHING
|
|
208
|
-
return
|
|
209
|
-
}
|
|
210
|
-
var url: URL?
|
|
211
|
-
if(src.starts(with: "/")){
|
|
212
|
-
url = URL(fileURLWithPath: src)
|
|
213
|
-
}else {
|
|
214
|
-
url = URL(string: src)
|
|
215
|
-
}
|
|
216
|
-
guard let url = url else {
|
|
217
|
-
readyState = .HAVE_NOTHING
|
|
218
|
-
return
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
if(playEndNotificationId != nil){
|
|
222
|
-
NotificationCenter.default.removeObserver(playEndNotificationId!)
|
|
223
|
-
playEndNotificationId = nil
|
|
224
|
-
}
|
|
225
|
-
asset = AVURLAsset(url: url)
|
|
226
|
-
|
|
227
|
-
// var cancellables = Set<AnyCancellable>()
|
|
228
|
-
|
|
229
|
-
let keys = ["duration", "tracks", "commonMetadata"]
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
// let publishers = keys.map { key in
|
|
234
|
-
// asset.publisher(for: \.statusOfValue(forKey: key, error: nil))
|
|
235
|
-
// }
|
|
236
|
-
//
|
|
237
|
-
// Publishers.Zip3(publishers[0], publishers[1], publishers[2])
|
|
238
|
-
// .sink { completion in
|
|
239
|
-
// // Handle completion
|
|
240
|
-
// } receiveValue: { status1, status2, status3 in
|
|
241
|
-
// // Handle loaded values for all three keys
|
|
242
|
-
// }
|
|
243
|
-
// .store(in: &cancellables)
|
|
244
|
-
//
|
|
245
|
-
//
|
|
246
|
-
|
|
247
|
-
asset?.loadValuesAsynchronously(forKeys: keys, completionHandler: { [self] in
|
|
248
|
-
videoSize = asset?.tracks(withMediaType: .video).first?.naturalSize ?? .zero
|
|
249
|
-
|
|
250
|
-
let fps = asset?.tracks.first?.nominalFrameRate ?? 30
|
|
251
|
-
let interval = CMTimeMake(value: 1, timescale: Int32(fps))
|
|
252
|
-
|
|
253
|
-
playbackFramesObserver = player.addPeriodicTimeObserver(forInterval: interval, queue: nil, using: { currentTime in
|
|
254
|
-
if(self.state == .Playing){
|
|
255
|
-
self.listener?.onVideoFrameCallback()
|
|
256
|
-
}
|
|
257
|
-
})
|
|
258
|
-
|
|
259
|
-
currentItem = AVPlayerItem(asset: asset!)
|
|
260
|
-
|
|
261
|
-
guard let currentItem = currentItem else {
|
|
262
|
-
readyState = .HAVE_NOTHING
|
|
263
|
-
currentSrc = nil
|
|
264
|
-
return
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
let attributes: [String: Any] = [
|
|
268
|
-
kCVPixelBufferPixelFormatTypeKey as String: NSNumber(value: kCVPixelFormatType_32BGRA),
|
|
269
|
-
kCVPixelBufferOpenGLESCompatibilityKey as String : NSNumber(value: true),
|
|
270
|
-
kCVPixelBufferOpenGLCompatibilityKey as String : NSNumber(value: true)
|
|
271
|
-
]
|
|
272
|
-
|
|
273
|
-
assetOutput = AVPlayerItemVideoOutput(outputSettings: attributes)
|
|
274
|
-
|
|
275
|
-
currentItem.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.status),options: .new,context: nil)
|
|
276
|
-
|
|
277
|
-
currentItem.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.loadedTimeRanges),options: [.initial, .new] ,context: nil)
|
|
278
|
-
|
|
279
|
-
playEndNotificationId = NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: currentItem, queue: nil, using: { notfi in
|
|
280
|
-
if (self.isLoop) {
|
|
281
|
-
self.player.seek(to: .zero)
|
|
282
|
-
self.player.play()
|
|
283
|
-
self.state = .Playing
|
|
284
|
-
self.listener?.onStateChange(.Playing)
|
|
285
|
-
}
|
|
286
|
-
})
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
player.replaceCurrentItem(with: currentItem)
|
|
290
|
-
|
|
291
|
-
readyState = .HAVE_METADATA
|
|
292
|
-
currentSrc = src
|
|
293
|
-
if (isLoop) {
|
|
294
|
-
play()
|
|
295
|
-
}
|
|
296
|
-
})
|
|
297
|
-
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
private var playbackFramesObserver: Any? = nil
|
|
302
|
-
private var playbackTimeObserver: Any? = nil
|
|
303
|
-
private func addTimeObserver() {
|
|
304
|
-
let interval = CMTimeMake(value: 1, timescale: 1)
|
|
305
|
-
player.addPeriodicTimeObserver(forInterval: interval, queue: nil) { currentTime in
|
|
306
|
-
if(self.state == .Playing){
|
|
307
|
-
let seconds = CMTimeGetSeconds(currentTime)
|
|
308
|
-
self.listener?.onTimeUpdate(seconds)
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
public func play(){
|
|
315
|
-
if(state == .Playing){
|
|
316
|
-
return
|
|
317
|
-
}
|
|
318
|
-
addTimeObserver()
|
|
319
|
-
player.play()
|
|
320
|
-
state = .Playing
|
|
321
|
-
listener?.onStateChange(.Playing)
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
public func pause() {
|
|
326
|
-
if (state != .Playing) {
|
|
327
|
-
return
|
|
328
|
-
}
|
|
329
|
-
guard let playbackTimeObserver = playbackTimeObserver else {return}
|
|
330
|
-
player.removeTimeObserver(playbackTimeObserver)
|
|
331
|
-
self.playbackTimeObserver = nil
|
|
332
|
-
player.pause()
|
|
333
|
-
state = .Paused
|
|
334
|
-
listener?.onStateChange(.Paused)
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
deinit {
|
|
338
|
-
if(state == .Playing){
|
|
339
|
-
player.pause()
|
|
340
|
-
state = .Stopped
|
|
341
|
-
listener?.onStateChange(.Stopped)
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
if(playEndNotificationId != nil){
|
|
345
|
-
NotificationCenter.default.removeObserver(playEndNotificationId!)
|
|
346
|
-
playEndNotificationId = nil
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
if(resumeListenerId != nil){
|
|
350
|
-
NotificationCenter.default.removeObserver(resumeListenerId!)
|
|
351
|
-
resumeListenerId = nil
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
if(suspendListenerId != nil){
|
|
355
|
-
NotificationCenter.default.removeObserver(suspendListenerId!)
|
|
356
|
-
suspendListenerId = nil
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// NSCVideoHelperListener.swift
|
|
3
|
-
// CanvasMedia
|
|
4
|
-
//
|
|
5
|
-
// Created by Osei Fortune on 28/08/2024.
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
import Foundation
|
|
9
|
-
@objc(NSCVideoHelperListener)
|
|
10
|
-
public protocol NSCVideoHelperListener {
|
|
11
|
-
func onStateChange(_ state: NSCPlayerState)
|
|
12
|
-
func onTimeUpdate(_ time: Double)
|
|
13
|
-
func onVideoFrameCallback()
|
|
14
|
-
}
|