-
Notifications
You must be signed in to change notification settings - Fork 1
/
VideoPlayer.m
122 lines (92 loc) · 2.12 KB
/
VideoPlayer.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <stdio.h>
@import UIKit;
@import AVFoundation;
@import Dispatch;
@interface VideoPlayerView : UIView
@property (nonatomic) AVPlayer *player;
@end
@interface VideoPlayer : NSObject {
UIWindow *window;
AVPlayer *player;
VideoPlayerView *vpv;
BOOL playing;
BOOL paused;
}
- (id) initWithFile: (char *) fn;
- (int) isPlaying;
- (void) stop;
- (void) pause;
- (void) unpause;
- (void) periodic;
@end
@implementation VideoPlayer
- (id) initWithFile: (char *) fn {
self = [ super init ];
if (!self) {
return nil;
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
window = [[ UIApplication sharedApplication] keyWindow];
#pragma clang diagnostic pop
NSString *string = [NSString stringWithUTF8String: fn];
NSURL *url = [ NSURL fileURLWithPath: string ];
player = [ AVPlayer playerWithURL: url ];
vpv = [[ VideoPlayerView alloc ] init ];
[ vpv setPlayer: player ];
vpv.opaque = YES;
vpv.backgroundColor = [ UIColor blackColor ];
vpv.frame = window.frame;
[ [ [ window subviews ] objectAtIndex: 0 ] addSubview: vpv];
printf("Initialized VP with file %s\n", fn);
[ player play ];
playing = YES;
paused = NO;
return self;
}
- (int) isPlaying {
return playing;
}
- (void) periodic {
if (! playing) {
return;
}
if (playing && paused) {
return;
}
dispatch_async(dispatch_get_main_queue(), ^{
self->vpv.frame = self->window.frame;
});
if (! player.rate) {
[ self stop ];
} else if (player.error) {
[ self stop ];
}
return;
}
- (void) stop {
[ player pause ];
[ vpv removeFromSuperview ];
playing = NO;
paused = NO;
}
- (void) pause {
[ player pause ];
paused = YES;
}
- (void) unpause {
[ player play ];
paused = NO;
}
@end
@implementation VideoPlayerView
+ (Class)layerClass {
return [AVPlayerLayer class];
}
- (AVPlayer*)player {
return [(AVPlayerLayer *)[self layer] player];
}
- (void)setPlayer:(AVPlayer *)player {
[(AVPlayerLayer *)[self layer] setPlayer:player];
}
@end