Skip to content

Commit dc5791c

Browse files
author
Shahen Hovhannisyan
authored
Merge pull request #4 from shahen94/ios/video-player
Ios/video player
2 parents 6c4ac22 + fee2dc7 commit dc5791c

15 files changed

Lines changed: 489 additions & 116 deletions

File tree

GPUImage

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Subproject commit 167b0389bc6e9dc4bb0121550f91d8d5d6412c53

index.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1 @@
1-
2-
import { NativeModules } from 'react-native';
3-
4-
const { RNVideoProcessing } = NativeModules;
5-
6-
export default RNVideoProcessing;
1+
export * from './lib';

ios/RNVideoPlayer.swift

Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
//
2+
// RNVideoPlayer.swift
3+
// RNVideoProcessing
4+
//
5+
// Created by Shahen Hovhannisyan on 11/14/16.
6+
// Copyright © 2016 Facebook. All rights reserved.
7+
//
8+
9+
import Foundation
10+
import GPUImage
11+
import AVFoundation
12+
//import AVKit
13+
14+
@objc(RNVideoPlayer)
15+
class RNVideoPlayer: RCTView {
16+
var player: AVPlayer! = nil
17+
var playerCurrentTimeObserver: Any! = nil
18+
var playerItem: AVPlayerItem! = nil
19+
var playerLayer: AVPlayerLayer! = nil
20+
var gpuMovie: GPUImageMovie! = nil
21+
let filterView: GPUImageView = GPUImageView()
22+
23+
var _playerHeight: CGFloat = UIScreen.main.bounds.height / 3
24+
var _playerWidth: CGFloat = UIScreen.main.bounds.width
25+
var _moviePathSource: NSString = ""
26+
var _playerStartTime: CGFloat = 0
27+
var _playerEndTime: CGFloat = 0
28+
29+
let LOG_KEY: String = "VIDEO_PROCESSING"
30+
31+
deinit {
32+
if self.playerCurrentTimeObserver != nil {
33+
self.player.removeTimeObserver(self.playerCurrentTimeObserver)
34+
print("CHANGED: Removing Oberver, that can be a cause of memory leak")
35+
}
36+
}
37+
// props
38+
var playerHeight: NSNumber? {
39+
set(val) {
40+
if val != nil {
41+
self._playerHeight = val as! CGFloat
42+
filterView.frame.size.height = self._playerHeight
43+
print("CHANGED HEIGHT \(val)")
44+
}
45+
}
46+
get {
47+
return nil
48+
}
49+
}
50+
51+
var playerWidth: NSNumber? {
52+
set(val) {
53+
if val != nil {
54+
self._playerWidth = val as! CGFloat
55+
filterView.frame.size.width = self._playerWidth
56+
print("CHANGED WIDTH \(val)")
57+
}
58+
}
59+
get {
60+
return nil
61+
}
62+
}
63+
64+
65+
// props
66+
var source: NSString? {
67+
set(val) {
68+
if val != nil {
69+
self._moviePathSource = val!
70+
}
71+
self.startPlayer()
72+
}
73+
get {
74+
return nil
75+
}
76+
}
77+
78+
// props
79+
var currentTime: NSNumber? {
80+
set(val) {
81+
if val != nil {
82+
let floatVal = val as! CGFloat
83+
if floatVal <= self._playerEndTime && floatVal >= self._playerStartTime {
84+
player.seek(to: CMTimeMakeWithSeconds(Float64(val!), Int32(NSEC_PER_SEC)))
85+
}
86+
print("CHANGED currentTime \(val)")
87+
}
88+
}
89+
get {
90+
return nil
91+
}
92+
}
93+
94+
// props
95+
var startTime: NSNumber? {
96+
set(val) {
97+
if val == nil {
98+
return
99+
}
100+
self._playerStartTime = val as! CGFloat
101+
let currentTime = CGFloat(CMTimeGetSeconds(player.currentTime()))
102+
var shouldBeCurrentTime: CGFloat = currentTime;
103+
104+
if self._playerStartTime > currentTime {
105+
shouldBeCurrentTime = self._playerStartTime
106+
}
107+
player.seek(
108+
to: convertToCMTime(val: shouldBeCurrentTime),
109+
toleranceBefore: convertToCMTime(val: self._playerStartTime),
110+
toleranceAfter: convertToCMTime(val: self._playerEndTime)
111+
)
112+
print("CHANGED startTime \(val)")
113+
}
114+
get {
115+
return nil
116+
}
117+
}
118+
119+
// props
120+
var endTime: NSNumber? {
121+
set(val) {
122+
if val == nil {
123+
return
124+
}
125+
self._playerEndTime = val as! CGFloat
126+
let currentTime = CGFloat(CMTimeGetSeconds(player.currentTime()))
127+
var shouldBeCurrentTime: CGFloat = currentTime;
128+
129+
if self._playerEndTime < currentTime {
130+
shouldBeCurrentTime = self._playerStartTime
131+
}
132+
133+
player.seek(
134+
to: convertToCMTime(val: shouldBeCurrentTime),
135+
toleranceBefore: convertToCMTime(val: self._playerStartTime),
136+
toleranceAfter: convertToCMTime(val: self._playerEndTime)
137+
)
138+
print("CHANGED endTime \(val)")
139+
}
140+
get {
141+
return nil
142+
}
143+
}
144+
145+
var play: NSNumber? {
146+
set(val) {
147+
if val == nil {
148+
return
149+
}
150+
print("CHANGED play \(val)")
151+
if val == 1 && player.rate == 0.0 {
152+
gpuMovie.startProcessing()
153+
player.play()
154+
} else if val == 0 && player.rate != 0.0 {
155+
gpuMovie.cancelProcessing()
156+
player.pause()
157+
}
158+
}
159+
get {
160+
return nil
161+
}
162+
}
163+
164+
func convertToCMTime(val: CGFloat) -> CMTime {
165+
return CMTimeMakeWithSeconds(Float64(val), Int32(NSEC_PER_SEC))
166+
}
167+
168+
func createPlayerObservers() -> Void {
169+
// TODO: clean obersable when View going to diesappear
170+
let interval = CMTimeMakeWithSeconds(1.0, Int32(NSEC_PER_SEC))
171+
self.playerCurrentTimeObserver = self.player.addPeriodicTimeObserver(
172+
forInterval: interval,
173+
queue: nil,
174+
using: {(_ time: CMTime) -> Void in
175+
print("CHANGED [playing] \(time)")
176+
let currentTime = CGFloat(CMTimeGetSeconds(time))
177+
if currentTime >= self._playerEndTime {
178+
self.play = 0
179+
}
180+
}
181+
)
182+
}
183+
184+
185+
// start player
186+
func startPlayer() {
187+
self.backgroundColor = UIColor.darkGray
188+
189+
let bundleURL = Bundle.main.resourceURL!
190+
let movieURL = URL(string: "2.mp4", relativeTo: bundleURL)!
191+
192+
player = AVPlayer()
193+
playerItem = AVPlayerItem(url: movieURL)
194+
player.replaceCurrentItem(with: playerItem)
195+
196+
if _playerEndTime == 0 {
197+
self._playerEndTime = CGFloat(CMTimeGetSeconds((player.currentItem?.asset.duration)!))
198+
print("CHANGED playerEndTime \(self._playerEndTime)")
199+
}
200+
201+
gpuMovie = GPUImageMovie(playerItem: playerItem)
202+
// gpuMovie.runBenchmark = true
203+
gpuMovie.playAtActualSpeed = true
204+
205+
filterView.frame = self.frame
206+
207+
filterView.frame.size.width = self._playerWidth
208+
filterView.frame.size.height = self._playerHeight
209+
210+
211+
print(self.frame.size.height)
212+
self.addSubview(filterView)
213+
gpuMovie.playAtActualSpeed = true
214+
215+
let filter = GPUImageSepiaFilter()
216+
gpuMovie.addTarget(filter)
217+
filter.addTarget(filterView)
218+
219+
self.createPlayerObservers()
220+
}
221+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#ifndef RNVideoProcessing_Bridging_Header_h
2+
#define RNVideoProcessing_Bridging_Header_h
3+
4+
#import "RCTBridgeModule.h"
5+
#import "GPUImage.h"
6+
7+
#endif /* RNVideoProcessing_Bridging_Header_h */

ios/RNVideoProcessing.h

Lines changed: 0 additions & 7 deletions
This file was deleted.

ios/RNVideoProcessing.m

Lines changed: 0 additions & 13 deletions
This file was deleted.

0 commit comments

Comments
 (0)