TCVideoCutViewController.m 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  1. //
  2. // TCVideoEditViewController.m
  3. // TCLVBIMDemo
  4. //
  5. // Created by xiang zhang on 2017/4/10.
  6. // Copyright © 2017年 tencent. All rights reserved.
  7. //
  8. #import "TCVideoCutViewController.h"
  9. #import "TCVideoEditViewController.h"
  10. #import <MediaPlayer/MPMediaPickerController.h>
  11. #import <AVFoundation/AVFoundation.h>
  12. #import "VideoRangeSlider.h"
  13. #import "VideoRangeConst.h"
  14. #import "UIView+Additions.h"
  15. #import "UIColor+MLPFlatColors.h"
  16. #import <MBProgressHUD/MBProgressHUD.h>
  17. #import "VideoPreview.h"
  18. #import "VideoCutView.h"
  19. #import "SDKHeader.h"
  20. #import "PhotoTransitionToolbar.h"
  21. #import "SmallButton.h"
  22. typedef NS_ENUM(NSInteger,VideoType)
  23. {
  24. VideoType_Video,
  25. VideoType_Picture,
  26. };
  27. @interface TCVideoCutViewController ()<TXVideoGenerateListener,VideoPreviewDelegate, VideoCutViewDelegate,TransitionViewDelegate>
  28. @property(nonatomic,strong) TXVideoEditer *ugcEdit;
  29. @property(nonatomic,strong) VideoPreview *videoPreview;
  30. @property CGFloat duration;
  31. @end
  32. @implementation TCVideoCutViewController
  33. {
  34. NSMutableArray *_cutPathList;
  35. NSString *_videoOutputPath;
  36. UIProgressView* _playProgressView;
  37. UILabel* _startTimeLabel;
  38. UILabel* _endTimeLabel;
  39. CGFloat _leftTime;
  40. CGFloat _rightTime;
  41. UILabel* _generationTitleLabel;
  42. UIView* _generationView;
  43. UIProgressView* _generateProgressView;
  44. UIButton* _generateCannelBtn;
  45. UIColor *_barTintColor;
  46. NSString* _filePath;
  47. unsigned long long _fileSize;
  48. BOOL _navigationBarHidden;
  49. BOOL _hasQuickGenerate;
  50. BOOL _hasNomalGenerate;
  51. VideoCutView* _videoCutView;
  52. PhotoTransitionToolbar* _photoTransitionToolbar;
  53. RangeContentConfig *_config;
  54. VideoType _videoType;
  55. int _renderRotation;
  56. CGFloat bottomToolbarHeight;
  57. CGFloat bottomInset;
  58. }
  59. -(instancetype)init
  60. {
  61. self = [super init];
  62. if (self) {
  63. _cutPathList = [NSMutableArray array];
  64. _videoOutputPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"outputCut.mp4"];
  65. _config = [[RangeContentConfig alloc] init];
  66. _config.pinWidth = PIN_WIDTH;
  67. _config.thumbHeight = 50;
  68. _config.borderHeight = BORDER_HEIGHT;
  69. _config.imageCount = 15;
  70. }
  71. return self;
  72. }
  73. - (void)viewWillAppear:(BOOL)animated
  74. {
  75. [super viewWillAppear:animated];
  76. _barTintColor = self.navigationController.navigationBar.barTintColor;
  77. self.navigationController.navigationBar.barTintColor = UIColorFromRGB(0x181818);
  78. self.navigationController.navigationBar.translucent = NO;
  79. _navigationBarHidden = self.navigationController.navigationBar.hidden;
  80. self.navigationController.navigationBar.hidden = YES;
  81. [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
  82. [[UIApplication sharedApplication]setStatusBarHidden:YES];
  83. if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]){
  84. self.navigationController.interactivePopGestureRecognizer.enabled = NO;
  85. }
  86. }
  87. - (void)viewWillDisappear:(BOOL)animated
  88. {
  89. [super viewWillDisappear:animated];
  90. self.navigationController.navigationBar.barTintColor = _barTintColor;
  91. self.navigationController.navigationBar.translucent = YES;
  92. self.navigationController.navigationBar.hidden = _navigationBarHidden;
  93. [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
  94. [[UIApplication sharedApplication]setStatusBarHidden:NO];
  95. }
  96. - (void)viewDidDisappear:(BOOL)animated
  97. {
  98. [super viewDidDisappear:animated];
  99. }
  100. - (void)viewDidAppear:(BOOL)animated
  101. {
  102. [super viewDidAppear:animated];
  103. [_videoPreview playVideo];
  104. }
  105. - (void)dealloc
  106. {
  107. [_videoPreview removeNotification];
  108. _videoPreview = nil;
  109. }
  110. - (void)viewDidLoad {
  111. [super viewDidLoad];
  112. bottomToolbarHeight = 52;
  113. bottomInset = 10;
  114. _videoPreview = [[VideoPreview alloc] initWithFrame:CGRectMake(0, 0, self.view.width, self.view.height) coverImage:nil];
  115. _videoPreview.delegate = self;
  116. [self.view addSubview:_videoPreview];
  117. if (@available(iOS 11, *)) {
  118. bottomInset += [UIApplication sharedApplication].keyWindow.safeAreaInsets.bottom;
  119. }
  120. if (kScaleY < 1) {
  121. bottomToolbarHeight = round(bottomToolbarHeight * kScaleY);
  122. }
  123. UILabel *barTitleLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0 , 100, 44)];
  124. barTitleLabel.backgroundColor = [UIColor clearColor];
  125. barTitleLabel.font = [UIFont boldSystemFontOfSize:17];
  126. barTitleLabel.textColor = [UIColor whiteColor];
  127. barTitleLabel.textAlignment = NSTextAlignmentCenter;
  128. barTitleLabel.text = NSLocalizedString(@"TCVideoCutView.VideoEdit", nil);
  129. self.navigationItem.titleView = barTitleLabel;
  130. self.view.backgroundColor = UIColor.blackColor;
  131. UIButton *goBackButton = [UIButton buttonWithType:UIButtonTypeCustom];
  132. [goBackButton setImage:[UIImage imageNamed:@"back"] forState:UIControlStateNormal];
  133. [goBackButton addTarget:self action:@selector(onBtnPopClicked) forControlEvents:UIControlEventTouchUpInside];
  134. goBackButton.frame = CGRectMake(15 * kScaleX, 20 * kScaleY, 14 , 23);
  135. [self.view addSubview:goBackButton];
  136. CGFloat btnNextWidth = 70;
  137. CGFloat btnNextHeight = 30;
  138. UIButton *btnNext = [UIButton buttonWithType:UIButtonTypeCustom];
  139. btnNext.bounds = CGRectMake(0, 0, btnNextWidth, btnNextHeight);
  140. btnNext.center = CGPointMake(self.view.right - 15 * kScaleX - btnNextWidth / 2, 20 + btnNextHeight / 2);
  141. [btnNext setTitle:NSLocalizedString(@"Common.Next", nil) forState:UIControlStateNormal];
  142. btnNext.titleLabel.font = [UIFont systemFontOfSize:14];
  143. [btnNext setBackgroundImage:[UIImage imageNamed:@"next_normal"] forState:UIControlStateNormal];
  144. [btnNext setBackgroundImage:[UIImage imageNamed:@"next_press"] forState:UIControlStateHighlighted];
  145. [btnNext addTarget:self action:@selector(onBtnNextClicked) forControlEvents:UIControlEventTouchUpInside];
  146. [self.view addSubview:btnNext];
  147. _playProgressView = [[UIProgressView alloc] initWithFrame:CGRectMake(0, _videoPreview.bottom, self.view.width, 6)];
  148. _playProgressView.trackTintColor = UIColorFromRGB(0xd8d8d8);
  149. _playProgressView.progressTintColor = UIColorFromRGB(0x0accac);
  150. _playProgressView.hidden = YES;
  151. [self.view addSubview:_playProgressView];
  152. _startTimeLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, _playProgressView.bottom + 10 * kScaleY, 50, 12)];
  153. _startTimeLabel.text = @"0:00";
  154. _startTimeLabel.textAlignment = NSTextAlignmentLeft;
  155. _startTimeLabel.font = [UIFont systemFontOfSize:12];
  156. _startTimeLabel.textColor = UIColor.lightTextColor;
  157. _startTimeLabel.hidden = YES;
  158. [self.view addSubview:_startTimeLabel];
  159. _endTimeLabel = [[UILabel alloc] initWithFrame:CGRectMake(self.view.width - 15 - 50, _playProgressView.bottom + 10, 50, 12)];
  160. _endTimeLabel.text = @"0:00";
  161. _endTimeLabel.textAlignment = NSTextAlignmentRight;
  162. _endTimeLabel.font = [UIFont systemFontOfSize:12];
  163. _endTimeLabel.textColor = UIColor.lightTextColor;
  164. _endTimeLabel.hidden = YES;
  165. [self.view addSubview:_endTimeLabel];
  166. // CGFloat heightDist = 52 * kScaleY;
  167. // _videoCutView = [[VideoCutView alloc] initWithFrame:CGRectMake(0, self.view.height - heightDist - 20 * kScaleY, self.view.width,heightDist) videoPath:_videoPath videoAssert:_videoAsset config:config];
  168. // _videoCutView.delegate = self;
  169. // [self.view addSubview:_videoCutView];
  170. TXPreviewParam *param = [[TXPreviewParam alloc] init];
  171. param.videoView = _videoPreview.renderView;
  172. param.renderMode = PREVIEW_RENDER_MODE_FILL_EDGE;
  173. _ugcEdit = [[TXVideoEditer alloc] initWithPreview:param];
  174. _ugcEdit.generateDelegate = self;
  175. _ugcEdit.previewDelegate = _videoPreview;
  176. CGPoint rotateButtonCenter = CGPointZero;
  177. //video
  178. if (_videoAsset != nil) {
  179. _videoType = VideoType_Video;
  180. [_ugcEdit setVideoAsset:_videoAsset];
  181. [self initVideoCutView];
  182. TXVideoInfo *videoMsg = [TXVideoInfoReader getVideoInfoWithAsset:_videoAsset];
  183. _fileSize = videoMsg.fileSize;
  184. _duration = videoMsg.duration;
  185. _rightTime = _duration;
  186. _endTimeLabel.text = [NSString stringWithFormat:@"%d:%02d", (int)_duration / 60, (int)_duration % 60];
  187. _renderRotation = videoMsg.angle;
  188. rotateButtonCenter = CGPointMake(_videoCutView.right - 20, _videoCutView.top - 20);
  189. }
  190. //image
  191. if (_imageList != nil) {
  192. _videoType = VideoType_Picture;
  193. _photoTransitionToolbar = [[PhotoTransitionToolbar alloc] initWithFrame:CGRectMake(0, self.view.height - bottomInset - bottomToolbarHeight, self.view.width, bottomToolbarHeight)];
  194. _photoTransitionToolbar.delegate = self;
  195. [self.view addSubview:_photoTransitionToolbar];
  196. _photoTransitionToolbar.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
  197. [_ugcEdit setPictureList:_imageList fps:30];
  198. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  199. [self onVideoTransitionLefRightSlipping];
  200. });
  201. rotateButtonCenter = CGPointMake(_photoTransitionToolbar.right - 20 - bottomToolbarHeight, _photoTransitionToolbar.top - bottomToolbarHeight - 10 - 20);
  202. }
  203. if (_videoType == VideoType_Video) {
  204. // rotation button
  205. UIButton *rotateButton = [SmallButton buttonWithType:UIButtonTypeCustom];
  206. [rotateButton setImage:[UIImage imageNamed:@"icon_rotate_video_view"] forState:UIControlStateNormal];
  207. [rotateButton sizeToFit];
  208. rotateButton.center = rotateButtonCenter;
  209. [rotateButton addTarget:self action:@selector(onRotatePreview:) forControlEvents:UIControlEventTouchUpInside];
  210. [self.view addSubview:rotateButton];
  211. }
  212. }
  213. - (UIView*)generatingView
  214. {
  215. /*用作生成时的提示浮层*/
  216. if (!_generationView) {
  217. _generationView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.width, self.view.height + 64)];
  218. _generationView.backgroundColor = UIColor.blackColor;
  219. _generationView.alpha = 0.9f;
  220. _generateProgressView = [UIProgressView new];
  221. _generateProgressView.center = CGPointMake(_generationView.width / 2, _generationView.height / 2);
  222. _generateProgressView.bounds = CGRectMake(0, 0, 225, 20);
  223. _generateProgressView.progressTintColor = RGB(238, 100, 85);
  224. [_generateProgressView setTrackImage:[UIImage imageNamed:@"slide_bar_small"]];
  225. //_generateProgressView.trackTintColor = UIColor.whiteColor;
  226. //_generateProgressView.transform = CGAffineTransformMakeScale(1.0, 2.0);
  227. _generationTitleLabel = [UILabel new];
  228. _generationTitleLabel.font = [UIFont systemFontOfSize:14];
  229. _generationTitleLabel.text = NSLocalizedString(@"TCVideoCutView.VideoGenerating", nil);
  230. _generationTitleLabel.textColor = UIColor.whiteColor;
  231. _generationTitleLabel.textAlignment = NSTextAlignmentCenter;
  232. _generationTitleLabel.frame = CGRectMake(0, _generateProgressView.y - 34, _generationView.width, 14);
  233. _generateCannelBtn = [UIButton new];
  234. [_generateCannelBtn setImage:[UIImage imageNamed:@"cancel"] forState:UIControlStateNormal];
  235. _generateCannelBtn.frame = CGRectMake(_generateProgressView.right + 15, _generationTitleLabel.bottom + 10, 20, 20);
  236. [_generateCannelBtn addTarget:self action:@selector(onCancelBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
  237. [_generationView addSubview:_generationTitleLabel];
  238. [_generationView addSubview:_generateProgressView];
  239. [_generationView addSubview:_generateCannelBtn];
  240. }
  241. _generateProgressView.progress = 0.f;
  242. [[[UIApplication sharedApplication] delegate].window addSubview:_generationView];
  243. return _generationView;
  244. }
  245. - (void)initVideoCutView
  246. {
  247. if (_videoType == VideoType_Video) {
  248. CGRect frame = CGRectMake(0, self.view.height - bottomToolbarHeight - bottomInset, self.view.width,bottomToolbarHeight);
  249. if(_videoCutView) [_videoCutView removeFromSuperview];
  250. _videoCutView = [[VideoCutView alloc] initWithFrame:frame videoPath:nil videoAsset:_videoAsset config:_config];
  251. [self.view addSubview:_videoCutView];
  252. }else{
  253. CGRect frame = CGRectMake(0, self.view.height - bottomToolbarHeight - bottomInset - 10 - bottomToolbarHeight, self.view.width,bottomToolbarHeight);
  254. if (_videoCutView) {
  255. [_videoCutView updateFrame:_duration];
  256. }else{
  257. [_videoCutView removeFromSuperview];
  258. _videoCutView = [[VideoCutView alloc] initWithFrame:frame pictureList:_imageList duration:_duration fps:30 config:_config];
  259. [self.view addSubview:_videoCutView];
  260. }
  261. }
  262. _videoCutView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
  263. _videoCutView.delegate = self;
  264. [_videoCutView setCenterPanHidden:YES];
  265. }
  266. - (void)pause
  267. {
  268. [_ugcEdit pausePlay];
  269. [_videoPreview setPlayBtn:NO];
  270. }
  271. #pragma makr - Actions
  272. - (void)onRotatePreview:(id)sender
  273. {
  274. _renderRotation += 90;
  275. [_ugcEdit setRenderRotation:_renderRotation];
  276. }
  277. - (void)onBtnPopClicked
  278. {
  279. [self pause];
  280. [self dismissViewControllerAnimated:YES completion:^{
  281. //to do
  282. }];
  283. }
  284. -(void)onBtnNextClicked
  285. {
  286. [self pause];
  287. [_videoPreview setPlayBtn:NO];
  288. if (_videoType == VideoType_Video) {
  289. TXVideoInfo *videoInfo = [TXVideoInfoReader getVideoInfoWithAsset:_videoAsset];
  290. BOOL largerThan1080p = videoInfo.width * videoInfo.height > 1920*1080;
  291. BOOL hasBeenRotated = _renderRotation % 360 != 0;
  292. if (_leftTime == 0 && _rightTime == _duration && !largerThan1080p && !hasBeenRotated) {
  293. //视频如果没发生剪裁,也没有旋转,这里不用走编辑逻辑,减少画面质量损失
  294. TCVideoEditViewController *vc = [[TCVideoEditViewController alloc] init];
  295. vc.renderRotation = _renderRotation;
  296. vc.videoAsset = _videoAsset;
  297. vc.isFromCut = YES;
  298. [self.navigationController pushViewController:vc animated:YES];
  299. //销毁掉编辑器,减少内存占用
  300. _ugcEdit = nil;
  301. }else{
  302. _generationView = [self generatingView];
  303. _generationView.hidden = NO;
  304. [_ugcEdit setCutFromTime:_leftTime toTime:_rightTime];
  305. if (largerThan1080p || _renderRotation % 360 != 0) {
  306. [_ugcEdit generateVideo:VIDEO_COMPRESSED_720P videoOutputPath:_videoOutputPath];
  307. } else {
  308. //使用快速剪切,速度快
  309. _hasQuickGenerate = YES;
  310. [_ugcEdit quickGenerateVideo:VIDEO_COMPRESSED_720P videoOutputPath:_videoOutputPath];
  311. }
  312. }
  313. }else{
  314. //图片编辑只能走正常生成逻辑,这里使用高码率,保留更多图片细节
  315. _generationView = [self generatingView];
  316. _generationView.hidden = NO;
  317. _hasNomalGenerate = YES;
  318. [_ugcEdit setVideoBitrate:10000];
  319. [_ugcEdit setCutFromTime:_leftTime toTime:_rightTime];
  320. [_ugcEdit quickGenerateVideo:VIDEO_COMPRESSED_720P videoOutputPath:_videoOutputPath];
  321. }
  322. }
  323. - (void)onCancelBtnClicked:(UIButton*)sender
  324. {
  325. _generationView.hidden = YES;
  326. [_ugcEdit cancelGenerate];
  327. }
  328. #pragma mark TransitionViewDelegate
  329. - (void)_onVideoTransition:(TXTransitionType)type {
  330. __weak __typeof(self) weakSelf = self;
  331. [_ugcEdit setPictureTransition:type duration:^(CGFloat duration) {
  332. _duration = duration;
  333. _rightTime = duration;
  334. [weakSelf initVideoCutView];
  335. [weakSelf.ugcEdit startPlayFromTime:0 toTime:weakSelf.duration];
  336. [weakSelf.videoPreview setPlayBtn:YES];
  337. }];
  338. }
  339. - (void)onVideoTransitionLefRightSlipping
  340. {
  341. [self _onVideoTransition:TXTransitionType_LefRightSlipping];
  342. }
  343. - (void)onVideoTransitionUpDownSlipping
  344. {
  345. [self _onVideoTransition:TXTransitionType_UpDownSlipping];
  346. }
  347. - (void)onVideoTransitionEnlarge
  348. {
  349. [self _onVideoTransition:TXTransitionType_Enlarge];
  350. }
  351. - (void)onVideoTransitionNarrow
  352. {
  353. [self _onVideoTransition:TXTransitionType_Narrow];
  354. }
  355. - (void)onVideoTransitionRotationalScaling
  356. {
  357. [self _onVideoTransition:TXTransitionType_RotationalScaling];
  358. }
  359. - (void)onVideoTransitionFadeinFadeout
  360. {
  361. [self _onVideoTransition:TXTransitionType_FadeinFadeout];
  362. }
  363. #pragma mark TXVideoGenerateListener
  364. -(void) onGenerateProgress:(float)progress
  365. {
  366. _generateProgressView.progress = progress;
  367. }
  368. -(void) onGenerateComplete:(TXGenerateResult *)result
  369. {
  370. _generationView.hidden = YES;
  371. if (result.retCode == 0) {
  372. if (_videoType == VideoType_Picture) {
  373. NSFileManager *fm = [[NSFileManager alloc] init];
  374. NSString *rename = [_videoOutputPath stringByAppendingString:@"-tmp.mp4"];
  375. [fm removeItemAtPath:rename error:nil];
  376. [fm moveItemAtPath:_videoOutputPath toPath:rename error:nil];
  377. TCVideoCutViewController *vc = [[TCVideoCutViewController alloc]init];
  378. vc.videoAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:rename]];
  379. [self.navigationController pushViewController:vc animated:YES];
  380. } else {
  381. TCVideoEditViewController *vc = [[TCVideoEditViewController alloc] init];
  382. vc.videoPath = _videoOutputPath;
  383. vc.isFromCut = YES;
  384. [self.navigationController pushViewController:vc animated:YES];
  385. //销毁掉编辑器,减少内存占用
  386. _ugcEdit = nil;
  387. }
  388. }else{
  389. //系统剪切如果失败,这里使用SDK正常剪切,设置高码率,保留图像更多的细节
  390. if (_hasQuickGenerate && !_hasNomalGenerate) {
  391. _generationView = [self generatingView];
  392. _generationView.hidden = NO;
  393. [_ugcEdit cancelGenerate];
  394. [_ugcEdit setVideoBitrate:10000];
  395. [_ugcEdit setCutFromTime:_leftTime toTime:_rightTime];
  396. [_ugcEdit generateVideo:VIDEO_COMPRESSED_720P videoOutputPath:_videoOutputPath];
  397. _hasNomalGenerate = YES;
  398. }else{
  399. UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"TCVideoCutView.HintVideoGeneratingFailed", nil)
  400. message:[NSString stringWithFormat:NSLocalizedString(@"Common.HintErrorCodeMessage", nil),(long)result.retCode,result.descMsg]
  401. delegate:self
  402. cancelButtonTitle:NSLocalizedString(@"Common.GotIt", nil)
  403. otherButtonTitles:nil, nil];
  404. [alertView show];
  405. }
  406. }
  407. if (_videoType == VideoType_Video) {
  408. [TCUtil report:xiaoshipin_videoedit userName:nil code:result.retCode msg:result.descMsg];
  409. }else{
  410. [TCUtil report:xiaoshipin_pictureedit userName:nil code:result.retCode msg:result.descMsg];
  411. }
  412. }
  413. #pragma mark VideoPreviewDelegate
  414. - (void)onVideoPlay
  415. {
  416. CGFloat currentPos = _videoCutView.videoRangeSlider.currentPos;
  417. if (currentPos < _leftTime || currentPos > _rightTime)
  418. currentPos = _leftTime;
  419. [_ugcEdit startPlayFromTime:currentPos toTime:_videoCutView.videoRangeSlider.rightPos];
  420. }
  421. - (void)onVideoPause
  422. {
  423. [_ugcEdit pausePlay];
  424. }
  425. - (void)onVideoResume
  426. {
  427. [self onVideoPlay];
  428. }
  429. - (void)onVideoPlayProgress:(CGFloat)time
  430. {
  431. _playProgressView.progress = (time - _leftTime) / (_rightTime - _leftTime);
  432. [_videoCutView setPlayTime:time];
  433. }
  434. - (void)onVideoPlayFinished
  435. {
  436. [_ugcEdit startPlayFromTime:_leftTime toTime:_rightTime];
  437. }
  438. - (void)onVideoEnterBackground
  439. {
  440. if (_generationView && !_generationView.hidden) {
  441. [_ugcEdit pauseGenerate];
  442. }else{
  443. [MBProgressHUD hideHUDForView:self.view animated:YES];
  444. [_ugcEdit pausePlay];
  445. [_videoPreview setPlayBtn:NO];
  446. }
  447. }
  448. - (void)onVideoWillEnterForeground
  449. {
  450. if (_generationView && !_generationView.hidden) {
  451. [_ugcEdit resumeGenerate];
  452. }
  453. }
  454. #pragma mark - VideoCutViewDelegate
  455. - (void)onVideoRangeLeftChanged:(VideoRangeSlider *)sender
  456. {
  457. //[_ugcEdit pausePlay];
  458. [_videoPreview setPlayBtn:NO];
  459. [_ugcEdit previewAtTime:sender.leftPos];
  460. }
  461. - (void)onVideoRangeRightChanged:(VideoRangeSlider *)sender
  462. {
  463. [_videoPreview setPlayBtn:NO];
  464. [_ugcEdit previewAtTime:sender.rightPos];
  465. }
  466. - (void)onVideoRangeLeftChangeEnded:(VideoRangeSlider *)sender
  467. {
  468. _leftTime = sender.leftPos;
  469. _rightTime = sender.rightPos;
  470. _startTimeLabel.text = [NSString stringWithFormat:@"%d:%02d", (int)sender.leftPos / 60, (int)sender.leftPos % 60];
  471. _endTimeLabel.text = [NSString stringWithFormat:@"%d:%02d", (int)sender.rightPos / 60, (int)sender.rightPos % 60];
  472. [_ugcEdit startPlayFromTime:sender.leftPos toTime:sender.rightPos];
  473. [_videoPreview setPlayBtn:YES];
  474. }
  475. - (void)onVideoRangeRightChangeEnded:(VideoRangeSlider *)sender
  476. {
  477. _leftTime = sender.leftPos;
  478. _rightTime = sender.rightPos;
  479. _startTimeLabel.text = [NSString stringWithFormat:@"%d:%02d", (int)sender.leftPos / 60, (int)sender.leftPos % 60];
  480. _endTimeLabel.text = [NSString stringWithFormat:@"%d:%02d", (int)sender.rightPos / 60, (int)sender.rightPos % 60];
  481. [_ugcEdit startPlayFromTime:sender.leftPos toTime:sender.rightPos];
  482. [_videoPreview setPlayBtn:YES];
  483. }
  484. - (void)onVideoSeekChange:(VideoRangeSlider *)sender seekToPos:(CGFloat)pos
  485. {
  486. [_ugcEdit previewAtTime:pos];
  487. [_videoPreview setPlayBtn:NO];
  488. _playProgressView.progress = (pos - _leftTime) / (_rightTime - _leftTime);
  489. }
  490. @end