Advertisement
Guest User

Untitled

a guest
May 15th, 2019
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 70.55 KB | None | 0 0
  1. //
  2. // PlayerDisplayVCViewController.m
  3. // CameraProject
  4. //
  5. // Created by Tawhid Joarder on 4/15/19.
  6. // Copyright © 2019 BrainCraft LTD. All rights reserved.
  7. //
  8.  
  9. #import "PlayerDisplayVCViewController.h"
  10. #import "ViewController.h"
  11. #import <AssetsLibrary/AssetsLibrary.h>
  12. #define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
  13. #define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
  14. #define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
  15. #define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))
  16. @interface PlayerDisplayVCViewController ()<playerDisplayVCViewControllerDelegate>{
  17. AVPlayer *player;
  18.  
  19. AVMutableComposition *mutableComposition ;
  20. // UIView *seekBar;
  21. IBOutlet UIButton *playPause;
  22. AVPlayerItem *playerItem ;
  23. AVAsset *audioAsset;
  24. AVAsset *asset;
  25. AVAsset *asset2;
  26. id observer;
  27. IBOutlet UIView *playerViewBound;
  28. IBOutlet UISlider *sliderScroll;
  29.  
  30. // IBOutlet UIView *framGenerateView;
  31. ////// range bar start and end
  32.  
  33. IBOutlet UIImageView *endBound;
  34.  
  35. IBOutlet UIImageView *startBound;
  36. ///////
  37. UIImage *timeShow;
  38. }
  39.  
  40. @end
  41.  
  42. @implementation PlayerDisplayVCViewController
  43.  
  44. - (void)viewDidLoad {
  45. [super viewDidLoad];
  46.  
  47. ///// navigatiob slide off
  48. self.navigationController.interactivePopGestureRecognizer.enabled = NO;
  49. //NSLog(@"slide %f",sliderScroll.maximumValue);
  50. // asset = [AVAsset assetWithURL:_videoURL];
  51. PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc]init];
  52. options.version = PHVideoRequestOptionsVersionOriginal;
  53. options.deliveryMode = PHVideoRequestOptionsDeliveryModeAutomatic;
  54. options.networkAccessAllowed = YES;
  55. __block AVAsset *resultAsset;
  56.  
  57.  
  58. dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
  59. [[PHImageManager defaultManager] requestAVAssetForVideo:_qasset options:options resultHandler:^(AVAsset * avasset, AVAudioMix * audioMix, NSDictionary * info) {
  60.  
  61. // self->asset2 = avasset;
  62.  
  63.  
  64.  
  65. dispatch_semaphore_signal(semaphore);
  66. }];
  67.  
  68. [[PHImageManager defaultManager] requestAVAssetForVideo:_passet options:options resultHandler:^(AVAsset * avasset, AVAudioMix * audioMix, NSDictionary * info) {
  69.  
  70. dispatch_async(dispatch_get_main_queue(), ^{
  71. self->asset = avasset;
  72. AVMutableComposition *mainComposition = [[AVMutableComposition alloc] init];
  73.  
  74. AVMutableCompositionTrack *compositionVideoTrack = [mainComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
  75. AVMutableCompositionTrack *compositionAudioTrack = [mainComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
  76.  
  77. NSError *audioError;
  78. NSError *videoError;
  79. CMTime insertTime=kCMTimeZero;
  80.  
  81. AVAssetTrack *videoTrack = [ avasset tracksWithMediaType:AVMediaTypeVideo].firstObject;
  82. AVAssetTrack *audioTrack = [avasset tracksWithMediaType:AVMediaTypeAudio].firstObject;
  83. [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, avasset.duration) ofTrack: videoTrack atTime:insertTime error:&videoError];
  84. [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, avasset.duration) ofTrack: audioTrack atTime:insertTime error:&audioError];
  85. if (videoError) {
  86. NSLog(@"Error - %@", videoError.debugDescription);
  87. }
  88. if (audioError) {
  89. NSLog(@"Error - %@", audioError.debugDescription);
  90. }
  91. // insertTime=CMTimeMakeWithSeconds(CMTimeGetSeconds(insertTime), NSEC_PER_SEC);
  92. insertTime = avasset.duration;
  93.  
  94. AVMutableVideoCompositionLayerInstruction *ins = [ AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack: compositionVideoTrack];
  95. AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
  96. instruction.timeRange = CMTimeRangeMake(kCMTimeZero, mainComposition.duration);
  97.  
  98. CGSize originalSize = CGSizeMake( _viewPlayer.frame.size.width, _viewPlayer.frame.size.height);
  99. CGAffineTransform orig;
  100.  
  101.  
  102. AVMutableVideoComposition *videoComp = [ AVMutableVideoComposition videoComposition];
  103. videoComp.renderSize = originalSize;
  104. videoComp.frameDuration = CMTimeMake(1, 30);
  105.  
  106.  
  107. CGSize videoSize = CGSizeApplyAffineTransform(videoTrack.naturalSize,videoTrack.preferredTransform);
  108. videoSize = CGSizeMake(fabs(videoSize.width), fabs(videoSize.height));
  109. CGAffineTransform origTrans = videoTrack.preferredTransform ;
  110. if(videoSize.width>videoSize.height){
  111. origTrans = CGAffineTransformScale(origTrans,(originalSize.width/videoSize.width), (originalSize.width/videoSize.width) );
  112. CGSize vid = CGSizeApplyAffineTransform(videoSize, origTrans);
  113. vid = CGSizeMake(fabs(vid.width), fabs(vid.height));
  114. origTrans = CGAffineTransformTranslate(origTrans,(originalSize.width-vid.width)/2, (originalSize.height-vid.height)/2) ;
  115. }else {
  116. //origTrans = CGAffineTransformTranslate(origTrans, 0, 0);
  117. origTrans = CGAffineTransformScale(origTrans,fabs(originalSize.height/videoSize.height) , fabs(originalSize.height/videoSize.height));
  118.  
  119. // CGAffineTransform origTran = CGAffineTransformConcat(CGAffineTransformMakeScale(fabs(originalSize.height/videoSize.height), fabs(originalSize.height/videoSize.height)), CGAffineTransformMakeTranslation(0, 0));
  120. CGSize vid = CGSizeApplyAffineTransform(videoSize, origTrans);
  121.  
  122. vid = CGSizeMake(fabs(vid.width), fabs(vid.height));
  123. NSLog(@"after trans %f %f",videoSize.width,vid.width);
  124. orig = CGAffineTransformConcat(origTrans,CGAffineTransformMakeTranslation((originalSize.width-vid.height)/2, 0)) ;
  125. }
  126.  
  127.  
  128.  
  129.  
  130. // CGSizeMake([UIScreen mainScreen].bounds.size.width * [[UIScreen mainScreen] scale] , [UIScreen mainScreen].bounds.size.height * [[UIScreen mainScreen] scale] );
  131.  
  132.  
  133. [ins setTransform:orig atTime:kCMTimeZero];
  134. instruction.layerInstructions = [ NSArray arrayWithObject:ins ];
  135.  
  136. videoComp.instructions = [ NSArray arrayWithObject:instruction];
  137. CMTime duration;
  138. NSLog(@"time in mute %f",CMTimeGetSeconds(self->mutableComposition.duration));
  139. // if (CMTimeGetSeconds(audioAsset.duration) < CMTimeGetSeconds(asset.duration)) {
  140. // duration = audioAsset.duration;
  141. // } else
  142. {
  143. // duration = self->asset.duration;
  144. }
  145.  
  146. // double x = self->_scrollViewFake.frame.origin.x , y = _scrollViewFake.frame.origin.y , height = _scrollViewFake.frame.size.height
  147. // ,width = self->_scrollViewFake.frame.size.width;
  148. // NSLog(@"checking %f %f %f %f",x,y,width,height);
  149. NSLog(@"FF %f %f %f %f",self->_frameGenerateView.frame.origin.x,_frameGenerateView.frame.origin.y,_frameGenerateView.frame.size.width,_frameGenerateView.frame.size.height);
  150. self->_scrollView = [[thumbnailScrollView alloc] initWithFrame:CGRectMake(0,0,_frameGenerateView.frame.size.width, _frameGenerateView.frame.size
  151. .height) withDelegate:self andAsset:mainComposition frameView:_frameGenerateView];
  152. [self->_frameGenerateView addSubview:self->_scrollView];
  153. // temporary view
  154. //NSLog(@"tot %f content %f",self->videoTotalTime,videoTotalTime*3*100);
  155.  
  156. // UIView *tempView = [[UIView alloc]initWithFrame:(CGRect)CGRectMake(0, SCREEN_HEIGHT-200, 0.5, 0.5)];
  157. // tempView.backgroundColor = [UIColor clearColor];
  158. // [self.view addSubview:tempView];
  159. // seekbar initialiaztion
  160. //(void)(self->posX = 0) ,self->currentTime = 0 ;
  161. // self->seekBar = [[UIView alloc] initWithFrame:CGRectMake(60,-2,6*([UIScreen mainScreen].bounds.size.width/414), self->_frameGenerateView.frame.size
  162. // .height+4)];
  163. // self->seekBar.backgroundColor = [UIColor whiteColor];
  164. // self->seekBar.layer.cornerRadius = 3;
  165. // //seekBar.layer.masksToBounds = true;
  166. // self->seekBar.layer.shadowColor = [UIColor blackColor].CGColor;
  167. // self->seekBar.layer.shadowOpacity = 100;
  168. // self->seekBar.layer.shadowRadius = 6;// blur effect
  169. //seekBar.layer.shadowPath = shadowPath.CGPath;
  170.  
  171. self->_frameGenerateView.layer.cornerRadius = 4 ;
  172. self->_frameGenerateView.layer.masksToBounds = true ;
  173.  
  174. //[tempView addSubview:slider];//
  175. // [self.outsideOfFrameGenerateView addSubview:self->seekBar];
  176.  
  177. ///// bound view drawing
  178.  
  179. //self->startBound.backgroundColor = [ UIColor blueColor ];
  180.  
  181. [self->_outsideOfFrameGenerateView addSubview:self->startBound];
  182. [self->_outsideOfFrameGenerateView addSubview:self->endBound];
  183. self->sliderScroll.maximumValue = self->_scrollView.contentSize.width;
  184. NSLog(@"slide %f",self->sliderScroll.maximumValue);
  185. UIPanGestureRecognizer *startPanGR = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleStartPan:)];
  186. [self->startBound addGestureRecognizer:startPanGR];
  187. self->startBound.userInteractionEnabled = YES;
  188. UIView *tempView = [[UIView alloc]initWithFrame:(CGRect)CGRectMake(0, SCREEN_HEIGHT-200, 0.5, 0.5)];
  189. [self.view addSubview:tempView];
  190. UIPanGestureRecognizer *endPanGR = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleEndPan:)];
  191. [self->endBound addGestureRecognizer:endPanGR];
  192. self->endBound.userInteractionEnabled = YES ;
  193.  
  194.  
  195. UIPanGestureRecognizer *splitBatPan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleSplitPan:)];
  196. [self->_splitBar addGestureRecognizer:splitBatPan];
  197. self->_splitBar.userInteractionEnabled = YES ;
  198.  
  199.  
  200.  
  201. UIPanGestureRecognizer *seekBarTouch = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleSeekBarPan:)];
  202. [self->_seekBar addGestureRecognizer:seekBarTouch];
  203. self->_seekBar.userInteractionEnabled = YES;
  204. /////// play time show view initialization
  205. //[self->_toast setCenter:CGPointMake( self->seekBar.frame.origin.x+15 ,self->_toast.center.y)];
  206.  
  207. // [seekBar setCenter:CGPointMake(25,seekBar.center.y)];
  208. //[seekBar removeFromSuperview];
  209.  
  210. self->playerItem = [AVPlayerItem playerItemWithAsset:mainComposition];
  211. self->playerItem.videoComposition = videoComp;
  212. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:self->playerItem];
  213. self->player = [AVPlayer playerWithPlayerItem:self->playerItem];
  214. [self->player seekToTime:CMTimeMakeWithSeconds((self->videoTotalTime/(self->_scrollView.contentSize.width)), NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
  215. // player.frame = self.playerView.bounds;
  216. // __weak NSObject *weakSelf = self;
  217.  
  218. // [_toastStartBound setCenter:CGPointMake(-100,seekBar.center.y)];
  219. // _playerView.player = player;
  220. [self.playerView setOk:self->playerViewBound.bounds];
  221. [self.playerView setNeedsDisplay];
  222. [self.playerView setPlayer:self->player];
  223. // NSDateComponentsFormatter *dateComponentsFormatter = [[NSDateComponentsFormatter alloc] init];
  224. // dateComponentsFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad;
  225. // dateComponentsFormatter.allowedUnits = (NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond);
  226. // NSString *timeString = @" TOTAL" ;
  227. // self->_totalTimeShowLable.text = [NSString stringWithFormat:@"%@ %@",timeString, [dateComponentsFormatter stringFromTimeInterval:self->videoTotalTime] ];
  228. NSString *timeString = @" TOTAL" ;
  229. self->_totalTimeShowLable.text = [NSString stringWithFormat:@"%@ %@",timeString, [self timeFormatted:(int)videoTotalTime] ];
  230. timeNeededForExtraOutsideFrameGenerate = ((videoTotalTime/SCREEN_WIDTH)*(SCREEN_WIDTH-_frameGenerateView.frame.size.width))/2;
  231. xPosForExtraTime = (_frameGenerateView.frame.size.width/videoTotalTime)*timeNeededForExtraOutsideFrameGenerate;
  232. [_toastStartBound setCenter:CGPointMake(-1000,_toast.center.y)];
  233. [_toastEndBound setCenter:CGPointMake(-1000,_toast.center.y)];
  234.  
  235. /////// split view initialization
  236. selectOption = 0;
  237. _cutView.layer.zPosition = 0 ;
  238. _splitViewStart.layer.zPosition = 1;
  239. _splitViewStart.layer.opacity = 0.92;
  240. _splitViewStart.frame = CGRectMake(_frameGenerateView.frame.origin.x-startBound.frame.size.width,_cutView.frame.origin.y, startBound.frame.origin.x, _frameGenerateView.frame.size.height);
  241. _splitViewEnd.layer.zPosition = 1 ;
  242. _splitViewEnd.layer.opacity = 0.92 ;
  243. _splitViewEnd.frame = CGRectMake( endBound.frame.origin.x,_cutView.frame.origin.y, _frameGenerateView.frame.size.width - endBound.frame.origin.x
  244. , _frameGenerateView.frame.size.height);
  245. startBound.image = [UIImage imageNamed:@"Group 639"];
  246. endBound.image = [UIImage imageNamed:@"Group 640"];
  247. _splitBar.layer.zPosition=-10;
  248. startBoundYpos = startBound.center.y;
  249. endBoundYpos = endBound.center.y;
  250. });
  251.  
  252. //dispatch_semaphore_signal(semaphore);
  253. }];
  254. // dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  255.  
  256.  
  257.  
  258.  
  259. }
  260. - (IBAction)chooseTrimCutSplit:(id)sender {
  261.  
  262. UISegmentedControl *s = (UISegmentedControl *) sender ;
  263. if(s.selectedSegmentIndex == 0 ){
  264. // NSLog(@"trim");;
  265. [_splitBar setCenter:CGPointMake(-1000, 0)];
  266. [startBound setCenter:CGPointMake(startBound.frame.size.width, startBoundYpos)];
  267. [endBound setCenter:CGPointMake(_frameGenerateView.frame.size.width-3*endBound.frame.size.width, endBoundYpos)];
  268. startBound.image = [UIImage imageNamed:@"Group 639"];
  269. endBound.image = [UIImage imageNamed:@"Group 640"];
  270. selectOption = 0;
  271. _splitBar.layer.zPosition = 0 ;
  272. _cutView.layer.zPosition = 0 ;
  273. _splitViewStart.layer.zPosition = 1;
  274. _splitViewStart.layer.opacity = 0.92;
  275. _splitViewStart.frame = CGRectMake(_frameGenerateView.frame.origin.x-startBound.frame.size.width,_cutView.frame.origin.y, startBound.frame.origin.x, _frameGenerateView.frame.size.height);
  276. _splitViewEnd.layer.zPosition = 1 ;
  277. _splitViewEnd.layer.opacity = 0.92 ;
  278. _splitViewEnd.frame = CGRectMake( endBound.frame.origin.x,_cutView.frame.origin.y, _frameGenerateView.frame.size.width - endBound.frame.origin.x
  279. , _frameGenerateView.frame.size.height);
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286. }else if(s.selectedSegmentIndex == 1 ){
  287. // NSLog(@"cut");
  288. [_splitBar setCenter:CGPointMake(-1000, 0)];
  289. [startBound setCenter:CGPointMake(startBound.frame.size.width, startBoundYpos)];
  290. [endBound setCenter:CGPointMake(_frameGenerateView.frame.size.width-3*endBound.frame.size.width, endBoundYpos)];
  291. endBound.image = [UIImage imageNamed:@"Group 639"];
  292. startBound.image = [UIImage imageNamed:@"Group 640"];
  293. selectOption = 1 ;
  294. _splitBar.layer.zPosition = 0 ;
  295. _splitViewStart.layer.zPosition = 0 ;
  296. _splitViewEnd.layer.zPosition = 0 ;
  297. _cutView.layer.zPosition = 1;
  298. _cutView.layer.opacity = 0.92;
  299. _cutView.frame = CGRectMake(startBound.frame.origin.x,_cutView.frame.origin.y, endBound.frame.origin.x-(startBound.frame.origin.x), _frameGenerateView.frame.size.height);
  300.  
  301. }else {
  302. selectOption = 2 ;
  303. [_splitBar setCenter:CGPointMake(_frameGenerateView.center.x, startBound.center.y)];
  304. [startBound setCenter:CGPointMake(startBound.frame.size.width/2, -1000)];
  305. [endBound setCenter:CGPointMake(_frameGenerateView.frame.size.width+xPosForExtraTime, -1000)];
  306. _splitViewStart.layer.zPosition = 0 ;
  307. _splitViewEnd.layer.zPosition = 0 ;
  308. _cutView.layer.zPosition = 0 ;
  309. _splitBar.layer.zPosition = 1;
  310. // _seekBar.layer.zPosition = 1 ;
  311.  
  312. //[_seekBar setCenter:CGPointMake(30, _seekBar.center.y)];seekToTime:CMTimeMakeWithSeconds((videoTotalTime/(_frameGenerateView.frame.size.width))*(_frameGenerateView.frame.origin.x), NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
  313.  
  314. // [player seekToTime:CMTimeMakeWithSeconds((videoTotalTime/_frameGenerateView.frame.size.width)*(20-xPosForExtraTime), NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
  315.  
  316. NSLog(@"Split");
  317. }
  318. }
  319. NSURL * dataFilePath(NSString *path){
  320. //creating a path for file and checking if it already exist if exist then delete it
  321. NSString *outputPath = [[NSString alloc] initWithFormat:@"%@%@", NSTemporaryDirectory(), path];
  322.  
  323. BOOL success;
  324.  
  325. NSFileManager *fileManager = [NSFileManager defaultManager];
  326.  
  327. //check if file exist at outputPath
  328. success = [fileManager fileExistsAtPath:outputPath];
  329.  
  330. if (success) {
  331. //delete if file exist at outputPath
  332. NSLog(@"deleted file");
  333. success=[fileManager removeItemAtPath:outputPath error:nil];
  334. }
  335.  
  336. return [NSURL fileURLWithPath:outputPath];
  337.  
  338. }
  339. - (IBAction)saveButtoPressed:(id)sender {
  340.  
  341. NSLog(@"Save Button Pressed");
  342.  
  343.  
  344.  
  345. if(selectOption == 0 ){
  346. [self trimVideo];
  347. }else if ( selectOption == 1 ){
  348. [self cropVideo];
  349. }else {
  350. [self splitVideo];
  351. }
  352.  
  353. }
  354. - (void)splitVideo{
  355.  
  356.  
  357. int splitTime = (videoTotalTime/(_frameGenerateView.frame.size.width))*(_splitBar.center.x-xPosForExtraTime);
  358. //create exportSession and exportVideo Quality
  359.  
  360. AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetHighestQuality];
  361.  
  362. NSURL *outputVideoURL=dataFilePath(@"tmpPost.mp4"); //url of exportedVideo
  363.  
  364. exportSession.outputURL = outputVideoURL;
  365.  
  366. exportSession.shouldOptimizeForNetworkUse = YES;
  367.  
  368. exportSession.outputFileType = AVFileTypeQuickTimeMovie;
  369.  
  370. AVAssetExportSession *exportSession2 = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetHighestQuality];
  371.  
  372. NSURL *outputVideoURL2 =dataFilePath(@"tmpPost2.mp4"); //url of exportedVideo
  373.  
  374. exportSession2.outputURL = outputVideoURL2;
  375.  
  376. exportSession2.shouldOptimizeForNetworkUse = YES;
  377.  
  378. exportSession2.outputFileType = AVFileTypeQuickTimeMovie;
  379. /**
  380.  
  381.  
  382.  
  383. creating the time range i.e. make startTime and endTime.
  384.  
  385. startTime should be the first frame time at which your exportedVideo should start.
  386.  
  387. endTime is the time of last frame at which your exportedVideo should stop. OR it should be the duration of the excpected exportedVideo length
  388.  
  389. **/
  390. CMTime start = CMTimeMakeWithSeconds(0, 600);
  391. CMTime split = CMTimeMakeWithSeconds(splitTime, 600);
  392. CMTime end = CMTimeMakeWithSeconds(videoTotalTime-splitTime, 600);
  393.  
  394. CMTimeRange range1= CMTimeRangeMake(start,split);
  395. CMTimeRange range2= CMTimeRangeMake(split,end);
  396.  
  397. exportSession.timeRange = range1;
  398. exportSession2.timeRange = range2 ;
  399. dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  400. __block i = 0 , j = 0 ;
  401. dispatch_sync(aQueue,^{
  402. //NSLog(@"%s",dispatch_queue_get_label(aQueue));
  403. // NSLog(@"This is the global Dispatch Queue");
  404. [exportSession exportAsynchronouslyWithCompletionHandler:^(void){
  405.  
  406. switch (exportSession.status)
  407.  
  408. {
  409.  
  410. case
  411. AVAssetExportSessionStatusCompleted:
  412.  
  413. {
  414.  
  415.  
  416.  
  417. dispatch_async(dispatch_get_main_queue(), ^{
  418.  
  419. NSURL *finalUrl=dataFilePath(@"trimmedVideo.mp4");
  420.  
  421. NSData *urlData = [NSData dataWithContentsOfURL:outputVideoURL];
  422.  
  423. NSError *writeError;
  424.  
  425. //write exportedVideo to path/trimmedVideo.mp4
  426.  
  427. [urlData writeToURL:finalUrl options:NSAtomicWrite error:&writeError];
  428.  
  429. if (!writeError) {
  430.  
  431. //update Original URL
  432.  
  433. // originalURL=finalUrl;
  434. NSLog(@"saving");
  435. dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
  436. dispatch_async(q, ^{
  437.  
  438. NSData *videoData = [NSData dataWithContentsOfURL:finalUrl];
  439.  
  440. dispatch_async(dispatch_get_main_queue(), ^{
  441.  
  442. // Write it to cache directory
  443. NSString *videoPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"file.mov"];
  444. [videoData writeToFile:videoPath atomically:YES];
  445.  
  446. // After that use this path to save it to PhotoLibrary
  447. ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
  448. [library writeVideoAtPathToSavedPhotosAlbum:[NSURL fileURLWithPath:videoPath] completionBlock:^(NSURL *assetURL, NSError *error)
  449. {
  450. if (error)
  451. {
  452. NSLog(@"Error");
  453. }
  454. else
  455. {
  456. NSLog(@"F");
  457.  
  458. if ( i == 2 && j== 0 ){
  459. j = 1 ;
  460. NSString *message = @"Video split Done";
  461. UIAlertView *toast = [[UIAlertView alloc] initWithTitle:nil
  462. message:message
  463. delegate:nil
  464. cancelButtonTitle:nil
  465. otherButtonTitles:nil, nil];
  466. [toast show];
  467.  
  468. int duration = 1; // duration in seconds
  469.  
  470. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
  471. [toast dismissWithClickedButtonIndex:0 animated:YES];
  472. });
  473. NSLog(@"Success");
  474. }
  475. i = 1 ;
  476. }
  477.  
  478. }];
  479. });
  480. });
  481.  
  482. //update video Properties
  483.  
  484. // [self updateParameters];
  485.  
  486. }
  487.  
  488. NSLog(@"split Done %ld %@", (long)exportSession.status, exportSession.error);
  489.  
  490. });
  491.  
  492.  
  493. }
  494.  
  495. break;
  496.  
  497. case AVAssetExportSessionStatusFailed:
  498.  
  499. NSLog(@"split failed with error ===>>> %@",exportSession.error);
  500.  
  501. break;
  502.  
  503. case AVAssetExportSessionStatusCancelled:
  504.  
  505. NSLog(@"Canceled:%@",exportSession.error);
  506.  
  507. break;
  508.  
  509. default:
  510.  
  511. break;
  512.  
  513. }
  514.  
  515. }];
  516.  
  517. });
  518.  
  519. dispatch_sync(aQueue,^{
  520. // NSLog(@"%s",dispatch_queue_get_label(aQueue));
  521. // for (int i =0; i<5;i++)
  522. // {
  523. // NSLog(@"i %d",i);
  524. // sleep(1);
  525. // }
  526.  
  527. [exportSession2 exportAsynchronouslyWithCompletionHandler:^(void){
  528.  
  529. switch (exportSession2.status)
  530.  
  531. {
  532.  
  533. case
  534. AVAssetExportSessionStatusCompleted:
  535.  
  536. {
  537.  
  538.  
  539.  
  540. dispatch_async(dispatch_get_main_queue(), ^{
  541.  
  542. NSURL *finalUrl=dataFilePath(@"trimmedVideo2.mp4");
  543.  
  544. NSData *urlData = [NSData dataWithContentsOfURL:outputVideoURL2];
  545.  
  546. NSError *writeError;
  547.  
  548. //write exportedVideo to path/trimmedVideo.mp4
  549.  
  550. [urlData writeToURL:finalUrl options:NSAtomicWrite error:&writeError];
  551.  
  552. if (!writeError) {
  553.  
  554. //update Original URL
  555.  
  556. // originalURL=finalUrl;
  557. NSLog(@"saving");
  558. dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
  559. dispatch_async(q, ^{
  560.  
  561. NSData *videoData = [NSData dataWithContentsOfURL:finalUrl];
  562.  
  563. dispatch_async(dispatch_get_main_queue(), ^{
  564.  
  565. // Write it to cache directory
  566. NSString *videoPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"file.mov"];
  567. [videoData writeToFile:videoPath atomically:YES];
  568.  
  569. // After that use this path to save it to PhotoLibrary
  570. ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
  571. [library writeVideoAtPathToSavedPhotosAlbum:[NSURL fileURLWithPath:videoPath] completionBlock:^(NSURL *assetURL, NSError *error)
  572. {
  573. if (error)
  574. {
  575. NSLog(@"Error");
  576. }
  577. else
  578. {
  579. NSLog(@"S");
  580.  
  581. if ( i == 1 && j == 0 ){
  582. j = 1 ;
  583. NSString *message = @"Video split Done";
  584. UIAlertView *toast = [[UIAlertView alloc] initWithTitle:nil
  585. message:message
  586. delegate:nil
  587. cancelButtonTitle:nil
  588. otherButtonTitles:nil, nil];
  589. [toast show];
  590.  
  591. int duration = 1; // duration in seconds
  592.  
  593. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
  594. [toast dismissWithClickedButtonIndex:0 animated:YES];
  595. });
  596. NSLog(@"Success");
  597. }
  598. i = 2 ;
  599.  
  600. }
  601.  
  602. }];
  603. });
  604. });
  605.  
  606. //update video Properties
  607.  
  608. // [self updateParameters];
  609.  
  610. }
  611.  
  612. NSLog(@"Trim Done %ld %@", (long)exportSession.status, exportSession.error);
  613.  
  614. });
  615.  
  616.  
  617. }
  618.  
  619. break;
  620.  
  621. case AVAssetExportSessionStatusFailed:
  622.  
  623. NSLog(@"split failed with error ===>>> %@",exportSession.error);
  624.  
  625. break;
  626.  
  627. case AVAssetExportSessionStatusCancelled:
  628.  
  629. NSLog(@"Canceled:%@",exportSession.error);
  630.  
  631. break;
  632.  
  633. default:
  634.  
  635. break;
  636.  
  637. }
  638.  
  639. }];
  640. });
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647. }
  648. -(void)trimVideo{
  649.  
  650. int startTime = (videoTotalTime/(_frameGenerateView.frame.size.width))*(startBound.frame.origin.x+startBound.frame.size.width/2-xPosForExtraTime+startBound.frame.size.width/2.5) ;
  651. int endTime = (videoTotalTime/(_frameGenerateView.frame.size.width))*(endBound.frame.origin.x+_seekBar.frame.size.width/8-xPosForExtraTime);
  652. //create exportSession and exportVideo Quality
  653.  
  654. AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetHighestQuality];
  655.  
  656. NSURL *outputVideoURL=dataFilePath(@"tmpPost.mp4"); //url of exportedVideo
  657.  
  658. exportSession.outputURL = outputVideoURL;
  659.  
  660. exportSession.shouldOptimizeForNetworkUse = YES;
  661.  
  662. exportSession.outputFileType = AVFileTypeQuickTimeMovie;
  663.  
  664. /**
  665.  
  666. creating the time range i.e. make startTime and endTime.
  667.  
  668. startTime should be the first frame time at which your exportedVideo should start.
  669.  
  670. endTime is the time of last frame at which your exportedVideo should stop. OR it should be the duration of the excpected exportedVideo length
  671.  
  672. **/
  673. CMTime st = CMTimeMakeWithSeconds(startTime, 600);
  674. CMTime en = CMTimeMakeWithSeconds(endTime-startTime, 600);
  675. CMTimeRange range = CMTimeRangeMake(st,en );
  676.  
  677. exportSession.timeRange = range;
  678.  
  679. [exportSession exportAsynchronouslyWithCompletionHandler:^(void){
  680.  
  681. switch (exportSession.status)
  682.  
  683. {
  684.  
  685. case
  686. AVAssetExportSessionStatusCompleted:
  687.  
  688. {
  689.  
  690. dispatch_async(dispatch_get_main_queue(), ^{
  691.  
  692. NSURL *finalUrl=dataFilePath(@"trimmedVideo.mp4");
  693.  
  694. NSData *urlData = [NSData dataWithContentsOfURL:outputVideoURL];
  695.  
  696. NSError *writeError;
  697.  
  698. //write exportedVideo to path/trimmedVideo.mp4
  699.  
  700. [urlData writeToURL:finalUrl options:NSAtomicWrite error:&writeError];
  701.  
  702. if (!writeError) {
  703.  
  704. //update Original URL
  705.  
  706. // originalURL=finalUrl;
  707. NSLog(@"saving");
  708. dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
  709. dispatch_async(q, ^{
  710.  
  711. NSData *videoData = [NSData dataWithContentsOfURL:finalUrl];
  712.  
  713. dispatch_async(dispatch_get_main_queue(), ^{
  714.  
  715. // Write it to cache directory
  716. NSString *videoPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"file.mov"];
  717. [videoData writeToFile:videoPath atomically:YES];
  718.  
  719. // After that use this path to save it to PhotoLibrary
  720. ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
  721. [library writeVideoAtPathToSavedPhotosAlbum:[NSURL fileURLWithPath:videoPath] completionBlock:^(NSURL *assetURL, NSError *error)
  722. {
  723. if (error)
  724. {
  725. NSLog(@"Error");
  726. }
  727. else
  728. {
  729. NSString *message = @"Video Trim Done";
  730. UIAlertView *toast = [[UIAlertView alloc] initWithTitle:nil
  731. message:message
  732. delegate:nil
  733. cancelButtonTitle:nil
  734. otherButtonTitles:nil, nil];
  735. [toast show];
  736.  
  737. int duration = 1; // duration in seconds
  738.  
  739. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
  740. [toast dismissWithClickedButtonIndex:0 animated:YES];
  741. });
  742. NSLog(@"Success");
  743. }
  744.  
  745. }];
  746. });
  747. });
  748.  
  749. //update video Properties
  750.  
  751. // [self updateParameters];
  752.  
  753. }
  754.  
  755. NSLog(@"Trim Done %ld %@", (long)exportSession.status, exportSession.error);
  756.  
  757. });
  758.  
  759.  
  760. }
  761.  
  762. break;
  763.  
  764. case AVAssetExportSessionStatusFailed:
  765.  
  766. NSLog(@"Trim failed with error ===>>> %@",exportSession.error);
  767.  
  768. break;
  769.  
  770. case AVAssetExportSessionStatusCancelled:
  771.  
  772. NSLog(@"Canceled:%@",exportSession.error);
  773.  
  774. break;
  775.  
  776. default:
  777.  
  778. break;
  779.  
  780. }
  781.  
  782. }];
  783.  
  784. }
  785. -(void)cropVideo{
  786.  
  787.  
  788. int startTime = (videoTotalTime/(_frameGenerateView.frame.size.width))*(startBound.frame.origin.x+startBound.frame.size.width/2-xPosForExtraTime+startBound.frame.size.width/2.5) ;
  789. int endTime = (videoTotalTime/(_frameGenerateView.frame.size.width))*(endBound.frame.origin.x+_seekBar.frame.size.width/8-xPosForExtraTime);
  790.  
  791. CMTime st = CMTimeMakeWithSeconds(startTime, 600);
  792. CMTime en = CMTimeMakeWithSeconds(endTime-startTime, 600);
  793. CMTimeRange range = CMTimeRangeMake(st,en );
  794. AVMutableComposition *mutableComposition = [AVMutableComposition composition];
  795. AVMutableCompositionTrack *videoCompositionTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
  796. AVAssetTrack *videoAssetTrack = [asset tracksWithMediaType:AVMediaTypeVideo].firstObject;
  797. AVMutableCompositionTrack *audioCompositionTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
  798. AVAssetTrack *audioAssetTrack = [asset tracksWithMediaType:AVMediaTypeAudio].firstObject;
  799. CMTime time = kCMTimeZero;
  800. NSError *videoError;
  801. [videoCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAssetTrack.timeRange.duration)
  802. ofTrack:videoAssetTrack
  803. atTime:time
  804. error:&videoError];
  805. [audioCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAssetTrack.timeRange.duration)
  806. ofTrack:audioAssetTrack
  807. atTime:time
  808. error:&videoError];
  809. [videoCompositionTrack removeTimeRange:range];
  810. [audioCompositionTrack removeTimeRange:range];
  811. if (videoError) {
  812. NSLog(@"Error - %@", videoError.debugDescription);
  813. }
  814.  
  815. AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:mutableComposition presetName:AVAssetExportPresetHighestQuality];
  816.  
  817. NSURL *outputVideoURL=dataFilePath(@"tmpPost.mp4"); //url of exportedVideo
  818.  
  819. exportSession.outputURL = outputVideoURL;
  820.  
  821. exportSession.shouldOptimizeForNetworkUse = YES;
  822.  
  823. exportSession.outputFileType = AVFileTypeQuickTimeMovie;
  824.  
  825. /**
  826.  
  827. creating the time range i.e. make startTime and endTime.
  828.  
  829. startTime should be the first frame time at which your exportedVideo should start.
  830.  
  831. endTime is the time of last frame at which your exportedVideo should stop. OR it should be the duration of the excpected exportedVideo length
  832.  
  833. **/
  834.  
  835.  
  836. exportSession.timeRange = videoCompositionTrack.timeRange;
  837.  
  838. [exportSession exportAsynchronouslyWithCompletionHandler:^(void){
  839.  
  840. switch (exportSession.status)
  841.  
  842. {
  843.  
  844. case
  845. AVAssetExportSessionStatusCompleted:
  846.  
  847. {
  848.  
  849. dispatch_async(dispatch_get_main_queue(), ^{
  850.  
  851. NSURL *finalUrl=dataFilePath(@"trimmedVideo.mp4");
  852.  
  853. NSData *urlData = [NSData dataWithContentsOfURL:outputVideoURL];
  854.  
  855. NSError *writeError;
  856.  
  857. //write exportedVideo to path/trimmedVideo.mp4
  858.  
  859. [urlData writeToURL:finalUrl options:NSAtomicWrite error:&writeError];
  860.  
  861. if (!writeError) {
  862.  
  863. //update Original URL
  864.  
  865. // originalURL=finalUrl;
  866. NSLog(@"saving");
  867. dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
  868. dispatch_async(q, ^{
  869.  
  870. NSData *videoData = [NSData dataWithContentsOfURL:finalUrl];
  871.  
  872. dispatch_async(dispatch_get_main_queue(), ^{
  873.  
  874. // Write it to cache directory
  875. NSString *videoPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"file.mov"];
  876. [videoData writeToFile:videoPath atomically:YES];
  877.  
  878. // After that use this path to save it to PhotoLibrary
  879. ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
  880. [library writeVideoAtPathToSavedPhotosAlbum:[NSURL fileURLWithPath:videoPath] completionBlock:^(NSURL *assetURL, NSError *error)
  881. {
  882. if (error)
  883. {
  884. NSLog(@"Error");
  885. }
  886. else
  887. {
  888. NSString *message = @"Video Cut Done";
  889. UIAlertView *toast = [[UIAlertView alloc] initWithTitle:nil
  890. message:message
  891. delegate:nil
  892. cancelButtonTitle:nil
  893. otherButtonTitles:nil, nil];
  894. [toast show];
  895.  
  896. int duration = 1; // duration in seconds
  897.  
  898. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
  899. [toast dismissWithClickedButtonIndex:0 animated:YES];
  900. });
  901.  
  902. NSLog(@"Success");
  903. }
  904.  
  905. }];
  906. });
  907. });
  908.  
  909. //update video Properties
  910.  
  911. // [self updateParameters];
  912.  
  913. }
  914.  
  915. NSLog(@"Cut Done %ld %@", (long)exportSession.status, exportSession.error);
  916.  
  917. });
  918.  
  919.  
  920. }
  921.  
  922. break;
  923.  
  924. case AVAssetExportSessionStatusFailed:
  925.  
  926. NSLog(@"Cut failed with error ===>>> %@",exportSession.error);
  927.  
  928. break;
  929.  
  930. case AVAssetExportSessionStatusCancelled:
  931.  
  932. NSLog(@"Canceled:%@",exportSession.error);
  933.  
  934. break;
  935.  
  936. default:
  937.  
  938. break;
  939.  
  940. }
  941.  
  942. }];
  943.  
  944. }
  945. -(void)handleScrollPan:(UIPanGestureRecognizer *)recognizer{
  946.  
  947. // NSLog(@"asdasdasdasd");
  948. // [seekBar setCenter:CGPointMake(-1000,seekBar.center.y)];
  949.  
  950. }
  951. -(void)handleSplitPan:(UIPanGestureRecognizer *)recognizer{
  952.  
  953. // NSLog(@"asdasdasdasd");
  954. // [seekBar setCenter:CGPointMake(-1000,seekBar.center.y)];
  955.  
  956. if(recognizer.state == UIGestureRecognizerStateBegan)
  957. {
  958. [self PlayerSetPlayPause:playPause withPlayingStatus:1];
  959. _toast.text = @"";
  960. // [seekBar setCenter:CGPointMake(-100,seekBar.center.y)];
  961. // [_toast setCenter:CGPointMake(-100 ,_toast.center.y)];
  962.  
  963. //All fingers are lifted.
  964. }
  965. UIView *pannedView = recognizer.view ;
  966. CGPoint translation = [recognizer translationInView:pannedView.superview];
  967. CGPoint point;
  968. // NSLog(@"pan %f",pannedView.center.x + translation.x);
  969. double extraSpace =(SCREEN_WIDTH-_frameGenerateView.frame.size.width)/2;
  970. if(pannedView.center.x + translation.x > SCREEN_WIDTH-extraSpace){
  971. point = CGPointMake(SCREEN_WIDTH-extraSpace, pannedView.center.y);
  972. }else if(pannedView.center.x + translation.x < (_splitBar.frame.size.width/2) ){
  973. point = CGPointMake((_splitBar.frame.size.width/2), pannedView.center.y);
  974. }else {
  975. point = CGPointMake(pannedView.center.x + translation.x , pannedView.center.y);
  976. }
  977.  
  978. if(point.x < extraSpace ){
  979. point.x= extraSpace;
  980. }
  981. pannedView.center = point;
  982. // NSLog(@"start touch %f seekbar %f ",point.x-10,_seekBar.center.x-5);
  983. [recognizer setTranslation:CGPointZero inView:pannedView.superview];
  984.  
  985. // [seekBar setCenter:CGPointMake(-1000,seekBar.center.y)];
  986.  
  987. if(recognizer.state == UIGestureRecognizerStateEnded)
  988. {
  989.  
  990. // _toast.text = @"";
  991.  
  992.  
  993. // [_toast setCenter:CGPointMake( seekBar.frame.origin.x ,_toast.center.y)];
  994.  
  995. //All fingers are lifted.
  996. }
  997. _toast.text =[self timeFormatted:(videoTotalTime/(_frameGenerateView.frame.size.width))*(point.x-xPosForExtraTime)];
  998. [player seekToTime:CMTimeMakeWithSeconds((videoTotalTime/(_frameGenerateView.frame.size.width))*(point.x-xPosForExtraTime), NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
  999.  
  1000. }
  1001.  
  1002.  
  1003. -(void)handleSeekBarPan:(UIPanGestureRecognizer *)recognizer{
  1004.  
  1005. // NSLog(@"asdasdasdasd");
  1006. // [seekBar setCenter:CGPointMake(-1000,seekBar.center.y)];
  1007.  
  1008. if(recognizer.state == UIGestureRecognizerStateBegan)
  1009. {
  1010. [self PlayerSetPlayPause:playPause withPlayingStatus:1];
  1011. // _toast.text = @"";
  1012. // [seekBar setCenter:CGPointMake(-100,seekBar.center.y)];
  1013. // [_toast setCenter:CGPointMake(-100 ,_toast.center.y)];
  1014.  
  1015. //All fingers are lifted.
  1016. }
  1017. UIView *pannedView = recognizer.view ;
  1018. CGPoint translation = [recognizer translationInView:pannedView.superview];
  1019. CGPoint point;
  1020. // NSLog(@"pan %f",pannedView.center.x + translation.x);
  1021. double extraSpace =(SCREEN_WIDTH-_frameGenerateView.frame.size.width)/2;
  1022. if(pannedView.center.x + translation.x > SCREEN_WIDTH-extraSpace){
  1023. point = CGPointMake(SCREEN_WIDTH-extraSpace, pannedView.center.y);
  1024. }else if(pannedView.center.x + translation.x < (_seekBar.frame.size.width/2) ){
  1025. point = CGPointMake((_seekBar.frame.size.width/2), pannedView.center.y);
  1026. }else {
  1027. point = CGPointMake(pannedView.center.x + translation.x , pannedView.center.y);
  1028. }
  1029.  
  1030. if(point.x < extraSpace ){
  1031. point.x= extraSpace;
  1032. }
  1033.  
  1034. pannedView.center = point;
  1035. // NSLog(@"start touch %f seekbar %f ",point.x-10,_seekBar.center.x-5);
  1036. [recognizer setTranslation:CGPointZero inView:pannedView.superview];
  1037.  
  1038. // [seekBar setCenter:CGPointMake(-1000,seekBar.center.y)];
  1039.  
  1040. if(recognizer.state == UIGestureRecognizerStateEnded)
  1041. {
  1042.  
  1043. // _toast.text = @"";
  1044.  
  1045.  
  1046. // [_toast setCenter:CGPointMake( seekBar.frame.origin.x ,_toast.center.y)];
  1047.  
  1048. //All fingers are lifted.
  1049. }
  1050. NSLog(@"seekbar time %f",(videoTotalTime/(_frameGenerateView.frame.size.width))*(point.x-xPosForExtraTime));
  1051. _toast.text =[self timeFormatted:(videoTotalTime/(_frameGenerateView.frame.size.width))*(point.x-xPosForExtraTime)];
  1052. [player seekToTime:CMTimeMakeWithSeconds((videoTotalTime/(_frameGenerateView.frame.size.width))*(point.x-xPosForExtraTime), NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
  1053.  
  1054. }
  1055.  
  1056.  
  1057.  
  1058. -(void)handleStartPan:(UIPanGestureRecognizer *)recognizer{
  1059.  
  1060. // NSLog(@"asdasdasdasd");
  1061. // [seekBar setCenter:CGPointMake(-1000,seekBar.center.y)];
  1062.  
  1063. if(recognizer.state == UIGestureRecognizerStateBegan)
  1064. {
  1065. if(player.rate){
  1066. [self PlayerSetPlayPause:playPause withPlayingStatus:1];
  1067. }
  1068.  
  1069. // NSLog(@"start");
  1070. // _toast.text = @"";
  1071. [_toastStartBound setCenter:CGPointMake(startBound.frame.origin.x+startBound.frame.size.width/2,_toast.center.y)];
  1072. [_toastEndBound setCenter:CGPointMake(endBound.frame.origin.x+endBound.frame.size.width/2,_toast.center.y)];
  1073. // [seekBar setCenter:CGPointMake(-100,seekBar.center.y)];
  1074. // [_toast setCenter:CGPointMake(-100 ,_toast.center.y)];
  1075.  
  1076. //All fingers are lifted.
  1077. }
  1078.  
  1079. if(_toastStartBound.frame.origin.x + _toastEndBound.frame.size.width > _toastEndBound.frame.origin.x){
  1080. // [[UIApplication sharedApplication].keyWindow bringSubviewToFront:_toastStartBound];
  1081. //[self.view bringSubviewToFront:_toastStartBound];
  1082. _toastEndBound.layer.zPosition = 0;
  1083. _toastStartBound.layer.zPosition = 1;
  1084. NSLog(@"start oevrplap end");
  1085. }
  1086.  
  1087. UIView *pannedView = recognizer.view ;
  1088. CGPoint translation = [recognizer translationInView:pannedView.superview];
  1089. CGPoint point;
  1090. // NSLog(@"pan %f",pannedView.center.x + translation.x);
  1091. if(pannedView.center.x + translation.x > SCREEN_WIDTH-(endBound.frame.size.width/2)){
  1092. point = CGPointMake(SCREEN_WIDTH-(endBound.frame.size.width/2), pannedView.center.y);
  1093. }else if(pannedView.center.x + translation.x < (endBound.frame.size.width/2) ){
  1094. point = CGPointMake((endBound.frame.size.width/2), pannedView.center.y);
  1095. }else {
  1096. point = CGPointMake(pannedView.center.x + translation.x , pannedView.center.y);
  1097.  
  1098. }
  1099. CGRect endBoundVal = endBound.frame;
  1100. if (point.x > endBoundVal.origin.x-(_seekBar.frame.size.width/2)){
  1101. point.x = endBoundVal.origin.x-(_seekBar.frame.size.width/2);
  1102. }
  1103. if(point.x < startBound.frame.size.width/2){
  1104. point.x= startBound.frame.size.width/2;
  1105. }
  1106. pannedView.center = point;
  1107. // NSLog(@"start touch %f seekbar %f ",point.x-10,_seekBar.center.x-5);
  1108. [recognizer setTranslation:CGPointZero inView:pannedView.superview];
  1109. // NSDateComponentsFormatter *dateComponentsFormatter = [[NSDateComponentsFormatter alloc] init];
  1110. // dateComponentsFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad;
  1111. // dateComponentsFormatter.allowedUnits = (NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond);
  1112. // _toastStartBound.text =[dateComponentsFormatter stringFromTimeInterval:(videoTotalTime/(_frameGenerateView.frame.size.width))*(point.x-xPosForExtraTime+startBound.frame.size.width/2.5)];
  1113.  
  1114. [_toastStartBound setCenter:CGPointMake(startBound.frame.origin.x+startBound.frame.size.width/2,_toast.center.y)];
  1115.  
  1116. //
  1117. // dateComponentsFormatter = [[NSDateComponentsFormatter alloc] init];
  1118. // dateComponentsFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad;
  1119. // dateComponentsFormatter.allowedUnits = (NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond);
  1120. // _toastEndBound.text =[dateComponentsFormatter stringFromTimeInterval:(videoTotalTime/(_frameGenerateView.frame.size.width))*(endBound.frame.origin.x+_seekBar.frame.size.width/2.5-xPosForExtraTime)];
  1121.  
  1122. double endValue = endBound.frame.origin.x+endBound.frame.size.width/2 ;
  1123. if ( endValue > SCREEN_WIDTH - _toastEndBound.frame.size.width/2){
  1124. endValue = SCREEN_WIDTH - _toastEndBound.frame.size.width/2;
  1125. }
  1126. [_toastEndBound setCenter:CGPointMake(endValue,_toast.center.y)];
  1127.  
  1128. int startTime = (videoTotalTime/(_frameGenerateView.frame.size.width))*(startBound.frame.origin.x+startBound.frame.size.width/2-xPosForExtraTime+startBound.frame.size.width/2.5) ;
  1129. int endTime = (videoTotalTime/(_frameGenerateView.frame.size.width))*(endBound.frame.origin.x+_seekBar.frame.size.width/8-xPosForExtraTime);
  1130. NSString *timeString = @" TOTAL" ;
  1131.  
  1132. _toastStartBound.text = [self timeFormatted:startTime];
  1133. _toastEndBound.text = [self timeFormatted:endTime];
  1134. if(selectOption == 0 ){
  1135. self->_totalTimeShowLable.text = [NSString stringWithFormat:@"%@ %@",timeString, [self timeFormatted:(int)(endTime-startTime)] ];
  1136. _splitViewStart.frame = CGRectMake(_frameGenerateView.frame.origin.x-startBound.frame.size.width,_cutView.frame.origin.y, startBound.frame.origin.x, _frameGenerateView.frame.size.height);
  1137. }else if ( selectOption == 1 ){
  1138. self->_totalTimeShowLable.text = [NSString stringWithFormat:@"%@ %@",timeString, [self timeFormatted:(int)(videoTotalTime- (endTime-startTime) ) ] ];
  1139. _cutView.frame = CGRectMake(startBound.frame.origin.x,_cutView.frame.origin.y, endBound.frame.origin.x-(startBound.frame.origin.x), _frameGenerateView.frame.size.height);
  1140. }else {
  1141.  
  1142.  
  1143. }
  1144.  
  1145.  
  1146. if(recognizer.state == UIGestureRecognizerStateEnded)
  1147. {
  1148.  
  1149. if(!player.rate){
  1150. [self PlayerSetPlayPause:playPause withPlayingStatus:0];
  1151. }
  1152.  
  1153.  
  1154. // _toast.text = @"";
  1155. [_toastEndBound setCenter:CGPointMake(-1000,_toast.center.y)];
  1156. [_toastStartBound setCenter:CGPointMake(-1000,_toast.center.y)];
  1157. // [seekBar setCenter:CGPointMake(point.x+ startBound.frame.size.width/2+ seekBar.frame.size.width/2,seekBar.center.y)];
  1158. // [_toast setCenter:CGPointMake( point.x+ startBound.frame.size.width/2+ seekBar.frame.size.width/2 ,_toast.center.y)];
  1159.  
  1160. //All fingers are lifted.
  1161. }
  1162. if(!player.rate){
  1163. [self PlayerSetPlayPause:playPause withPlayingStatus:0];
  1164. }
  1165. [player seekToTime:CMTimeMakeWithSeconds((videoTotalTime/(_frameGenerateView.frame.size.width))*(point.x-xPosForExtraTime+startBound.frame.size.width/2.5), NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
  1166.  
  1167. }
  1168.  
  1169. -(void)handleEndPan:(UIPanGestureRecognizer *)recognizer{
  1170.  
  1171. // NSLog(@"asdasdasdasd");
  1172. if(recognizer.state == UIGestureRecognizerStateBegan)
  1173. {
  1174. if(player.rate){
  1175. [self PlayerSetPlayPause:playPause withPlayingStatus:1];
  1176. }
  1177.  
  1178.  
  1179.  
  1180. //_toast.text = @"";
  1181. [_toastStartBound setCenter:CGPointMake(startBound.frame.origin.x+startBound.frame.size.width/2,_toast.center.y)];
  1182. [_toastEndBound setCenter:CGPointMake(endBound.frame.origin.x+endBound.frame.size.width/2,_toast.center.y)];
  1183. //[seekBar setCenter:CGPointMake(-100,seekBar.center.y)];
  1184. //[_toast setCenter:CGPointMake(-100 ,_toast.center.y)];
  1185.  
  1186. //All fingers are lifted.
  1187. }
  1188.  
  1189. if(_toastEndBound.frame.origin.x < _toastStartBound.frame.origin.x+_toastStartBound.frame.size
  1190. .width){
  1191. // [[UIApplication sharedApplication].keyWindow bringSubviewToFront:_toastStartBound];
  1192. //[self.view bringSubviewToFront:_toastStartBound];
  1193. _toastStartBound.layer.zPosition = 0;
  1194. _toastEndBound.layer.zPosition = 1;
  1195. NSLog(@"start oevrplap end");
  1196. }
  1197. UIView *pannedView = recognizer.view ;
  1198. CGPoint translation = [recognizer translationInView:pannedView.superview];
  1199. CGPoint point;
  1200. // NSLog(@"pan %f",pannedView.center.x + translation.x);
  1201. if(pannedView.center.x + translation.x > SCREEN_WIDTH-(endBound.frame.size.width/2)){
  1202. point = CGPointMake(SCREEN_WIDTH-(endBound.frame.size.width/2), pannedView.center.y);
  1203. }else if(pannedView.center.x + translation.x < (endBound.frame.size.width/2) ){
  1204. point = CGPointMake((endBound.frame.size.width/2), pannedView.center.y);
  1205. }else {
  1206. point = CGPointMake(pannedView.center.x + translation.x , pannedView.center.y);
  1207. }
  1208. CGRect starBoundVal = startBound.frame;
  1209. if (point.x < starBoundVal.origin.x+_seekBar.frame.size.width+endBound.frame.size.width/2){
  1210. point.x = starBoundVal.origin.x+_seekBar.frame.size.width+endBound.frame.size.width/2;
  1211. }
  1212. if(point.x > SCREEN_WIDTH- endBound.frame.size.width/2){
  1213. point.x= SCREEN_WIDTH- endBound.frame.size.width/2;
  1214. }
  1215.  
  1216. // NSLog(@"start point %f end oint %f",starBoundVal.origin.x,point.x);
  1217. pannedView.center = point;
  1218. [recognizer setTranslation:CGPointZero inView:pannedView.superview];
  1219.  
  1220. // NSDateComponentsFormatter *dateComponentsFormatter = [[NSDateComponentsFormatter alloc] init];
  1221. // dateComponentsFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad;
  1222. // dateComponentsFormatter.allowedUnits = (NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond);
  1223. // _toastStartBound.text =[dateComponentsFormatter stringFromTimeInterval:(videoTotalTime/(_frameGenerateView.frame.size.width))*(startBound.frame.origin.x+startBound.frame.size.width/2-xPosForExtraTime+startBound.frame.size.width/2.5)];
  1224.  
  1225. [_toastStartBound setCenter:CGPointMake(startBound.frame.origin.x+startBound.frame.size.width/2,_toast.center.y)];
  1226.  
  1227.  
  1228. // dateComponentsFormatter = [[NSDateComponentsFormatter alloc] init];
  1229. // dateComponentsFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad;
  1230. // dateComponentsFormatter.allowedUnits = (NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond);
  1231. // _toastEndBound.text =[dateComponentsFormatter stringFromTimeInterval:(videoTotalTime/(_frameGenerateView.frame.size.width))*(endBound.frame.origin.x+_seekBar.frame.size.width/8-xPosForExtraTime)];
  1232.  
  1233. double endValue = endBound.frame.origin.x+endBound.frame.size.width/2 ;
  1234. if ( endValue > SCREEN_WIDTH - _toastEndBound.frame.size.width/2){
  1235. endValue = SCREEN_WIDTH - _toastEndBound.frame.size.width/2;
  1236. }
  1237. [_toastEndBound setCenter:CGPointMake(endValue,_toast.center.y)];
  1238. int startTime = (videoTotalTime/(_frameGenerateView.frame.size.width))*(startBound.frame.origin.x+startBound.frame.size.width/2-xPosForExtraTime+startBound.frame.size.width/2.5) ;
  1239. int endTime = (videoTotalTime/(_frameGenerateView.frame.size.width))*(endBound.frame.origin.x+_seekBar.frame.size.width/8-xPosForExtraTime);
  1240. NSString *timeString = @" TOTAL" ;
  1241.  
  1242. _toastStartBound.text = [self timeFormatted:startTime];
  1243. _toastEndBound.text = [self timeFormatted:endTime];
  1244. if(selectOption == 0 ){
  1245. // _splitViewStart.frame = CGRectMake(_frameGenerateView.frame.origin.x,_cutView.frame.origin.y, startBound.frame.origin.x-_frameGenerateView.frame.origin.x, _frameGenerateView.frame.size.height);
  1246. self->_totalTimeShowLable.text = [NSString stringWithFormat:@"%@ %@",timeString, [self timeFormatted:(int)(endTime-startTime)] ];
  1247. _splitViewEnd.frame = CGRectMake( endBound.frame.origin.x,_cutView.frame.origin.y, _frameGenerateView.frame.size.width - endBound.frame.origin.x
  1248. , _frameGenerateView.frame.size.height);
  1249. }else if ( selectOption == 1 ){
  1250. self->_totalTimeShowLable.text = [NSString stringWithFormat:@"%@ %@",timeString, [self timeFormatted:(int)(videoTotalTime- (endTime-startTime) ) ] ];
  1251. _cutView.frame = CGRectMake(startBound.frame.origin.x,_cutView.frame.origin.y, endBound.frame.origin.x-(startBound.frame.origin.x), _frameGenerateView.frame.size.height);
  1252. }else {
  1253.  
  1254.  
  1255. }
  1256.  
  1257.  
  1258. if(recognizer.state == UIGestureRecognizerStateEnded)
  1259. {
  1260. if(!player.rate){
  1261. [self PlayerSetPlayPause:playPause withPlayingStatus:0];
  1262. }
  1263.  
  1264.  
  1265. [_toastEndBound setCenter:CGPointMake(-1000,_toast.center.y)];
  1266. [_toastStartBound setCenter:CGPointMake(-1000,_toast.center.y)];
  1267. // _toast.text = @"";
  1268. //[seekBar setCenter:CGPointMake(startBound.frame.origin.x+ startBound.frame.size.width+ seekBar.frame.size.width/2,seekBar.center.y)];
  1269. //[_toast setCenter:CGPointMake(startBound.frame.origin.x+ startBound.frame.size.width+ seekBar.frame.size.width/2 ,_toast.center.y)];
  1270.  
  1271. }
  1272. // [player seekToTime:CMTimeMakeWithSeconds((videoTotalTime/(_frameGenerateView.frame.size.width))*(startBound.frame.origin.x+startBound.frame.size.width/2-xPosForExtraTime+startBound.frame.size.width/2.5), NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
  1273.  
  1274. }
  1275. - (void)viewWillAppear:(BOOL)animated{
  1276. ///[[self navigationController] setNavigationBarHidden:YES animated:YES];
  1277. // playerItem = [AVPlayerItem playerItemWithURL:_videoURL];
  1278. // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];
  1279. // player = [AVPlayer playerWithPlayerItem:playerItem];
  1280. // slider.maximumValue = CMTimeGetSeconds(playerItem.asset.duration);
  1281. // slider.hidden = NO;
  1282. // [slider setValue:0];
  1283. // // _playerView.player = player;
  1284. // [self.playerView setPlayer:player];
  1285. }
  1286. #pragma mark -play/pause
  1287. - (IBAction)playPauseAction:(id)sender {
  1288. UIButton *btn = (UIButton*)sender;
  1289. [self PlayerSetPlayPause:btn withPlayingStatus:player.rate];
  1290. }
  1291.  
  1292. - (void) PlayerSetPlayPause : (UIButton*)btn withPlayingStatus:(float)rate{
  1293. if (rate) {
  1294. [player pause];
  1295. // [btn setTitle:@"Play" forState:UIControlStateNormal];
  1296. if (observer) {
  1297. [player removeTimeObserver:observer];
  1298. observer = nil;
  1299. }
  1300.  
  1301. // [self.timer invalidate];
  1302. }else{
  1303.  
  1304. // [btn setTitle:@"Pause" forState:UIControlStateNormal];
  1305.  
  1306. observer = [player addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(1/ 60.0, NSEC_PER_SEC)
  1307. queue:NULL
  1308. usingBlock:^(CMTime time){
  1309. [self updateSlider];
  1310. }];
  1311. [player play];
  1312. // self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateSlider) userInfo:nil repeats:YES];
  1313. }
  1314. }
  1315.  
  1316. -(void)updateTotalTime:(double)totalTime{
  1317. videoTotalTime = totalTime;
  1318. }
  1319.  
  1320. - (void)itemDidFinishPlaying:(NSNotification *)notification {
  1321. [player seekToTime:kCMTimeZero];
  1322. player.rate = 0 ;
  1323. // [playPause setTitle:@"Play" forState:UIControlStateNormal];
  1324. }
  1325.  
  1326. - (void)updateSlider {
  1327.  
  1328. double time = CMTimeGetSeconds([player currentTime]);
  1329. // NSDateComponentsFormatter *dateComponentsFormatter = [[NSDateComponentsFormatter alloc] init];
  1330. // dateComponentsFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad;
  1331. // dateComponentsFormatter.allowedUnits = (NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond);
  1332. _toast.text =[self timeFormatted:(int)time];
  1333.  
  1334. // CGRect trackRect = [self->slider trackRectForBounds:self->slider.bounds];
  1335. // CGRect thumbRect = [self->slider thumbRectForBounds:self->slider.bounds
  1336. // trackRect:trackRect
  1337. // value:self->slider.value];
  1338. //NSLog(@"x--- %f y--- %f",thumbRect.origin.x,thumbRect.origin.y);
  1339.  
  1340. double x = ((_frameGenerateView.frame.size.width)/videoTotalTime)* time;
  1341. double seekbarAtXPosition = (_frameGenerateView.frame.size.width/videoTotalTime)*(time);
  1342. //NSLog(@"x--- %f y--- %f",x,thumbRect.origin.y);
  1343. // _scrollView.contentOffset= CGPointMake( x,thumbRect.origin.y + 2);
  1344. //NSLog(@"start %f end %f x %f",st.origin.x-10,x);
  1345. [_seekBar setCenter:CGPointMake( seekbarAtXPosition+xPosForExtraTime ,_seekBar.center.y)];
  1346. // [_toast setCenter:CGPointMake( seekbarAtXPosition +xPosForExtraTime,_toast.center.y)];
  1347.  
  1348. // NSLog(@"cur %f",slider.value);
  1349. // NSLog(@"min %f max %f time %f dur %f",minValue,maxValue,time,duration);
  1350. CGRect endBoundVal = endBound.frame;
  1351.  
  1352. if(x+xPosForExtraTime >endBoundVal.origin.x){
  1353. CGRect starBoundVal = startBound.frame;
  1354. //[self PlayerSetPlayPause:playPause withPlayingStatus:1];
  1355. // _toast.text = @"";
  1356. [_seekBar setCenter:CGPointMake( starBoundVal.origin.x+ (starBoundVal.size.width) ,_seekBar.center.y)];
  1357. // [_toast setCenter:CGPointMake( seekbarAtXPosition +xPosForExtraTime,_toast.center.y)];
  1358. [player seekToTime:CMTimeMakeWithSeconds((videoTotalTime/(_frameGenerateView.frame.size.width))*(starBoundVal.origin.x+starBoundVal.size.width-xPosForExtraTime), NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
  1359.  
  1360. }
  1361.  
  1362. if( _seekBar.frame.origin.x < startBound.frame.origin.x){
  1363. CGRect starBoundVal = startBound.frame;
  1364. [_seekBar setCenter:CGPointMake( starBoundVal.origin.x+ (starBoundVal.size.width) ,_seekBar.center.y)];
  1365. // [_toast setCenter:CGPointMake( seekbarAtXPosition +xPosForExtraTime,_toast.center.y)];
  1366. [player seekToTime:CMTimeMakeWithSeconds((videoTotalTime/(_frameGenerateView.frame.size.width))*(starBoundVal.origin.x+starBoundVal.size.width-xPosForExtraTime), NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
  1367.  
  1368. }
  1369.  
  1370.  
  1371.  
  1372.  
  1373. }
  1374. #pragma mark -back
  1375. - (IBAction)backButtonPressed:(id)sender {
  1376. player = nil;
  1377. playerItem = nil;
  1378.  
  1379. // [self dismissViewControllerAnimated:YES completion:nil];
  1380. [self.navigationController popViewControllerAnimated:YES];
  1381. // [self presentViewController:cameraWindow animated:YES completion:nil];
  1382. }
  1383.  
  1384. - (IBAction)updateScrollSlider:(id)sender {
  1385. NSLog(@"scroll value %f",[sliderScroll value]);
  1386.  
  1387.  
  1388. CGRect trackRec = [self->sliderScroll trackRectForBounds: CGRectMake(0, 0, _scrollView.contentSize.width-SCREEN_WIDTH, 100) ];
  1389. CGRect thumbRec = [self->sliderScroll thumbRectForBounds:CGRectMake(0, 0,_scrollView.contentSize.width-SCREEN_WIDTH, 100)
  1390. trackRect:trackRec
  1391. value:self->sliderScroll.value];
  1392. _scrollView.contentOffset= CGPointMake( thumbRec.origin.x
  1393. ,_scrollView.contentOffset.y);
  1394.  
  1395.  
  1396. }
  1397. - (IBAction)scrollSliderEnd:(id)sender {
  1398. CGRect starBoundVal = startBound.frame;
  1399. [_seekBar setCenter:CGPointMake( starBoundVal.origin.x+23 ,_seekBar.center.y)];
  1400. _toast.text = @"";
  1401. [_toast setCenter:CGPointMake( _seekBar.frame.origin.x+15 ,_toast.center.y)];
  1402. [player seekToTime:CMTimeMakeWithSeconds((videoTotalTime/(_scrollView.contentSize.width))*(starBoundVal.origin.x+20+_scrollView.contentOffset.x), NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
  1403. }
  1404. - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
  1405. NSLog(@"touch hoise");
  1406. }
  1407. - (IBAction)crossButtonPress:(id)sender {
  1408. NSLog(@"cross button pressed");
  1409. [self PlayerSetPlayPause:playPause withPlayingStatus:1];
  1410. [[self navigationController] popViewControllerAnimated:YES];
  1411. [self.navigationController dismissViewControllerAnimated:YES completion:nil];
  1412. }
  1413.  
  1414.  
  1415.  
  1416.  
  1417. - (NSString *)timeFormatted:(int)totalSeconds
  1418. {
  1419.  
  1420. int seconds = totalSeconds % 60;
  1421. int minutes = (totalSeconds / 60) % 60;
  1422. int hours = totalSeconds / 3600;
  1423. NSString *totalTime;
  1424. if(hours < 1 ){
  1425. totalTime = [NSString stringWithFormat:@"%02d:%02d", minutes, seconds];
  1426. }else {
  1427. totalTime = [NSString stringWithFormat:@"%02d:%02d:%02d",hours, minutes, seconds];
  1428. }
  1429.  
  1430.  
  1431. return totalTime;
  1432. }
  1433. @end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement