YBPicTransitionVC.m 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. //
  2. // YBPicTransitionVC.m
  3. // YBVideo
  4. //
  5. // Created by YB007 on 2019/11/26.
  6. // Copyright © 2019 cat. All rights reserved.
  7. //
  8. #import "YBPicTransitionVC.h"
  9. #import <TXLiteAVSDK_Professional/TXVideoEditer.h>
  10. #import "TCVideoPreview.h"
  11. #import "PhotoTransitionToolbar.h"
  12. #import "YBProgressObj.h"
  13. #import "TCVideoEditViewController.h"
  14. @interface YBPicTransitionVC ()<TXVideoGenerateListener,TCVideoPreviewDelegate,TransitionViewDelegate>
  15. @property(nonatomic,strong) TXVideoEditer *ugcEdit;
  16. @property(nonatomic,strong) TCVideoPreview *videoPreview;
  17. @property(nonatomic,strong) PhotoTransitionToolbar *photoTransitionToolbar;
  18. @property(nonatomic,strong)UIButton *nextBtn;
  19. @property CGFloat duration;
  20. @end
  21. @implementation YBPicTransitionVC {
  22. NSString *_videoOutputPath;
  23. CGFloat _leftTime;
  24. CGFloat _rightTime;
  25. CGFloat bottomToolbarHeight;
  26. CGFloat bottomInset;
  27. }
  28. -(void)viewWillAppear:(BOOL)animated {
  29. [super viewWillAppear:animated];
  30. [UIApplication sharedApplication].statusBarHidden = NO;
  31. }
  32. - (void)viewWillDisappear:(BOOL)animated {
  33. [super viewWillDisappear:animated];
  34. [UIApplication sharedApplication].statusBarHidden = YES;
  35. }
  36. - (void)viewDidAppear:(BOOL)animated {
  37. [super viewDidAppear:animated];
  38. [_videoPreview setPlayBtn:NO];
  39. [_videoPreview playVideo];
  40. }
  41. - (void)dealloc {
  42. [_videoPreview removeNotification];
  43. _videoPreview = nil;
  44. }
  45. - (void)viewDidLoad {
  46. [super viewDidLoad];
  47. self.navigationController.interactivePopGestureRecognizer.enabled = NO;
  48. self.navigationController.interactivePopGestureRecognizer.delegate =nil;
  49. self.subNavi.backgroundColor = UIColor.clearColor;
  50. _videoOutputPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"ybPicTransition.mp4"];
  51. _leftTime = 0;
  52. bottomToolbarHeight = 52;
  53. bottomInset = 10;
  54. [self.view addSubview:self.videoPreview];
  55. [self setmaskView];
  56. [self.view addSubview:self.photoTransitionToolbar];
  57. [self.view addSubview:self.nextBtn];
  58. [_nextBtn mas_makeConstraints:^(MASConstraintMaker *make) {
  59. make.centerY.equalTo(_photoTransitionToolbar);
  60. make.width.equalTo(@(65));
  61. make.height.equalTo(@30);
  62. make.right.equalTo(self.view.mas_right).offset(-10);
  63. }];
  64. TXPreviewParam *param = [[TXPreviewParam alloc] init];
  65. param.videoView = _videoPreview.renderView;
  66. param.renderMode = PREVIEW_RENDER_MODE_FILL_EDGE;
  67. _ugcEdit = [[TXVideoEditer alloc] initWithPreview:param];
  68. _ugcEdit.generateDelegate = self;
  69. _ugcEdit.previewDelegate = _videoPreview;
  70. int listFps = 30;
  71. if (_imageList.count>7) {
  72. listFps = 23;
  73. }else if (_imageList.count>5){
  74. listFps = 25;
  75. }
  76. [_ugcEdit setPictureList:_imageList fps:listFps];
  77. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  78. [self onVideoTransitionLefRightSlipping];
  79. });
  80. [self.view bringSubviewToFront:self.naviView];
  81. }
  82. - (void)clickNaviLeftBtn {
  83. YBWeakSelf;
  84. NSDictionary *contentDic = @{@"title":YZMsg(@"提示"),@"msg":YZMsg(@"是否退出视频编辑"),@"left":YZMsg(@"取消"),@"right":YZMsg(@"确定")};
  85. [YBAlertView showAlertView:contentDic complete:^(int eventType) {
  86. if (eventType == 1) {
  87. [weakSelf pause];
  88. [weakSelf dismissViewControllerAnimated:YES completion:nil];
  89. [weakSelf.navigationController popViewControllerAnimated:YES];
  90. }
  91. }];
  92. }
  93. - (void)pause {
  94. [_ugcEdit pausePlay];
  95. [_videoPreview setPlayBtn:NO];
  96. }
  97. #pragma mark TransitionViewDelegate
  98. - (void)_onVideoTransition:(TXTransitionType)type {
  99. __weak __typeof(self) weakSelf = self;
  100. [_ugcEdit setPictureTransition:type duration:^(CGFloat duration) {
  101. _duration = duration;
  102. _rightTime = duration;
  103. [weakSelf.ugcEdit startPlayFromTime:0 toTime:weakSelf.duration];
  104. [weakSelf.videoPreview setPlayBtn:YES];
  105. }];
  106. }
  107. - (void)onVideoTransitionLefRightSlipping {
  108. [self _onVideoTransition:TXTransitionType_LefRightSlipping];
  109. }
  110. - (void)onVideoTransitionUpDownSlipping {
  111. [self _onVideoTransition:TXTransitionType_UpDownSlipping];
  112. }
  113. - (void)onVideoTransitionEnlarge {
  114. [self _onVideoTransition:TXTransitionType_Enlarge];
  115. }
  116. - (void)onVideoTransitionNarrow {
  117. [self _onVideoTransition:TXTransitionType_Narrow];
  118. }
  119. - (void)onVideoTransitionRotationalScaling {
  120. [self _onVideoTransition:TXTransitionType_RotationalScaling];
  121. }
  122. - (void)onVideoTransitionFadeinFadeout {
  123. [self _onVideoTransition:TXTransitionType_FadeinFadeout];
  124. }
  125. #pragma mark TXVideoGenerateListener
  126. -(void) onGenerateProgress:(float)progress {
  127. [YBProgressObj progressManeger].generationHidden = NO;
  128. [YBProgressObj progressManeger].generationProgress = progress;
  129. }
  130. -(void)destoryProgressView {
  131. [YBProgressObj progressManeger].generationHidden = YES;
  132. [[YBProgressObj progressManeger] progressDestroy];
  133. }
  134. -(void) onGenerateComplete:(TXGenerateResult *)result {
  135. [self destoryProgressView];
  136. if (result.retCode == 0) {
  137. TCVideoEditViewController *vc = [[TCVideoEditViewController alloc] init];
  138. [vc setVideoPath:_videoOutputPath];
  139. vc.musicPath = _musicPath;
  140. vc.musicID = _musicID;
  141. vc.haveBGM = _haveBGM;
  142. vc.isTakeSame = _isTakeSame;
  143. [[YBBaseAppDelegate sharedAppDelegate]pushViewController:vc animated:YES];
  144. }else{
  145. YBWeakSelf;
  146. NSString *msg = [NSString stringWithFormat:@"%ld\n%@",(long)result.retCode,result.descMsg];
  147. NSDictionary *contentDic = @{@"title":@"",@"msg":msg,@"left":@"",@"right":YZMsg(@"确定"),@"richImg":@""};
  148. [YBAlertView showAlertView:contentDic complete:^(int eventType) {
  149. [weakSelf clickNaviLeftBtn];
  150. }];
  151. }
  152. }
  153. #pragma mark VideoPreviewDelegate
  154. - (void)onVideoPlay {
  155. [_ugcEdit startPlayFromTime:_leftTime toTime:_rightTime];
  156. }
  157. - (void)onVideoPause
  158. {
  159. [_ugcEdit pausePlay];
  160. }
  161. - (void)onVideoResume {
  162. [self onVideoPlay];
  163. }
  164. - (void)onVideoPlayProgress:(CGFloat)time {
  165. _leftTime = time;
  166. }
  167. - (void)onVideoPlayFinished {
  168. _leftTime = 0;
  169. [_ugcEdit startPlayFromTime:_leftTime toTime:_rightTime];
  170. }
  171. - (void)onVideoEnterBackground {
  172. if ([[YBProgressObj progressManeger] isExist]) {
  173. [_ugcEdit pauseGenerate];
  174. }else{
  175. [MBProgressHUD hideHUDForView:self.view animated:YES];
  176. [_ugcEdit pausePlay];
  177. [_videoPreview setPlayBtn:NO];
  178. }
  179. }
  180. - (void)onVideoWillEnterForeground {
  181. if ([[YBProgressObj progressManeger] isExist]) {
  182. [_ugcEdit resumeGenerate];
  183. }
  184. }
  185. #pragma mark - get/set
  186. -(void)setmaskView {
  187. UIImageView* mask_top = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 40)];
  188. [mask_top setImage:[UIImage imageNamed:@"video_record_mask_top"]];
  189. [self.view addSubview:mask_top];
  190. UIImageView* mask_buttom = [[UIImageView alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height - 100, self.view.frame.size.width, 100)];
  191. [mask_buttom setImage:[UIImage imageNamed:@"video_record_mask_buttom"]];
  192. [self.view addSubview:mask_buttom];
  193. }
  194. - (TCVideoPreview *)videoPreview {
  195. if (!_videoPreview) {
  196. _videoPreview = [[TCVideoPreview alloc] initWithFrame:CGRectMake(0, 0, self.view.width, self.view.height) coverImage:nil];
  197. _videoPreview.delegate = self;
  198. }
  199. return _videoPreview;
  200. }
  201. - (PhotoTransitionToolbar *)photoTransitionToolbar {
  202. if (!_photoTransitionToolbar) {
  203. _photoTransitionToolbar = [[PhotoTransitionToolbar alloc] initWithFrame:CGRectMake(0, self.view.height - bottomInset - bottomToolbarHeight-ShowDiff, self.view.width-90, bottomToolbarHeight)];
  204. _photoTransitionToolbar.delegate = self;
  205. }
  206. return _photoTransitionToolbar;
  207. }
  208. - (UIButton *)nextBtn {
  209. if (!_nextBtn) {
  210. _nextBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  211. [_nextBtn setTitle:YZMsg(@"下一步") forState:0];
  212. _nextBtn.titleLabel.font = SYS_Font(14);
  213. [_nextBtn setTitleColor:[UIColor whiteColor] forState:0];
  214. _nextBtn.backgroundColor = Pink_Cor;
  215. _nextBtn.layer.masksToBounds = YES;
  216. _nextBtn.layer.cornerRadius = 15;
  217. [_nextBtn addTarget:self action:@selector(clickNextBtn) forControlEvents:UIControlEventTouchUpInside];
  218. }
  219. return _nextBtn;
  220. }
  221. -(void)clickNextBtn {
  222. [self pause];
  223. [_videoPreview setPlayBtn:NO];
  224. //图片编辑只能走正常生成逻辑,这里使用高码率,保留更多图片细节
  225. [[YBProgressObj progressManeger] setUpViewCancelHidden:YES andComplete:nil];
  226. [YBProgressObj progressManeger].generationHidden = NO;
  227. [_ugcEdit setVideoBitrate:10000];
  228. [_ugcEdit setCutFromTime:0 toTime:_rightTime];
  229. [_ugcEdit quickGenerateVideo:VIDEO_COMPRESSED_540P videoOutputPath:_videoOutputPath];
  230. }
  231. - (BOOL)prefersStatusBarHidden {
  232. return NO;
  233. }
  234. @end