TCVideoEditViewController.m 87 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300
  1. //
  2. // VideoEditViewController.m
  3. // TCLVBIMDemo
  4. //
  5. // Created by xiang zhang on 2017/4/10.
  6. // Copyright © 2017年 tencent. All rights reserved.
  7. //
  8. #import "TCVideoEditViewController.h"
  9. #import "TCBGMListViewController.h"
  10. #import "SDKHeader.h"
  11. #import <MediaPlayer/MPMediaPickerController.h>
  12. #import "VideoPreview.h"
  13. #import "VideoRangeSlider.h"
  14. #import "VideoRangeConst.h"
  15. #import "TCVideoRecordMusicView.h"
  16. #import "UIView+Additions.h"
  17. #import "ColorMacro.h"
  18. #import "MBProgressHUD.h"
  19. #import "BottomTabBar.h"
  20. #import "VideoCutView.h"
  21. #import "PasterAddView.h"
  22. #import "EffectSelectView.h"
  23. #import "VideoPasterView.h"
  24. #import "VideoTextFiled.h"
  25. #import "TCBGMHelper.h"
  26. #import "TXUGCPublish.h"
  27. #import "TCUserInfoModel.h"
  28. #import "VideoInfo.h"
  29. //#import "TCLoginModel.h"
  30. #import "TCLiveListModel.h"
  31. #import "TCUserAgreementController.h"
  32. #import "UIActionSheet+BlocksKit.h"
  33. #import "UIAlertView+BlocksKit.h"
  34. #import <AFNetworking.h>
  35. #import <AssetsLibrary/AssetsLibrary.h>
  36. #import "TXCVEFColorPalette.h"
  37. //#import "Submit_download_resources.h"
  38. #import "new_BGMListController.h"
  39. #define hasAgreeUserAgreement @"_hasAgreeUserAgreement_"
  40. typedef NS_ENUM(NSInteger,ActionType)
  41. {
  42. ActionType_Save,
  43. ActionType_Publish,
  44. ActionType_Save_Publish,
  45. };
  46. typedef NS_ENUM(NSInteger,TimeType)
  47. {
  48. TimeType_Clear,
  49. TimeType_Back,
  50. TimeType_Repeat,
  51. TimeType_Speed,
  52. };
  53. typedef NS_ENUM(NSInteger,EffectSelectType)
  54. {
  55. EffectSelectType_Effect,
  56. EffectSelectType_Time,
  57. EffectSelectType_Filter,
  58. EffectSelectType_Paster,
  59. EffectSelectType_Text,
  60. };
  61. typedef NS_ENUM(NSInteger,TCLVFilterType) {
  62. FilterType_None = 0,
  63. FilterType_biaozhun , //标准滤镜
  64. FilterType_yinghong , //樱红滤镜
  65. FilterType_yunshang , //云裳滤镜
  66. FilterType_chunzhen , //纯真滤镜
  67. FilterType_bailan , //白兰滤镜
  68. FilterType_yuanqi , //元气滤镜
  69. FilterType_chaotuo , //超脱滤镜
  70. FilterType_xiangfen , //香氛滤镜
  71. FilterType_white , //美白滤镜
  72. FilterType_langman , //浪漫滤镜
  73. FilterType_qingxin , //清新滤镜
  74. FilterType_weimei , //唯美滤镜
  75. FilterType_fennen , //粉嫩滤镜
  76. FilterType_huaijiu , //怀旧滤镜
  77. FilterType_landiao , //蓝调滤镜
  78. FilterType_qingliang , //清凉滤镜
  79. FilterType_rixi , //日系滤镜
  80. };
  81. @interface TCVideoEditViewController ()<TXVideoGenerateListener,VideoPreviewDelegate, BottomTabBarDelegate, VideoCutViewDelegate,EffectSelectViewDelegate, PasterAddViewDelegate, VideoPasterViewDelegate ,VideoTextFieldDelegate ,TXVideoPublishListener,TCBGMControllerListener,VideoRecordMusicViewDelegate,UIActionSheetDelegate, UITabBarDelegate , UIPickerViewDelegate ,UIPickerViewDelegate ,UIAlertViewDelegate,OssUploadImageDelegate>
  82. @property (nonatomic, strong)BGOssManager *ossmanger;
  83. @end
  84. @implementation TCVideoEditViewController
  85. {
  86. TCBGMListViewController *_bgmListVC;
  87. TXVideoEditer* _ugcEdit; //sdk编辑器
  88. VideoPreview* _videoPreview; //视频预览
  89. //特效View
  90. UIView* _effectView;
  91. //cover view
  92. UIImageView* _coverImageView;
  93. //背景音
  94. TCVideoRecordMusicView *_musicView;
  95. //特效确定btn
  96. UIButton * _effectConfirmBtn;
  97. UIButton * _generateCannelBtn;
  98. //生成时的进度浮层
  99. UIView* _generationView;
  100. UIProgressView* _generateProgressView;
  101. UILabel* _generationTitleLabel;
  102. UILabel* _timeLabel;
  103. UIButton* _deleteBtn;
  104. UIButton* _playBtn;
  105. //pulish
  106. TXUGCPublish* _videoPublish;
  107. BottomTabBar* _bottomBar; //底部栏
  108. VideoCutView* _videoCutView; //裁剪
  109. PasterAddView* _pasterAddView; //贴图
  110. EffectSelectView* _effectSelectView; //动效选择
  111. EffectSelectType _effectSelectType;
  112. ActionType _actionType;
  113. TimeType _timeType;
  114. NSMutableArray <EffectInfo *> *_pasterEffectArray;
  115. NSMutableArray <EffectInfo *> *_textEffectArray;
  116. NSMutableArray <VideoPasterInfo *>* _videoPasterInfoList;
  117. NSMutableArray <VideoTextInfo *>* _videoTextInfoList;
  118. NSMutableArray *_cutPathList;
  119. //裁剪时间
  120. CGFloat _duration;
  121. CGFloat _playTime;
  122. CGFloat _BGMDuration;
  123. CGFloat _BGMVolume;
  124. CGFloat _videoVolume;
  125. NSInteger _effectSelectIndex;
  126. NSInteger _effectType;
  127. NSObject* _BGMPath;
  128. NSString* _videoOutputPath;
  129. BOOL _isReverse;
  130. BOOL _isSeek;
  131. BOOL _isPlay;
  132. BOOL _navigationBarHidden;
  133. dispatch_queue_t _imageLoadingQueue;
  134. NSArray<EffectInfo*> *_effectList;
  135. // 选中的滤镜与速度,用于恢复状态
  136. NSInteger _filterIndex;
  137. NSInteger _timeIndex;
  138. MBProgressHUD *_hud;
  139. VideoDynamicViewC *_videoDynamicViewC;
  140. }
  141. -(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
  142. {
  143. self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  144. if (self) {
  145. _effectType = -1;
  146. _cutPathList = [NSMutableArray array];
  147. _videoOutputPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"outputCut.mp4"];
  148. _pasterEffectArray = [NSMutableArray array];
  149. [_pasterEffectArray addObject:({
  150. EffectInfo * v= [EffectInfo new];
  151. v.name = NSLocalizedString(@"Common.AddNew", nil);
  152. v.icon = [UIImage imageNamed:@"addPaster_normal"];
  153. v;
  154. })];
  155. _textEffectArray = [NSMutableArray array];
  156. [_textEffectArray addObject:({
  157. EffectInfo * v= [EffectInfo new];
  158. v.name = NSLocalizedString(@"Common.AddNew", nil);
  159. v.icon = [UIImage imageNamed:@"addPaster_normal"];
  160. v;
  161. })];
  162. _videoPasterInfoList = [NSMutableArray array];
  163. _videoTextInfoList = [NSMutableArray array];
  164. _BGMVolume = 1.0;
  165. _videoVolume = 1.0;
  166. _imageLoadingQueue = dispatch_queue_create("TCVideoEditImageLoading", DISPATCH_QUEUE_CONCURRENT);
  167. }
  168. return self;
  169. }
  170. - (void)viewWillAppear:(BOOL)animated
  171. {
  172. [super viewWillAppear:animated];
  173. // _navigationBarHidden = self.navigationController.navigationBar.hidden;
  174. self.navigationController.navigationBar.translucent = NO;
  175. // self.navigationController.navigationBar.hidden = YES;
  176. // self.navigationController.navigationBar.hidden = NO;
  177. [[UIApplication sharedApplication]setStatusBarHidden:YES];
  178. if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]){
  179. self.navigationController.interactivePopGestureRecognizer.enabled = NO;
  180. }
  181. [self ossmanger];
  182. }
  183. - (void)viewWillDisappear:(BOOL)animated
  184. {
  185. [super viewWillDisappear:animated];
  186. self.navigationController.navigationBar.hidden = NO;
  187. self.navigationController.navigationBarHidden = NO;
  188. // _navigationBarHidden;
  189. [[UIApplication sharedApplication]setStatusBarHidden:NO];
  190. [_videoCutView stopGetImageList];
  191. }
  192. - (void)viewDidAppear:(BOOL)animated
  193. {
  194. [super viewDidAppear:animated];
  195. if (!_videoPreview.isPlaying) {
  196. [_videoPreview playVideo];
  197. }
  198. // [self showVideoDynamicViewC];
  199. }
  200. - (void)onVideoEnterBackground
  201. {
  202. if (_generationView && !_generationView.hidden) {
  203. [_ugcEdit pauseGenerate];
  204. }else{
  205. [MBProgressHUD hideHUDForView:self.view animated:YES];
  206. [_ugcEdit pausePlay];
  207. [self setPlayBtn:NO];
  208. }
  209. }
  210. - (void)onVideoWillEnterForeground
  211. {
  212. if (_generationView && !_generationView.hidden) {
  213. [_ugcEdit resumeGenerate];
  214. }else{
  215. [_ugcEdit resumePlay];
  216. [self setPlayBtn:YES];
  217. }
  218. }
  219. - (void)presetTonew_bgmList
  220. {
  221. __block typeof(self)blockself =self;
  222. [[TXUGCRecord shareInstance] pauseBGM];
  223. new_BGMListController *bgmvc =[new_BGMListController new];
  224. new_bgmNavController *nv = [[new_bgmNavController alloc] initWithRootViewController:bgmvc];
  225. bgmvc.nav =nv;
  226. nv.useMusicBlock = ^(music_obj *model) {
  227. if (model)
  228. {
  229. blockself.element =model;
  230. [blockself onBGMControllerPlay:model.music_url];
  231. }
  232. };
  233. nv.modalPresentationStyle = UIModalPresentationFullScreen;
  234. [self presentViewController:nv animated:YES completion:nil];
  235. }
  236. - (void)viewDidLoad {
  237. [super viewDidLoad];
  238. __weak __typeof(self) wself = self;
  239. dispatch_async(_imageLoadingQueue, ^{
  240. CFTimeInterval start = CFAbsoluteTimeGetCurrent();
  241. EffectInfo *(^CreateEffect)(NSString *name, NSString *animPrefix)=^(NSString *name, NSString *animPrefix){
  242. EffectInfo * v= [EffectInfo new];
  243. v.name = name;
  244. v.animateIcons = [NSMutableArray array];
  245. // NSString *imageName = [NSString stringWithFormat: @"%@_select", animPrefix];
  246. // NSString *path = [[NSBundle mainBundle] pathForResource:imageName ofType:@"png"];
  247. // v.selectIcon = [UIImage imageWithContentsOfFile:path];
  248. for (int i = 0; i < 24; i ++) {
  249. NSString *imageName = [NSString stringWithFormat: @"%@%d", animPrefix, i];
  250. NSString *path = [[NSBundle mainBundle] pathForResource:imageName ofType:@"png"];
  251. if (path == nil) {
  252. break;
  253. }
  254. [v.animateIcons addObject:[UIImage imageWithContentsOfFile:path]];
  255. }
  256. return v;
  257. };
  258. NSArray <EffectInfo *> *effectList = @[ CreateEffect(NSLocalizedString(@"TCVideoEditView.DynamicLightWave", nil), @"donggan"),
  259. CreateEffect(NSLocalizedString(@"TCVideoEditView.DarkFantasy", nil), @"anhei"),
  260. CreateEffect(NSLocalizedString(@"TCVideoEditView.SoulOut", nil), @"linghun"),
  261. CreateEffect(NSLocalizedString(@"TCVideoEditView.ScreenSplit", nil), @"fenlie"),
  262. CreateEffect(NSLocalizedString(@"TCVideoEditView.Shutter", nil), @"shutter-"),
  263. CreateEffect(NSLocalizedString(@"TCVideoEditView.GhostShadow", nil), @"ghostshadow-"),
  264. CreateEffect(NSLocalizedString(@"TCVideoEditView.Phantom", nil), @"phantom-"),
  265. CreateEffect(NSLocalizedString(@"TCVideoEditView.Ghost", nil), @"ghost-"),
  266. CreateEffect(NSLocalizedString(@"TCVideoEditView.Lightning", nil), @"lightning-"),
  267. CreateEffect(NSLocalizedString(@"TCVideoEditView.Mirror", nil), @"mirror-"),
  268. CreateEffect(NSLocalizedString(@"TCVideoEditView.Illusion", nil), @"illusion-"),
  269. ];
  270. __strong __typeof(wself) self = wself;
  271. if (self) {
  272. self->_effectList = effectList;
  273. }
  274. CFTimeInterval end = CFAbsoluteTimeGetCurrent();
  275. NSLog(@"effect load time: %g", end - start);
  276. });
  277. if (_videoAsset == nil && _videoPath != nil) {
  278. NSURL *avUrl = [NSURL fileURLWithPath:_videoPath];
  279. _videoAsset = [AVAsset assetWithURL:avUrl];
  280. }
  281. self.view.backgroundColor = UIColor.blackColor;
  282. _videoPreview = [[VideoPreview alloc] initWithFrame:self.view.bounds coverImage:nil];
  283. _videoPreview.delegate = self;
  284. [_videoPreview setPlayBtnHidden:YES];
  285. [self.view addSubview:_videoPreview];
  286. //点击选中文字
  287. UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTap:)];
  288. [_videoPreview addGestureRecognizer:singleTap];
  289. CGFloat offset = 0;
  290. if (@available(iOS 11, *)) {
  291. offset = [UIApplication sharedApplication].keyWindow.safeAreaInsets.bottom;
  292. }
  293. _bottomBar = [[BottomTabBar alloc] initWithFrame:CGRectMake(0, self.view.height - 62 * kScaleY - offset, self.view.width, 40 * kScaleY)];
  294. _bottomBar.delegate = self;
  295. [self.view addSubview:_bottomBar];
  296. // 特效取消按钮
  297. UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  298. [backBtn setImage:[UIImage imageNamed:@"back"] forState:UIControlStateNormal];
  299. backBtn.frame = CGRectMake(10 * kScaleX, 10 * kScaleY, 50 * kScaleX, 44 * kScaleY);
  300. [backBtn addTarget:self action:@selector(goBack) forControlEvents:UIControlEventTouchUpInside];
  301. [self.view addSubview:backBtn];
  302. CGFloat btnConfirmWidth = 70;
  303. CGFloat btnConfirmHeight = 30;
  304. _effectConfirmBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  305. [_effectConfirmBtn setTitle:NSLocalizedString(@"Common.Done", nil) forState:UIControlStateNormal];
  306. _effectConfirmBtn.titleLabel.font = [UIFont systemFontOfSize:14];
  307. [_effectConfirmBtn setBackgroundImage:[UIImage imageNamed:@"next_normal"] forState:UIControlStateNormal];
  308. [_effectConfirmBtn setBackgroundImage:[UIImage imageNamed:@"next_press"] forState:UIControlStateHighlighted];
  309. _effectConfirmBtn.frame = CGRectMake(self.view.width - 15 * kScaleX - btnConfirmWidth, 20 * kScaleY, btnConfirmWidth, btnConfirmHeight);
  310. [_effectConfirmBtn addTarget:self action:@selector(goFinish) forControlEvents:UIControlEventTouchUpInside];
  311. [self.view addSubview:_effectConfirmBtn];
  312. _coverImageView = [[UIImageView alloc] initWithFrame:_videoPreview.frame];
  313. _coverImageView.hidden = YES;
  314. _coverImageView.contentMode = UIViewContentModeScaleAspectFit;
  315. [self.view addSubview:_coverImageView];
  316. // 特效容器
  317. _effectView= [[UIView alloc] initWithFrame:CGRectMake(0, self.view.height, self.view.width, 205 * kScaleY)];
  318. [self.view addSubview:_effectView];
  319. _timeLabel = [[UILabel alloc] initWithFrame:CGRectMake(15 * kScaleX, 0, 40, 54)];
  320. _timeLabel.text = @"00:00";
  321. _timeLabel.font = [UIFont systemFontOfSize:14];
  322. _timeLabel.textColor = [UIColor whiteColor];
  323. [_effectView addSubview:_timeLabel];
  324. _playBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  325. [_playBtn setBackgroundImage:[UIImage imageNamed:@"editPlay_normal"] forState:UIControlStateNormal];
  326. [_playBtn setBackgroundImage:[UIImage imageNamed:@"editPlay__press"] forState:UIControlStateHighlighted];
  327. _playBtn.frame = CGRectMake(self.view.width / 2 - 15, 10 * kScaleY, 30, 30);
  328. [_playBtn addTarget:self action:@selector(onPlayVideo) forControlEvents:UIControlEventTouchUpInside];
  329. [_effectView addSubview:_playBtn];
  330. _deleteBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  331. [_deleteBtn setBackgroundImage:[UIImage imageNamed:@"effectDelete_normal"] forState:UIControlStateNormal];
  332. [_deleteBtn setBackgroundImage:[UIImage imageNamed:@"effectDelete_press"] forState:UIControlStateHighlighted];
  333. _deleteBtn.frame = CGRectMake(self.view.width - 15 * kScaleX - 30, 10 * kScaleY, 30, 30);
  334. [_deleteBtn addTarget:self action:@selector(onDeleteEffect) forControlEvents:UIControlEventTouchUpInside];
  335. [_effectView addSubview:_deleteBtn];
  336. CGFloat cutViewHeight = 34 * kScaleY;
  337. RangeContentConfig *config = [[RangeContentConfig alloc] init];
  338. config.pinWidth = PIN_WIDTH;
  339. config.thumbHeight = cutViewHeight;
  340. config.borderHeight = 0;
  341. config.imageCount = 20;
  342. _videoCutView = [[VideoCutView alloc] initWithFrame:CGRectMake(0,_timeLabel.bottom + 3, _effectView.width,cutViewHeight) videoPath:_videoPath videoAsset:_videoAsset config:config];
  343. _videoCutView.delegate = self;
  344. [_videoCutView setCenterPanHidden:YES];
  345. [_effectView addSubview:_videoCutView];
  346. UIImageView *flagView = [[UIImageView alloc] initWithFrame:CGRectMake(self.view.width / 2 - 6, _timeLabel.bottom, 12, 48)];
  347. flagView.image = [UIImage imageNamed:@"videoSlider"];
  348. [_effectView addSubview:flagView];
  349. _effectSelectView = [[EffectSelectView alloc] initWithFrame:CGRectMake(0, _videoCutView.bottom + 24 * kScaleY,_effectView.width,70 * kScaleY)];
  350. _effectSelectView.delegate = self;
  351. _effectSelectView.hidden = NO;
  352. [_effectView addSubview:_effectSelectView];
  353. _pasterAddView = [[PasterAddView alloc] initWithFrame:CGRectMake(0,self.view.height - 205 * kScaleY, self.view.width,205 * kScaleY)];
  354. _pasterAddView.delegate = self;
  355. _pasterAddView.hidden = YES;
  356. [self.view addSubview:_pasterAddView];
  357. _musicView = [[TCVideoRecordMusicView alloc] initWithFrame:CGRectMake(0, self.view.bottom - 268 * kScaleY, self.view.width, 268 * kScaleY) needEffect:NO];
  358. _musicView.delegate = self;
  359. _musicView.hidden = YES;
  360. [self.view addSubview:_musicView];
  361. _bgmListVC = [[TCBGMListViewController alloc] init];
  362. [_bgmListVC setBGMControllerListener:self];
  363. [self initVideoEditor];
  364. [self initVideoPublish];
  365. }
  366. - (void)initVideoEditor
  367. {
  368. TXVideoInfo *videoMsg = [TXVideoInfoReader getVideoInfoWithAsset:_videoAsset];
  369. _duration = videoMsg.duration;
  370. TXPreviewParam *param = [[TXPreviewParam alloc] init];
  371. param.videoView = _videoPreview.renderView;
  372. param.renderMode = PREVIEW_RENDER_MODE_FILL_EDGE;
  373. _ugcEdit = [[TXVideoEditer alloc] initWithPreview:param];
  374. _ugcEdit.generateDelegate = self;
  375. _ugcEdit.previewDelegate = _videoPreview;
  376. //[_ugcEdit setVideoPath:_videoPath];
  377. [_ugcEdit setVideoAsset:_videoAsset];
  378. [_ugcEdit setRenderRotation:self.renderRotation];
  379. // UIImage *waterimage = [UIImage imageNamed:@"watermark"];
  380. // [_ugcEdit setWaterMark:waterimage normalizationFrame:CGRectMake(0.01, 0.01, 0.3 , 0)];
  381. UIImage *tailWaterimage = [UIImage imageNamed:@"tcloud_logo"];
  382. float w = 0.15;
  383. float x = (1.0 - w) / 2.0;
  384. float width = w * videoMsg.width;
  385. float height = width * tailWaterimage.size.height / tailWaterimage.size.width;
  386. float y = (videoMsg.height - height) / 2 / videoMsg.height;
  387. [_ugcEdit setTailWaterMark:tailWaterimage normalizationFrame:CGRectMake(x,y,w,0) duration:2];
  388. }
  389. - (void)initVideoPublish
  390. {
  391. _videoPublish = [[TXUGCPublish alloc] initWithUserID:[[TCUserInfoModel sharedInstance] getUserProfile].identifier];
  392. _videoPublish.delegate = self;
  393. }
  394. - (UIView*)generatingView
  395. {
  396. /*用作生成时的提示浮层*/
  397. if (!_generationView) {
  398. _generationView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.width, self.view.height + 64)];
  399. _generationView.backgroundColor = UIColor.blackColor;
  400. _generationView.alpha = 0.9f;
  401. _generateProgressView = [UIProgressView new];
  402. _generateProgressView.center = CGPointMake(_generationView.width / 2, _generationView.height / 2);
  403. _generateProgressView.bounds = CGRectMake(0, 0, 225, 20);
  404. _generateProgressView.progressTintColor = RGB(238, 100, 85);
  405. [_generateProgressView setTrackImage:[UIImage imageNamed:@"slide_bar_small"]];
  406. //_generateProgressView.trackTintColor = UIColor.whiteColor;
  407. //_generateProgressView.transform = CGAffineTransformMakeScale(1.0, 2.0);
  408. _generationTitleLabel = [UILabel new];
  409. _generationTitleLabel.font = [UIFont systemFontOfSize:14];
  410. _generationTitleLabel.text = NSLocalizedString(@"TCVideoCutView.VideoGenerating", nil);
  411. _generationTitleLabel.textColor = UIColor.whiteColor;
  412. _generationTitleLabel.textAlignment = NSTextAlignmentCenter;
  413. _generationTitleLabel.frame = CGRectMake(0, _generateProgressView.y - 34, _generationView.width, 14);
  414. _generateCannelBtn = [UIButton new];
  415. [_generateCannelBtn setImage:[UIImage imageNamed:@"cancel"] forState:UIControlStateNormal];
  416. _generateCannelBtn.frame = CGRectMake(_generateProgressView.right + 15, _generationTitleLabel.bottom + 10, 20, 20);
  417. [_generateCannelBtn addTarget:self action:@selector(onCancel:) forControlEvents:UIControlEventTouchUpInside];
  418. [_generationView addSubview:_generationTitleLabel];
  419. [_generationView addSubview:_generateProgressView];
  420. [_generationView addSubview:_generateCannelBtn];
  421. [[[UIApplication sharedApplication] delegate].window addSubview:_generationView];
  422. }
  423. _generateProgressView.progress = 0.f;
  424. return _generationView;
  425. }
  426. - (void)setRenderRotation:(int)renderRotation
  427. {
  428. _renderRotation = renderRotation;
  429. [_ugcEdit setRenderRotation: renderRotation];
  430. }
  431. -(void)onPlayVideo
  432. {
  433. if (_isPlay) {
  434. [_ugcEdit pausePlay];
  435. _isPlay = NO;
  436. }else{
  437. CGFloat currentPos = _videoCutView.videoRangeSlider.currentPos;
  438. if(_isReverse && currentPos != 0){
  439. [self startPlayFromTime:0 toTime:currentPos];
  440. }else{
  441. [self startPlayFromTime:currentPos toTime:_duration];
  442. }
  443. if (_effectSelectType == EffectSelectType_Paster) {
  444. [self removeAllPasterViewFromSuperView];
  445. [self setVideoPastersToSDK];
  446. }
  447. if (_effectSelectType == EffectSelectType_Text) {
  448. [self removeAllTextFieldFromSuperView];
  449. [self setVideoSubtitlesToSDK];
  450. }
  451. _isPlay = YES;
  452. }
  453. [self setPlayBtn:_isPlay];
  454. }
  455. - (void)setPlayBtn:(BOOL)isPlay
  456. {
  457. if (isPlay) {
  458. [_playBtn setBackgroundImage:[UIImage imageNamed:@"editPause_normal"] forState:UIControlStateNormal];
  459. [_playBtn setBackgroundImage:[UIImage imageNamed:@"editPause_press"] forState:UIControlStateHighlighted];
  460. }else{
  461. [_playBtn setBackgroundImage:[UIImage imageNamed:@"editPlay_normal"] forState:UIControlStateNormal];
  462. [_playBtn setBackgroundImage:[UIImage imageNamed:@"editPlay__press"] forState:UIControlStateHighlighted];
  463. }
  464. }
  465. - (void)onTap:(UITapGestureRecognizer*)recognizer
  466. {
  467. CGPoint tapPoint = [recognizer locationInView:recognizer.view];
  468. if (_bottomBar.isHidden && _musicView.hidden) {
  469. BOOL findEffect = NO;
  470. if (_effectSelectType == EffectSelectType_Paster) {
  471. for (NSInteger i = 0; i < _videoPasterInfoList.count; i++) {
  472. CGRect pasterFrame = [_videoPasterInfoList[i].pasterView pasterFrameOnView:recognizer.view];
  473. if (CGRectContainsPoint(pasterFrame, tapPoint)) {
  474. VideoPasterInfo *info = _videoPasterInfoList[i];
  475. if (_playTime >= info.startTime && _playTime <= info.endTime) {
  476. [self removeAllPasterViewFromSuperView];
  477. [_videoPreview addSubview:info.pasterView];
  478. [self setVideoPastersToSDK];
  479. findEffect = YES;
  480. break;
  481. }
  482. }
  483. }
  484. }
  485. else if (_effectSelectType == EffectSelectType_Text){
  486. for (NSInteger i = 0; i < _videoTextInfoList.count; i++) {
  487. CGRect textFrame = [_videoTextInfoList[i].textField textFrameOnView:recognizer.view];
  488. if (CGRectContainsPoint(textFrame, tapPoint)) {
  489. VideoTextInfo *info = _videoTextInfoList[i];
  490. if (_playTime >= info.startTime && _playTime <= info.endTime){
  491. [self removeAllTextFieldFromSuperView];
  492. [_videoPreview addSubview:info.textField];
  493. [self setVideoSubtitlesToSDK];
  494. findEffect = YES;
  495. break;
  496. }
  497. }
  498. }
  499. }
  500. if (findEffect) {
  501. [_ugcEdit previewAtTime:_playTime];
  502. [_ugcEdit pausePlay];
  503. [self setPlayBtn:NO];
  504. }
  505. }else{
  506. _musicView.hidden = YES;
  507. _bottomBar.hidden = NO;
  508. }
  509. }
  510. - (void)resetConfirmBtn
  511. {
  512. if(_bottomBar.isHidden){
  513. [_effectConfirmBtn setTitle:@"" forState:UIControlStateNormal];
  514. [_effectConfirmBtn setBackgroundImage:[UIImage imageNamed:@"cofirm_normal"] forState:UIControlStateNormal];
  515. [_effectConfirmBtn setBackgroundImage:[UIImage imageNamed:@"cofirm_press"] forState:UIControlStateHighlighted];
  516. _effectConfirmBtn.frame = CGRectMake(self.view.width - 15 * kScaleX - 44, 20 * kScaleY, 44, 30);
  517. }else{
  518. [_effectConfirmBtn setTitle:NSLocalizedString(@"Common.Done", nil) forState:UIControlStateNormal];
  519. _effectConfirmBtn.titleLabel.font = [UIFont systemFontOfSize:14];
  520. [_effectConfirmBtn setBackgroundImage:[UIImage imageNamed:@"next_normal"] forState:UIControlStateNormal];
  521. [_effectConfirmBtn setBackgroundImage:[UIImage imageNamed:@"next_press"] forState:UIControlStateHighlighted];
  522. _effectConfirmBtn.frame = CGRectMake(self.view.width - 15 * kScaleX - 70, 20 * kScaleY, 70, 30);
  523. }
  524. }
  525. - (void)goBack
  526. {
  527. if (_bottomBar.hidden) {
  528. UIAlertView *alert = [UIAlertView bk_showAlertViewWithTitle:NSLocalizedString(@"TCVideoEditView.AbandonEffect", nil) message:nil cancelButtonTitle:NSLocalizedString(@"Common.Cancel", nil) otherButtonTitles:@[NSLocalizedString(@"Common.OK", nil)] handler:^(UIAlertView *alertView, NSInteger buttonIndex) {
  529. if (buttonIndex == 1) {
  530. _musicView.hidden = YES;
  531. [self clearEffect];
  532. [self onHideEffectView];
  533. [self resetConfirmBtn];
  534. }
  535. }];
  536. [alert show];
  537. }else{
  538. UIAlertView *alert = [UIAlertView bk_showAlertViewWithTitle:NSLocalizedString(@"TCVideoEditView.AbandonEdit", nil) message:nil cancelButtonTitle:NSLocalizedString(@"Common.Cancel", nil) otherButtonTitles:@[NSLocalizedString(@"Common.OK", nil)] handler:^(UIAlertView *alertView, NSInteger buttonIndex) {
  539. if (buttonIndex == 1) {
  540. [_ugcEdit stopPlay];
  541. [self setPlayBtn:NO];
  542. if (_isFromCut) {
  543. [self dismissViewControllerAnimated:YES completion:nil];
  544. }else{
  545. [self.navigationController popViewControllerAnimated:YES];
  546. }
  547. }
  548. }];
  549. [alert show];
  550. }
  551. }
  552. - (void)goFinish
  553. {
  554. if (_bottomBar.hidden) {
  555. if (_effectSelectType == EffectSelectType_Paster) {
  556. [self removeAllPasterViewFromSuperView];
  557. [self setVideoPastersToSDK];
  558. }
  559. if (_effectSelectType == EffectSelectType_Text) {
  560. [self removeAllTextFieldFromSuperView];
  561. [self setVideoSubtitlesToSDK];
  562. }
  563. _bottomBar.hidden = NO;
  564. _musicView.hidden = YES;
  565. [self onHideEffectView];
  566. [self resetConfirmBtn];
  567. }else{
  568. __weak __typeof(self) ws = self;
  569. UIActionSheet *testSheet = [[UIActionSheet alloc] init];
  570. [testSheet bk_addButtonWithTitle:NSLocalizedString(@"Common.Save", nil) handler:^{
  571. [ws goSave];
  572. }];
  573. [testSheet bk_addButtonWithTitle:NSLocalizedString(@"Common.Release", nil) handler:^{
  574. [ws goPublish];
  575. }];
  576. [testSheet bk_setCancelButtonWithTitle:NSLocalizedString(@"Common.Cancel", nil) handler:nil];
  577. [testSheet showInView:self.view];
  578. }
  579. }
  580. - (void)goSave
  581. {
  582. _actionType = ActionType_Save;
  583. [self generateVideo];
  584. }
  585. - (void)goPublish
  586. {
  587. _actionType = ActionType_Publish;
  588. [self generateVideo];
  589. }
  590. - (void)onCancel:(UIButton*)sender
  591. {
  592. _generationView.hidden = YES;
  593. [_ugcEdit cancelGenerate];
  594. [_ugcEdit startPlayFromTime:0 toTime:_duration];
  595. [self setPlayBtn:YES];
  596. }
  597. - (void)onSelectMusic
  598. {
  599. if (_BGMPath) {
  600. _musicView.hidden = !_musicView.hidden;
  601. }else{
  602. [self resetVideoProgress];
  603. // UINavigationController *nv = [[UINavigationController alloc] initWithRootViewController:_bgmListVC];
  604. // [nv.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];
  605. // nv.navigationBar.barTintColor = RGB(25, 29, 38);
  606. // [self presentViewController:nv animated:YES completion:nil];
  607. // [_bgmListVC loadBGMList];
  608. [self presetTonew_bgmList];
  609. }
  610. }
  611. /// 特效入口点击事件响应函数
  612. - (void)onShowEffectView
  613. {
  614. [self resetVideoProgress];
  615. _coverImageView.hidden = NO;
  616. _coverImageView.image = [TXVideoInfoReader getSampleImage:_playTime videoAsset:_videoAsset];
  617. _videoPreview.hidden = YES;
  618. [UIView animateWithDuration:0.3 animations:^{
  619. _coverImageView.frame = CGRectMake(0, 54 * kScaleY, self.view.width, 410 * kScaleY);
  620. _effectView.frame = CGRectMake(0, self.view.height - 205 * kScaleY, _effectView.width, _effectView.height);
  621. } completion:^(BOOL finished) {
  622. _videoPreview.frame = _coverImageView.frame;
  623. _videoPreview.hidden = NO;
  624. _coverImageView.hidden = YES;
  625. _bottomBar.hidden = YES;
  626. }];
  627. }
  628. - (void)onHideEffectView
  629. {
  630. _coverImageView.hidden = NO;
  631. _coverImageView.image = [TXVideoInfoReader getSampleImage:_playTime videoAsset:_videoAsset];
  632. _videoPreview.hidden = YES;
  633. _bottomBar.hidden = NO;
  634. [UIView animateWithDuration:0.3 animations:^{
  635. _coverImageView.frame = CGRectMake(0, 0, self.view.width,self.view.height);
  636. _effectView.frame = CGRectMake(0, self.view.height, _effectView.width, _effectView.height);
  637. } completion:^(BOOL finished) {
  638. _videoPreview.frame = _coverImageView.frame;
  639. _videoPreview.hidden = NO;
  640. _coverImageView.hidden = YES;
  641. }];
  642. [self startPlayFromTime:0 toTime:_duration];
  643. [self setPlayBtn:YES];
  644. }
  645. -(void)onDeleteEffect
  646. {
  647. CGFloat endTime = 0;
  648. if (_effectSelectType == EffectSelectType_Effect) {
  649. VideoColorInfo *info = [_videoCutView removeLastColoration:ColorType_Effect];
  650. if (info) {
  651. float time = _isReverse ? MAX(info.endPos, info.startPos) : MIN(info.endPos, info.startPos);
  652. [_videoCutView setPlayTime:time];
  653. _playTime = time;
  654. }
  655. [_ugcEdit deleteLastEffect];
  656. }
  657. else if (_effectSelectType == EffectSelectType_Paster){
  658. if (_pasterEffectArray.count <= 1) {
  659. return;
  660. }
  661. VideoPasterInfo *info = [_videoPasterInfoList lastObject];
  662. [info.pasterView removeFromSuperview];
  663. [_videoPasterInfoList removeLastObject];
  664. [_pasterEffectArray removeObjectAtIndex:_pasterEffectArray.count - 2];
  665. [_effectSelectView setEffectList:_pasterEffectArray];
  666. [_videoCutView removeLastColoration:ColorType_Paster];
  667. if (_videoPasterInfoList.count > 0) {
  668. VideoPasterInfo *info = [_videoPasterInfoList lastObject];
  669. [self setLeftPanFrame:info.startTime rightPanFrame:info.endTime];
  670. endTime = info.endTime;
  671. }else{
  672. [self setLeftPanFrame:0 rightPanFrame:0];
  673. endTime = 0;
  674. }
  675. [self setVideoPastersToSDK];
  676. [_ugcEdit previewAtTime:endTime];
  677. }
  678. else if (_effectSelectType == EffectSelectType_Text){
  679. if (_textEffectArray.count <= 1) {
  680. return;
  681. }
  682. VideoTextInfo *info = [_videoTextInfoList lastObject];
  683. [info.textField removeFromSuperview];
  684. [_videoTextInfoList removeLastObject];
  685. [_textEffectArray removeObjectAtIndex:_textEffectArray.count - 2];
  686. [_effectSelectView setEffectList:_textEffectArray];
  687. [_videoCutView removeLastColoration:ColorType_Text];
  688. if (_videoTextInfoList.count > 0) {
  689. VideoTextInfo *info = [_videoTextInfoList lastObject];
  690. [self setLeftPanFrame:info.startTime rightPanFrame:info.endTime];
  691. endTime = info.endTime;
  692. }else{
  693. [self setLeftPanFrame:0 rightPanFrame:0];
  694. endTime = 0;
  695. }
  696. [self setVideoSubtitlesToSDK];
  697. [_ugcEdit previewAtTime:endTime];
  698. }
  699. }
  700. - (void)removeAllPasterViewFromSuperView
  701. {
  702. for (VideoPasterInfo* pasterInfo in _videoPasterInfoList) {
  703. [pasterInfo.pasterView removeFromSuperview];
  704. }
  705. }
  706. - (void)removeAllTextFieldFromSuperView
  707. {
  708. for (VideoTextInfo* textInfo in _videoTextInfoList) {
  709. [textInfo.textField removeFromSuperview];
  710. }
  711. }
  712. - (void)removeCurrentPasterInfo
  713. {
  714. if (_effectSelectIndex >= _videoPasterInfoList.count
  715. || _effectSelectIndex >= _pasterEffectArray.count - 1
  716. || _effectSelectIndex < 0) {
  717. return;
  718. }
  719. [_videoPasterInfoList removeObjectAtIndex:_effectSelectIndex];
  720. [_pasterEffectArray removeObjectAtIndex:_effectSelectIndex];
  721. [_effectSelectView setEffectList:_pasterEffectArray];
  722. [_videoCutView removeColoration:ColorType_Paster index:_effectSelectIndex];
  723. if (_videoPasterInfoList.count > 0) {
  724. VideoPasterInfo *info = [_videoPasterInfoList lastObject];
  725. [self setLeftPanFrame:info.startTime rightPanFrame:info.endTime];
  726. }else{
  727. [self setLeftPanFrame:0 rightPanFrame:0];
  728. }
  729. _effectSelectIndex = _pasterEffectArray.count - 2;
  730. [self setVideoPastersToSDK];
  731. }
  732. - (void)removeCurrentTextInfo
  733. {
  734. if (_effectSelectIndex >= _videoTextInfoList.count
  735. || _effectSelectIndex >= _textEffectArray.count - 1
  736. || _effectSelectIndex < 0) {
  737. return;
  738. }
  739. [_videoTextInfoList removeObjectAtIndex:_effectSelectIndex];
  740. [_textEffectArray removeObjectAtIndex:_effectSelectIndex];
  741. [_effectSelectView setEffectList:_textEffectArray];
  742. [_videoCutView removeColoration:ColorType_Text index:_effectSelectIndex];
  743. if (_videoTextInfoList.count > 0) {
  744. VideoTextInfo *info = [_videoTextInfoList lastObject];
  745. [self setLeftPanFrame:info.startTime rightPanFrame:info.endTime];
  746. }else{
  747. [self setLeftPanFrame:0 rightPanFrame:0];
  748. }
  749. _effectSelectIndex = _textEffectArray.count - 2;
  750. [self setVideoSubtitlesToSDK];
  751. }
  752. - (CGFloat)getLastPasterEndTime
  753. {
  754. if (_videoPasterInfoList.count > 0) {
  755. return [_videoPasterInfoList lastObject].endTime;
  756. }
  757. return 0;
  758. }
  759. - (CGFloat)getLastTextEndTime
  760. {
  761. if (_videoTextInfoList.count > 0) {
  762. return [_videoTextInfoList lastObject].endTime;
  763. }
  764. return 0;
  765. }
  766. - (void)clearEffect
  767. {
  768. switch (_effectSelectType) {
  769. case EffectSelectType_Effect:
  770. break;
  771. case EffectSelectType_Time:
  772. {
  773. [_ugcEdit setSpeedList:nil];
  774. [_ugcEdit setReverse:NO];
  775. [_ugcEdit setRepeatPlay:nil];
  776. [_videoCutView setCenterPanHidden:YES];
  777. _timeIndex = 0;
  778. }
  779. break;
  780. case EffectSelectType_Filter:
  781. {
  782. [_ugcEdit setFilter:nil];
  783. _filterIndex = 0;
  784. }
  785. break;
  786. case EffectSelectType_Paster:
  787. {
  788. NSInteger i = _videoPasterInfoList.count;
  789. while (i > 0) {
  790. [_videoCutView removeLastColoration:ColorType_Paster];
  791. i -- ;
  792. }
  793. [self removeAllPasterViewFromSuperView];
  794. [_videoPasterInfoList removeAllObjects];
  795. [_pasterEffectArray removeObjectsInRange:NSMakeRange(0, _pasterEffectArray.count - 1)];
  796. [_ugcEdit setPasterList:nil];
  797. [_ugcEdit setAnimatedPasterList:nil];
  798. }
  799. break;
  800. case EffectSelectType_Text:
  801. {
  802. NSInteger i = _videoTextInfoList.count;
  803. while (i > 0) {
  804. [_videoCutView removeLastColoration:ColorType_Text];
  805. i -- ;
  806. }
  807. [self removeAllTextFieldFromSuperView];
  808. [_videoTextInfoList removeAllObjects];
  809. [_textEffectArray removeObjectsInRange:NSMakeRange(0, _textEffectArray.count - 1)];
  810. [_ugcEdit setSubtitleList:nil];
  811. }
  812. break;
  813. default:
  814. break;
  815. }
  816. }
  817. - (void)resetVideoProgress
  818. {
  819. _playTime = 0;
  820. _isSeek = YES;
  821. _isPlay = NO;
  822. _timeLabel.text = @"00:00";
  823. [_ugcEdit previewAtTime:_playTime];
  824. [self setPlayBtn:NO];
  825. }
  826. //设置特效选中区间
  827. - (void)setLeftPanFrame:(CGFloat)leftTime rightPanFrame:(CGFloat)rightTime
  828. {
  829. if (leftTime == 0 && rightTime == 0) {
  830. [_videoCutView setLeftPanHidden:YES];
  831. [_videoCutView setRightPanHidden:YES];
  832. [_videoCutView setLeftPanFrame:0];
  833. [_videoCutView setRightPanFrame:0];
  834. [_videoCutView setPlayTime:0];
  835. }else{
  836. [_videoCutView setLeftPanHidden:NO];
  837. [_videoCutView setRightPanHidden:NO];
  838. [_videoCutView setLeftPanFrame:leftTime];
  839. [_videoCutView setRightPanFrame:rightTime];
  840. [_videoCutView setPlayTime:leftTime];
  841. }
  842. }
  843. -(void)startPlayFromTime:(CGFloat)startTime toTime:(CGFloat)endTime
  844. {
  845. [_ugcEdit startPlayFromTime:startTime toTime:endTime];
  846. _isSeek = NO;
  847. _isPlay = YES;
  848. }
  849. #pragma mark - To SDK
  850. - (void)generateVideo
  851. {
  852. [_ugcEdit pausePlay];
  853. [self setPlayBtn:NO];
  854. if (YES == [[[NSUserDefaults standardUserDefaults] objectForKey:hasAgreeUserAgreement] boolValue] || _actionType == ActionType_Save) {
  855. [self confirmGenerateVideo];
  856. }else{
  857. TCUserAgreementController *agreementController = [[TCUserAgreementController alloc] init];
  858. __weak __typeof(self) weakSelf = self;
  859. agreementController.agree = ^(BOOL isAgree) {
  860. if (isAgree) {
  861. [[NSUserDefaults standardUserDefaults] setObject:@YES forKey:hasAgreeUserAgreement];
  862. [weakSelf.navigationController dismissViewControllerAnimated:YES completion:nil];
  863. [weakSelf confirmGenerateVideo];
  864. }else{
  865. UIAlertView *alert = [UIAlertView bk_showAlertViewWithTitle:@"不同意用户协议将无法发布视频" message:nil cancelButtonTitle:NSLocalizedString(@"Common.OK", nil) otherButtonTitles:nil handler:^(UIAlertView *alertView, NSInteger buttonIndex) {
  866. [[NSUserDefaults standardUserDefaults] setObject:@NO forKey:hasAgreeUserAgreement];
  867. [self.navigationController dismissViewControllerAnimated:YES completion:nil];
  868. }];
  869. [alert show];
  870. }
  871. };
  872. [self.navigationController presentViewController:agreementController animated:YES completion:nil];
  873. }
  874. }
  875. - (void)confirmGenerateVideo
  876. {
  877. _generationView = [self generatingView];
  878. _generationView.hidden = NO;
  879. _generateCannelBtn.hidden = NO;
  880. [_ugcEdit setCutFromTime:0 toTime:_duration];
  881. [_ugcEdit generateVideo:VIDEO_COMPRESSED_720P videoOutputPath:_videoOutputPath];
  882. }
  883. - (void)publishVideo
  884. {
  885. // [self.navigationController popViewControllerAnimated:YES];
  886. // [self.navigationController popViewControllerAnimated:YES];
  887. // return;
  888. [self showVideoDynamicViewC];
  889. [_videoDynamicViewC upLoadVideoUrl:_videoOutputPath];
  890. [[AppDelegate sharedAppDelegate]pushViewController:_videoDynamicViewC];
  891. __block typeof(self)blockself =self;
  892. TXVideoInfo *videoInfo = [TXVideoInfoReader getVideoInfo:_videoOutputPath];
  893. TXPublishParam *publishParam = [[TXPublishParam alloc] init];
  894. publishParam.signature = @"";
  895. publishParam.coverPath = [self getCoverPath:videoInfo.coverImage];
  896. publishParam.videoPath = _videoOutputPath;
  897. // Submit_download_resources *resource =[Submit_download_resources new];
  898. // resource.ossManager = self.ossmanger;
  899. // [[BGHUDHelper sharedInstance]syncLoading:@"视频提交至服务器中..."];
  900. NSLog(@"VideoDynamicView-1-1-1-1");
  901. // [[BGHUDHelper sharedInstance] syncStopLoading];
  902. // [resource upLoadVideoAction:_videoOutputPath andCouver:publishParam.coverPath andCallback:^(id response) {
  903. // if (response && [response isKindOfClass:[NSDictionary class]])
  904. // {
  905. // [[BGHUDHelper sharedInstance] syncStopLoading];
  906. //
  907. //
  908. //// //返回视频地址和预览图地址进行提交
  909. //// [blockself uploadHttpServiceDynamic:response[@"videourl"] andcoverurl:response[@"couverurl"]];
  910. // }
  911. // }];
  912. // [_videoPublish publishVideo:publishParam];
  913. // [[TCLoginModel sharedInstance] getVodSign:^(int errCode, NSString *msg, NSDictionary *resultDict) {
  914. // [TCUtil report:xiaoshipin_videosign userName:nil code:errCode msg:msg];
  915. // if (errCode == 200 && resultDict){
  916. // NSString *signature = resultDict[@"signature"];
  917. // if (signature && signature.length > 0 && _videoPublish) {
  918. // TXVideoInfo *videoInfo = [TXVideoInfoReader getVideoInfo:_videoOutputPath];
  919. // TXPublishParam *publishParam = [[TXPublishParam alloc] init];
  920. // publishParam.signature = signature;
  921. // publishParam.coverPath = [self getCoverPath:videoInfo.coverImage];
  922. // publishParam.videoPath = _videoOutputPath;
  923. // [_videoPublish publishVideo:publishParam];
  924. // }
  925. // }else{
  926. // _generationView.hidden = YES;
  927. // UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"TCVideoEditView.VideoUploadingFailed", nil)
  928. // message:[NSString stringWithFormat:NSLocalizedString(@"Common.HintErrorCodeMessage", nil),(long)errCode,msg]
  929. // delegate:self
  930. // cancelButtonTitle:NSLocalizedString(@"Common.GotIt", nil)
  931. // otherButtonTitles:nil, nil];
  932. // [alertView show];
  933. // }
  934. // }];
  935. }
  936. #pragma mark - 5 - 视频动态页面
  937. -(void)showVideoDynamicViewC
  938. {
  939. _videoDynamicViewC = (VideoDynamicViewC *)[VideoDynamicViewC showSTBaseViewCOnSuperViewC:[AppDelegate sharedAppDelegate].topViewController.tabBarController.selectedViewController
  940. andFrameRect:CGRectMake(0, 0, kScreenW, kScreenH)
  941. andSTViewCTransitionType:STViewCTransitionTypeOfModal
  942. andComplete:^(BOOL finished,
  943. STBaseViewC *stBaseViewC) {
  944. }];
  945. _videoDynamicViewC.recordTabBarC = [AppDelegate sharedAppDelegate].topViewController.tabBarController;
  946. [_videoDynamicViewC videoDynamicView];
  947. [_videoDynamicViewC showPublishDynamic];
  948. // 开启IQ
  949. _videoDynamicViewC.title = @"发布小视频";
  950. _videoDynamicViewC.navigationItem.title = @"发布小视频";
  951. _videoDynamicViewC.navigationController.navigationBar.tintColor =kAppGrayColor1;
  952. self.navigationController.navigationItem.title = @"发布小视频";
  953. //改变颜色 必须跳转后
  954. _videoDynamicViewC.navigationController.navigationBar.hidden = NO;
  955. [_videoDynamicViewC.navigationController.navigationBar setTitleTextAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:19],NSForegroundColorAttributeName:kAppGrayColor1}];
  956. _videoDynamicViewC.isOpenIQKeyboardManager = YES;
  957. [self.navigationController popToRootViewControllerAnimated:YES];
  958. }
  959. - (void)uploadHttpServiceDynamic:(NSString *)videourl andcoverurl:(NSString *)coverurl
  960. {
  961. // [MGTCVideoRecordManager dM_VideoManager_getBackgroundMiusicWithVideoUrl:[NSURL URLWithString:videourl] newFile:@"" completion:^(NSString * _Nonnull data) {
  962. //
  963. // NSLog(@"%@",data);
  964. //
  965. //
  966. // }];
  967. //地图管理类
  968. STBMKCenter *stBMKCenter = [STBMKCenter shareManager];
  969. NSString *mid =@"0";
  970. if(_element)
  971. {
  972. mid =_element.id;
  973. }
  974. //参数MDic
  975. NSMutableDictionary *parametersMDic = @{@"ctl" :@"publish",
  976. @"act" :@"do_video_publish",
  977. @"itype" :@"xr",
  978. @"publish_type" :@"video", // 发布商品
  979. @"content" :@"合拍", // 动态文本
  980. @"photo_image" :coverurl, // OSS 封面图 URL
  981. @"video_url" :videourl, // OSS 视频 URL
  982. @"latitude" :@(stBMKCenter.latitudeValue), // 纬度值
  983. @"longitude" :@(stBMKCenter.longitudeValue), // 经度值
  984. @"city" :stBMKCenter.cityNameStr, // 城市名称
  985. @"province" :stBMKCenter.provinceStr, // 省会
  986. @"address" :stBMKCenter.detailAdressStr, // 具体坐标地址
  987. @"mid" :mid,
  988. }.mutableCopy;
  989. FWWeakify(self)
  990. [[NetHttpsManager manager]POSTWithParameters:parametersMDic
  991. SuccessBlock:^(NSDictionary *responseJson) {
  992. [[BGHUDHelper sharedInstance]syncStopLoading];
  993. if( [[responseJson allKeys] containsObject:@"status"]&&[responseJson[@"status"] intValue] == 1)
  994. {
  995. //[[BGHUDHelper sharedInstance]tipMessage:@"发布成功!"];
  996. [[BGHUDHelper sharedInstance] syncStopLoading];
  997. [BGHUDHelper alert:@"发布成功!" action:^{
  998. FWStrongify(self)
  999. // 执行退出
  1000. @autoreleasepool {
  1001. self.ossmanger = nil;
  1002. self.navigationController.hidesBottomBarWhenPushed = NO;
  1003. [self.navigationController popToRootViewControllerAnimated:YES];
  1004. Noti_Post_Param(@"DynamicCommitSuccess", nil);
  1005. }
  1006. }];
  1007. }
  1008. } FailureBlock:^(NSError *error) {
  1009. [[BGHUDHelper sharedInstance]syncStopLoading];
  1010. [[BGHUDHelper sharedInstance]tipMessage:@"发布失败!"];
  1011. }];
  1012. }
  1013. //设置贴纸(静态/动态贴纸)
  1014. - (void)setVideoPastersToSDK
  1015. {
  1016. NSMutableArray* animatePasters = [NSMutableArray new];
  1017. NSMutableArray* staticPasters = [NSMutableArray new];
  1018. for (VideoPasterInfo* pasterInfo in _videoPasterInfoList) {
  1019. if ([_videoPreview.subviews containsObject:pasterInfo.pasterView]) {
  1020. continue;
  1021. }
  1022. if (pasterInfo.pasterInfoType == PasterInfoType_Animate) {
  1023. TXAnimatedPaster* paster = [TXAnimatedPaster new];
  1024. paster.startTime = pasterInfo.startTime;
  1025. paster.endTime = pasterInfo.endTime;
  1026. paster.frame = [pasterInfo.pasterView pasterFrameOnView:_videoPreview];
  1027. paster.rotateAngle = pasterInfo.pasterView.rotateAngle * 180 / M_PI;
  1028. paster.animatedPasterpath = pasterInfo.path;
  1029. [animatePasters addObject:paster];
  1030. }
  1031. else if (pasterInfo.pasterInfoType == PasterInfoType_static){
  1032. TXPaster *paster = [TXPaster new];
  1033. paster.startTime = pasterInfo.startTime;
  1034. paster.endTime = pasterInfo.endTime;
  1035. paster.frame = [pasterInfo.pasterView pasterFrameOnView:_videoPreview];
  1036. paster.pasterImage = pasterInfo.pasterView.staticImage;
  1037. [staticPasters addObject:paster];
  1038. }
  1039. }
  1040. [_ugcEdit setAnimatedPasterList:animatePasters];
  1041. [_ugcEdit setPasterList:staticPasters];
  1042. }
  1043. //设置字幕(气泡)
  1044. - (void)setVideoSubtitlesToSDK
  1045. {
  1046. NSMutableArray* subtitles = [NSMutableArray new];
  1047. NSMutableArray<VideoTextInfo*>* emptyVideoTexts;
  1048. for (VideoTextInfo* textInfo in _videoTextInfoList) {
  1049. if (textInfo.textField.text.length < 1) {
  1050. [emptyVideoTexts addObject:textInfo];
  1051. continue;
  1052. }
  1053. if ([_videoPreview.subviews containsObject:textInfo.textField]) {
  1054. continue;
  1055. }
  1056. TXSubtitle* subtitle = [TXSubtitle new];
  1057. subtitle.titleImage = textInfo.textField.textImage;
  1058. subtitle.frame = [textInfo.textField textFrameOnView:_videoPreview];
  1059. subtitle.startTime = textInfo.startTime;
  1060. subtitle.endTime = textInfo.endTime;
  1061. [subtitles addObject:subtitle];
  1062. }
  1063. [_ugcEdit setSubtitleList:subtitles];
  1064. }
  1065. - (void)setFilter:(NSInteger)index
  1066. {
  1067. _filterIndex = index;
  1068. NSString* lookupFileName = @"";
  1069. switch (index) {
  1070. case FilterType_None:
  1071. break;
  1072. case FilterType_biaozhun:
  1073. lookupFileName = @"biaozhun.png";
  1074. break;
  1075. case FilterType_yinghong:
  1076. lookupFileName = @"yinghong.png";
  1077. break;
  1078. case FilterType_yunshang:
  1079. lookupFileName = @"yunshang.png";
  1080. break;
  1081. case FilterType_chunzhen:
  1082. lookupFileName = @"chunzhen.png";
  1083. break;
  1084. case FilterType_bailan:
  1085. lookupFileName = @"bailan.png";
  1086. break;
  1087. case FilterType_yuanqi:
  1088. lookupFileName = @"yuanqi.png";
  1089. break;
  1090. case FilterType_chaotuo:
  1091. lookupFileName = @"chaotuo.png";
  1092. break;
  1093. case FilterType_xiangfen:
  1094. lookupFileName = @"xiangfen.png";
  1095. break;
  1096. case FilterType_white:
  1097. lookupFileName = @"white.png";
  1098. break;
  1099. case FilterType_langman:
  1100. lookupFileName = @"langman.png";
  1101. break;
  1102. case FilterType_qingxin:
  1103. lookupFileName = @"qingxin.png";
  1104. break;
  1105. case FilterType_weimei:
  1106. lookupFileName = @"weimei.png";
  1107. break;
  1108. case FilterType_fennen:
  1109. lookupFileName = @"fennen.png";
  1110. break;
  1111. case FilterType_huaijiu:
  1112. lookupFileName = @"huaijiu.png";
  1113. break;
  1114. case FilterType_landiao:
  1115. lookupFileName = @"landiao.png";
  1116. break;
  1117. case FilterType_qingliang:
  1118. lookupFileName = @"qingliang.png";
  1119. break;
  1120. case FilterType_rixi:
  1121. lookupFileName = @"rixi.png";
  1122. break;
  1123. default:
  1124. break;
  1125. }
  1126. NSString * path = [[NSBundle mainBundle] pathForResource:@"FilterResource" ofType:@"bundle"];
  1127. UIImage* image;
  1128. if (path != nil && index != FilterType_None) {
  1129. path = [path stringByAppendingPathComponent:lookupFileName];
  1130. image = [UIImage imageWithContentsOfFile:path];
  1131. } else {
  1132. image = nil;
  1133. }
  1134. [_ugcEdit setFilter:image];
  1135. }
  1136. #pragma mark VideoPreviewDelegate
  1137. - (void)onVideoPlay
  1138. {
  1139. [self startPlayFromTime:0 toTime:_duration];
  1140. }
  1141. - (void)onVideoPlayProgress:(CGFloat)time
  1142. {
  1143. if (!_isSeek) {
  1144. _playTime = time;
  1145. [_videoCutView setPlayTime:_playTime];
  1146. _timeLabel.text = [NSString stringWithFormat:@"%02d:%02d",(int)_playTime / 60 , (int)_playTime % 60];
  1147. }
  1148. }
  1149. - (void)onVideoPlayFinished
  1150. {
  1151. if (_effectType != -1) {
  1152. [self onEffectBtnEndSelect:nil];
  1153. }else{
  1154. [self startPlayFromTime:0 toTime:_duration];
  1155. }
  1156. }
  1157. #pragma mark TXVideoGenerateListener
  1158. -(void) onGenerateProgress:(float)progress
  1159. {
  1160. _generateProgressView.progress = progress;
  1161. }
  1162. -(void) onGenerateComplete:(TXGenerateResult *)result
  1163. {
  1164. [TCUtil report:xiaoshipin_videoedit userName:nil code:result.retCode msg:result.descMsg];
  1165. if (result.retCode == 0) {
  1166. if (_actionType == ActionType_Publish) {
  1167. _generationTitleLabel.text = NSLocalizedString(@"TCVideoEditView.VideoReleasing", nil);
  1168. _generateProgressView.progress = 0;
  1169. _generateCannelBtn.hidden = YES;
  1170. _generationView.hidden =YES;
  1171. [self publishVideo];
  1172. }else{
  1173. _generationView.hidden = YES;
  1174. ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
  1175. [library writeVideoAtPathToSavedPhotosAlbum:[NSURL fileURLWithPath:_videoOutputPath] completionBlock:^(NSURL *assetURL, NSError *error) {
  1176. if (error != nil) {
  1177. [self toastTip:NSLocalizedString(@"TCVideoEditView.VideoSavingFailed", nil)];
  1178. }else{
  1179. [self toastTip:NSLocalizedString(@"TCVideoEditView.VideoSavingSucceeded", nil)];
  1180. }
  1181. [self performSelector:@selector(dismissViewController) withObject:nil afterDelay:1];
  1182. }];
  1183. }
  1184. }else{
  1185. _generationView.hidden = YES;
  1186. UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"TCVideoCutView.HintVideoGeneratingFailed", nil)
  1187. message:[NSString stringWithFormat:NSLocalizedString(@"Common.HintErrorCodeMessage", nil),(long)result.retCode,result.descMsg]
  1188. delegate:self
  1189. cancelButtonTitle:NSLocalizedString(@"Common.GotIt", nil)
  1190. otherButtonTitles:nil, nil];
  1191. [alertView show];
  1192. }
  1193. }
  1194. #pragma mark - TXVideoPublishListener
  1195. -(void) onPublishProgress:(uint64_t)uploadBytes totalBytes: (uint64_t)totalBytes
  1196. {
  1197. _generateProgressView.progress = (float)uploadBytes / totalBytes;;
  1198. }
  1199. -(void) onPublishComplete:(TXPublishResult*)result
  1200. {
  1201. [TCUtil report:xiaoshipin_videouploadvod userName:nil code:result.retCode msg:result.descMsg];
  1202. _generationView.hidden = YES;
  1203. if (result.retCode != 0) {
  1204. [self toastTip:NSLocalizedString(@"TCVideoEditView.VideoReleasingFailed", nil)];
  1205. }else{
  1206. NSString *title = @"小视频";
  1207. // NSDictionary* dictParam = @{@"userid" :[TCLoginParam shareInstance].identifier,
  1208. // @"file_id" : result.videoId,
  1209. // @"title":title,
  1210. // @"frontcover":result.coverURL == nil ? @"" : result.coverURL,
  1211. // @"location":@"未知",
  1212. // @"play_url":result.videoURL};
  1213. // [[TCLoginModel sharedInstance] uploadUGC:dictParam completion:^(int errCode, NSString *msg, NSDictionary *resultDict) {
  1214. // [TCUtil report:xiaoshipin_videouploadserver userName:nil code:errCode msg:msg];
  1215. // if (200 == errCode) {
  1216. // [self toastTip:NSLocalizedString(@"TCVideoEditView.VideoReleasingSucceeded", nil)];
  1217. // } else {
  1218. // [self toastTip:[NSString stringWithFormat:@"UploadUGCVideo Failed[%d]", errCode]];
  1219. // }
  1220. // [self performSelector:@selector(dismissViewController) withObject:nil afterDelay:1];
  1221. // }];
  1222. }
  1223. }
  1224. - (void)dismissViewController
  1225. {
  1226. [_ugcEdit stopPlay];
  1227. if (_isFromChorus){
  1228. [self.navigationController popToRootViewControllerAnimated:YES];
  1229. }else{
  1230. [self dismissViewControllerAnimated:YES completion:^{
  1231. [[NSNotificationCenter defaultCenter] postNotificationName:kTCLiveListUpdated object:nil];
  1232. }];
  1233. }
  1234. //缓存视频状态置nil
  1235. [[NSUserDefaults standardUserDefaults] setObject:nil forKey:CACHE_PATH_LIST];
  1236. }
  1237. #pragma mark - BottomTabBarDelegate
  1238. - (void)onMusicBtnClicked
  1239. {
  1240. _bottomBar.hidden = YES;
  1241. [self onSelectMusic];
  1242. [self setLeftPanFrame:0 rightPanFrame:0];
  1243. [self resetConfirmBtn];
  1244. }
  1245. - (void)onEffectBtnClicked
  1246. {
  1247. _bottomBar.hidden = YES;
  1248. _deleteBtn.hidden = NO;
  1249. [self resetConfirmBtn];
  1250. [self resetVideoProgress];
  1251. [self onShowEffectView];
  1252. [self removeAllTextFieldFromSuperView];
  1253. [self removeAllPasterViewFromSuperView];
  1254. [self setLeftPanFrame:0 rightPanFrame:0];
  1255. _effectSelectType = EffectSelectType_Effect;
  1256. [_videoCutView setColorType:ColorType_Effect];
  1257. [_videoCutView setCenterPanHidden:YES];
  1258. __block NSArray <EffectInfo *> *effectArray = nil;
  1259. dispatch_barrier_sync(_imageLoadingQueue, ^{
  1260. effectArray = _effectList;
  1261. });
  1262. [_effectSelectView setEffectList:effectArray momentary:YES];
  1263. }
  1264. -(void)onTimeBtnClicked
  1265. {
  1266. _bottomBar.hidden = YES;
  1267. _deleteBtn.hidden = YES;
  1268. [self resetConfirmBtn];
  1269. [self resetVideoProgress];
  1270. [self onShowEffectView];
  1271. [self removeAllTextFieldFromSuperView];
  1272. [self removeAllPasterViewFromSuperView];
  1273. [self setLeftPanFrame:0 rightPanFrame:0];
  1274. _effectSelectType = EffectSelectType_Time;
  1275. [_videoCutView setColorType:ColorType_Time];
  1276. dispatch_async(dispatch_get_global_queue(0, 0), ^{
  1277. NSMutableArray <EffectInfo *> *effectArray = [NSMutableArray array];
  1278. [effectArray addObject:({
  1279. EffectInfo * v= [EffectInfo new];
  1280. v.name = NSLocalizedString(@"Common.None", nil);
  1281. v.animateIcons = [NSMutableArray array];
  1282. for (int i = 0; i < 20; i ++) {
  1283. [v.animateIcons addObject:[UIImage imageNamed:[NSString stringWithFormat:@"jump_%d",i]]];
  1284. }
  1285. v;
  1286. })];
  1287. [effectArray addObject:({
  1288. EffectInfo * v= [EffectInfo new];
  1289. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray1Object1", nil);
  1290. v.animateIcons = [NSMutableArray array];
  1291. v.selectIcon = [UIImage imageNamed:@"timeBack_select"];
  1292. for (int i = 19; i >= 0; i --) {
  1293. [v.animateIcons addObject:[UIImage imageNamed:[NSString stringWithFormat:@"jump_%d",i]]];
  1294. }
  1295. v;
  1296. })];
  1297. [effectArray addObject:({
  1298. EffectInfo * v= [EffectInfo new];
  1299. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray1Object2", nil);
  1300. v.animateIcons = [NSMutableArray array];
  1301. v.selectIcon = [UIImage imageNamed:@"repeat_select"];
  1302. NSMutableArray *repeatIcons = [NSMutableArray array];
  1303. for (int i = 0; i < 20; i ++) {
  1304. UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"jump_%d",i]];
  1305. if (i >= 5 && i <= 15) {
  1306. [repeatIcons addObject:image];
  1307. }
  1308. if (i == 15) {
  1309. [v.animateIcons addObjectsFromArray:repeatIcons];
  1310. [v.animateIcons addObjectsFromArray:repeatIcons];
  1311. }
  1312. [v.animateIcons addObject:image];
  1313. }
  1314. v;
  1315. })];
  1316. [effectArray addObject:({
  1317. EffectInfo * v= [EffectInfo new];
  1318. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray1Object3", nil);
  1319. v.animateIcons = [NSMutableArray array];
  1320. v.selectIcon = [UIImage imageNamed:@"slow_select"];
  1321. v.isSlow = YES;
  1322. for (int i = 0; i < 20; i ++) {
  1323. [v.animateIcons addObject:[UIImage imageNamed:[NSString stringWithFormat:@"jump_%d",i]]];
  1324. }
  1325. v;
  1326. })];
  1327. dispatch_async(dispatch_get_main_queue(), ^{
  1328. [_effectSelectView setEffectList:effectArray];
  1329. _effectSelectView.selectedIndex = _timeIndex;
  1330. });
  1331. });
  1332. }
  1333. - (void)onFilterBtnClicked
  1334. {
  1335. _bottomBar.hidden = YES;
  1336. _deleteBtn.hidden = YES;
  1337. [self resetConfirmBtn];
  1338. [self resetVideoProgress];
  1339. [self onShowEffectView];
  1340. [self setLeftPanFrame:0 rightPanFrame:0];
  1341. NSMutableArray <EffectInfo *> *effectArray = [NSMutableArray array];
  1342. [effectArray addObject:({
  1343. EffectInfo * v= [EffectInfo new];
  1344. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray2Object1", nil);
  1345. v.icon = [UIImage imageNamed:@"orginal"];
  1346. v.selectIcon = [UIImage imageNamed:@"orginal_select"];
  1347. v;
  1348. })];
  1349. [effectArray addObject:({
  1350. EffectInfo * v= [EffectInfo new];
  1351. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray2Object2", nil);
  1352. v.icon = [UIImage imageNamed:@"biaozhun"];
  1353. v.selectIcon = [UIImage imageNamed:@"orginal_select"];
  1354. v;
  1355. })];
  1356. [effectArray addObject:({
  1357. EffectInfo * v= [EffectInfo new];
  1358. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray2Object3", nil);
  1359. v.icon = [UIImage imageNamed:@"yinghong"];
  1360. v.selectIcon = [UIImage imageNamed:@"orginal_select"];
  1361. v;
  1362. })];
  1363. [effectArray addObject:({
  1364. EffectInfo * v= [EffectInfo new];
  1365. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray2Object4", nil);
  1366. v.icon = [UIImage imageNamed:@"yunshang"];
  1367. v.selectIcon = [UIImage imageNamed:@"orginal_select"];
  1368. v;
  1369. })];
  1370. [effectArray addObject:({
  1371. EffectInfo * v= [EffectInfo new];
  1372. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray2Object5", nil);
  1373. v.icon = [UIImage imageNamed:@"chunzhen"];
  1374. v.selectIcon = [UIImage imageNamed:@"orginal_select"];
  1375. v;
  1376. })];
  1377. [effectArray addObject:({
  1378. EffectInfo * v= [EffectInfo new];
  1379. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray2Object6", nil);
  1380. v.icon = [UIImage imageNamed:@"bailan"];
  1381. v.selectIcon = [UIImage imageNamed:@"orginal_select"];
  1382. v;
  1383. })];
  1384. [effectArray addObject:({
  1385. EffectInfo * v= [EffectInfo new];
  1386. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray2Object7", nil);
  1387. v.icon = [UIImage imageNamed:@"yuanqi"];
  1388. v.selectIcon = [UIImage imageNamed:@"orginal_select"];
  1389. v;
  1390. })];
  1391. [effectArray addObject:({
  1392. EffectInfo * v= [EffectInfo new];
  1393. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray2Object8", nil);
  1394. v.icon = [UIImage imageNamed:@"chaotuo"];
  1395. v.selectIcon = [UIImage imageNamed:@"orginal_select"];
  1396. v;
  1397. })];
  1398. [effectArray addObject:({
  1399. EffectInfo * v= [EffectInfo new];
  1400. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray2Object9", nil);
  1401. v.icon = [UIImage imageNamed:@"xiangfen"];
  1402. v.selectIcon = [UIImage imageNamed:@"orginal_select"];
  1403. v;
  1404. })];
  1405. [effectArray addObject:({
  1406. EffectInfo *v = [EffectInfo new];
  1407. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray2Object10", nil);
  1408. v.icon = [UIImage imageNamed:@"fwhite"];
  1409. v.selectIcon = [UIImage imageNamed:@"orginal_select"];
  1410. v;
  1411. })];
  1412. [effectArray addObject:({
  1413. EffectInfo *v = [EffectInfo new];
  1414. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray2Object11", nil);
  1415. v.icon = [UIImage imageNamed:@"langman"];
  1416. v.selectIcon = [UIImage imageNamed:@"orginal_select"];
  1417. v;
  1418. })];
  1419. [effectArray addObject:({
  1420. EffectInfo *v = [EffectInfo new];
  1421. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray2Object12", nil);
  1422. v.icon = [UIImage imageNamed:@"qingxin"];
  1423. v.selectIcon = [UIImage imageNamed:@"orginal_select"];
  1424. v;
  1425. })];
  1426. [effectArray addObject:({
  1427. EffectInfo *v = [EffectInfo new];
  1428. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray2Object13", nil);
  1429. v.icon = [UIImage imageNamed:@"weimei"];
  1430. v.selectIcon = [UIImage imageNamed:@"orginal_select"];
  1431. v;
  1432. })];
  1433. [effectArray addObject:({
  1434. EffectInfo *v = [EffectInfo new];
  1435. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray2Object14", nil);
  1436. v.icon = [UIImage imageNamed:@"fennen"];
  1437. v.selectIcon = [UIImage imageNamed:@"orginal_select"];
  1438. v;
  1439. })];
  1440. [effectArray addObject:({
  1441. EffectInfo *v = [EffectInfo new];
  1442. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray2Object15", nil);
  1443. v.icon = [UIImage imageNamed:@"huaijiu"];
  1444. v.selectIcon = [UIImage imageNamed:@"orginal_select"];
  1445. v;
  1446. })];
  1447. [effectArray addObject:({
  1448. EffectInfo *v = [EffectInfo new];
  1449. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray2Object16", nil);
  1450. v.icon = [UIImage imageNamed:@"landiao"];
  1451. v.selectIcon = [UIImage imageNamed:@"orginal_select"];
  1452. v;
  1453. })];
  1454. [effectArray addObject:({
  1455. EffectInfo *v = [EffectInfo new];
  1456. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray2Object17", nil);
  1457. v.icon = [UIImage imageNamed:@"qingliang"];
  1458. v.selectIcon = [UIImage imageNamed:@"orginal_select"];
  1459. v;
  1460. })];
  1461. [effectArray addObject:({
  1462. EffectInfo *v = [EffectInfo new];
  1463. v.name = NSLocalizedString(@"TCVideoEditView.EffectArray2Object18", nil);
  1464. v.icon = [UIImage imageNamed:@"rixi"];
  1465. v.selectIcon = [UIImage imageNamed:@"orginal_select"];
  1466. v;
  1467. })];
  1468. [_effectSelectView setEffectList:effectArray];
  1469. _effectSelectType = EffectSelectType_Filter;
  1470. _effectSelectView.selectedIndex = _filterIndex;
  1471. [_videoCutView setColorType:ColorType_Filter];
  1472. [_videoCutView setCenterPanHidden:YES];
  1473. [self removeAllTextFieldFromSuperView];
  1474. [self removeAllPasterViewFromSuperView];
  1475. }
  1476. - (void)onPasterBtnClicked
  1477. {
  1478. _bottomBar.hidden = YES;
  1479. _deleteBtn.hidden = NO;
  1480. [self resetConfirmBtn];
  1481. [self resetVideoProgress];
  1482. [self onShowEffectView];
  1483. [self removeAllTextFieldFromSuperView];
  1484. [self setLeftPanFrame:0 rightPanFrame:0];
  1485. [_effectSelectView setEffectList:_pasterEffectArray];
  1486. [_videoCutView setColorType:ColorType_Paster];
  1487. [_videoCutView setCenterPanHidden:YES];
  1488. _effectSelectType = EffectSelectType_Paster;
  1489. }
  1490. - (void)onTextBtnClicked
  1491. {
  1492. _bottomBar.hidden = YES;
  1493. _deleteBtn.hidden = NO;
  1494. [self resetConfirmBtn];
  1495. [self resetVideoProgress];
  1496. [self onShowEffectView];
  1497. [self removeAllPasterViewFromSuperView];
  1498. [self setLeftPanFrame:0 rightPanFrame:0];
  1499. [_effectSelectView setEffectList:_textEffectArray];
  1500. [_videoCutView setColorType:ColorType_Text];
  1501. [_videoCutView setCenterPanHidden:YES];
  1502. _effectSelectType = EffectSelectType_Text;
  1503. }
  1504. #pragma mark EffectSelectViewDelegate
  1505. -(void)onEffectBtnBeginSelect:(UIButton *)btn
  1506. {
  1507. if (_effectSelectType != EffectSelectType_Effect) {
  1508. return;
  1509. }
  1510. _effectType = (TXEffectType)btn.tag;
  1511. UIColor *color = TXCVEFColorPaletteColorAtIndex(btn.tag);
  1512. [_videoCutView startColoration:color alpha:0.7];
  1513. [_ugcEdit startEffect:(TXEffectType)_effectType startTime:_playTime];
  1514. if (!_isReverse) {
  1515. [self startPlayFromTime:_playTime toTime:_duration];
  1516. }else{
  1517. [self startPlayFromTime:0 toTime:_playTime];
  1518. }
  1519. [self setPlayBtn:YES];
  1520. }
  1521. -(void)onEffectBtnEndSelect:(UIButton *)btn
  1522. {
  1523. if (_effectType != -1) {
  1524. [_videoCutView stopColoration];
  1525. [_ugcEdit stopEffect:_effectType endTime:_playTime];
  1526. [_ugcEdit pausePlay];
  1527. _effectType = -1;
  1528. [self setPlayBtn:NO];
  1529. }
  1530. }
  1531. -(void)onEffectBtnSelected:(UIButton *)btn
  1532. {
  1533. _effectSelectIndex = btn.tag;
  1534. switch (_effectSelectType) {
  1535. case EffectSelectType_Time:
  1536. {
  1537. switch (_effectSelectIndex) {
  1538. case 0:
  1539. [self onVideoTimeEffectsClear];
  1540. break;
  1541. case 1:
  1542. [self onVideoTimeEffectsBackPlay];
  1543. break;
  1544. case 2:
  1545. [self onVideoTimeEffectsRepeat];
  1546. break;
  1547. case 3:
  1548. [self onVideoTimeEffectsSpeed];
  1549. break;
  1550. default:
  1551. break;
  1552. }
  1553. _timeIndex = _effectSelectIndex;
  1554. }
  1555. break;
  1556. case EffectSelectType_Filter:
  1557. {
  1558. [self setFilter:_effectSelectIndex];
  1559. if (!_isPlay) {
  1560. [_ugcEdit resumePlay];
  1561. [self setPlayBtn:YES];
  1562. _isPlay = YES;
  1563. _isSeek = NO;
  1564. }
  1565. }
  1566. break;
  1567. case EffectSelectType_Paster:
  1568. {
  1569. [_ugcEdit pausePlay];
  1570. [self setPlayBtn:NO];
  1571. [self removeAllPasterViewFromSuperView];
  1572. if (_effectSelectIndex == _pasterEffectArray.count - 1) {
  1573. _pasterAddView.hidden = NO;
  1574. [_pasterAddView setPasterType:PasterType_Animate];
  1575. }else{
  1576. VideoPasterInfo* pasterInfo = _videoPasterInfoList[_effectSelectIndex];
  1577. [_videoPreview addSubview:pasterInfo.pasterView];
  1578. [self setLeftPanFrame:pasterInfo.startTime rightPanFrame:pasterInfo.endTime];
  1579. [_ugcEdit previewAtTime:pasterInfo.endTime];
  1580. }
  1581. }
  1582. break;
  1583. case EffectSelectType_Text:
  1584. {
  1585. [_ugcEdit pausePlay];
  1586. [self setPlayBtn:NO];
  1587. [self removeAllTextFieldFromSuperView];
  1588. if (_effectSelectIndex == _textEffectArray.count - 1) {
  1589. _pasterAddView.hidden = NO;
  1590. [_pasterAddView setPasterType:PasterType_Qipao];
  1591. }else{
  1592. VideoTextInfo* textInfo = _videoTextInfoList[_effectSelectIndex];
  1593. [_videoPreview addSubview:textInfo.textField];
  1594. [self setLeftPanFrame:textInfo.startTime rightPanFrame:textInfo.endTime];
  1595. [_ugcEdit previewAtTime:textInfo.endTime];
  1596. }
  1597. }
  1598. break;
  1599. default:
  1600. break;
  1601. }
  1602. }
  1603. - (void)onVideoTimeEffectsClear
  1604. {
  1605. _timeType = TimeType_Clear;
  1606. _isReverse = NO;
  1607. [_ugcEdit setReverse:_isReverse];
  1608. [_ugcEdit setRepeatPlay:nil];
  1609. [_ugcEdit setSpeedList:nil];
  1610. [self startPlayFromTime:0 toTime:_duration];
  1611. [self setPlayBtn:YES];
  1612. [_videoCutView setCenterPanHidden:YES];
  1613. }
  1614. - (void)onVideoTimeEffectsBackPlay
  1615. {
  1616. _timeType = TimeType_Back;
  1617. _isReverse = YES;
  1618. [_ugcEdit setReverse:_isReverse];
  1619. [_ugcEdit setRepeatPlay:nil];
  1620. [_ugcEdit setSpeedList:nil];
  1621. [self startPlayFromTime:0 toTime:_duration];
  1622. [self setPlayBtn:YES];
  1623. [_videoCutView setCenterPanHidden:YES];
  1624. }
  1625. - (void)onVideoTimeEffectsRepeat
  1626. {
  1627. _timeType = TimeType_Repeat;
  1628. _isReverse = NO;
  1629. [_ugcEdit setReverse:_isReverse];
  1630. [_ugcEdit setSpeedList:nil];
  1631. TXRepeat *repeat = [[TXRepeat alloc] init];
  1632. repeat.startTime = _duration / 5;
  1633. repeat.endTime = repeat.startTime + 0.5;
  1634. repeat.repeatTimes = 3;
  1635. [_ugcEdit setRepeatPlay:@[repeat]];
  1636. [self startPlayFromTime:0 toTime:_duration];
  1637. [self setPlayBtn:YES];
  1638. [_videoCutView setCenterPanHidden:NO];
  1639. [_videoCutView setCenterPanFrame:repeat.startTime];
  1640. }
  1641. - (void)onVideoTimeEffectsSpeed
  1642. {
  1643. _timeType = TimeType_Speed;
  1644. _isReverse = NO;
  1645. [_ugcEdit setReverse:_isReverse];
  1646. [_ugcEdit setRepeatPlay:nil];
  1647. TXSpeed *speed1 =[[TXSpeed alloc] init];
  1648. speed1.startTime = _duration* 1.5 / 5;
  1649. speed1.endTime = speed1.startTime + 0.5;
  1650. speed1.speedLevel = SPEED_LEVEL_SLOW;
  1651. TXSpeed *speed2 =[[TXSpeed alloc] init];
  1652. speed2.startTime = speed1.endTime;
  1653. speed2.endTime = speed2.startTime + 0.5;
  1654. speed2.speedLevel = SPEED_LEVEL_SLOWEST;
  1655. TXSpeed *speed3 =[[TXSpeed alloc] init];
  1656. speed3.startTime = speed2.endTime;
  1657. speed3.endTime = speed3.startTime + 0.5;
  1658. speed3.speedLevel = SPEED_LEVEL_SLOW;
  1659. [_ugcEdit setSpeedList:@[speed1,speed2,speed3]];
  1660. [self startPlayFromTime:0 toTime:_duration];
  1661. [self setPlayBtn:YES];
  1662. [_videoCutView setCenterPanHidden:NO];
  1663. [_videoCutView setCenterPanFrame:speed1.startTime];
  1664. }
  1665. #pragma mark PasterAddViewDelegate
  1666. - (void)onPasterQipaoSelect:(PasterQipaoInfo *)info
  1667. {
  1668. [self removeAllTextFieldFromSuperView];
  1669. int width = 170;
  1670. int height = info.height / info.width * width;
  1671. VideoTextFiled* videoTextField = [[VideoTextFiled alloc] initWithFrame:CGRectMake((_videoPreview.width - 170) / 2, (_videoPreview.height - 50) / 2, 170, 50)];
  1672. [videoTextField setTextBubbleImage:info.image textNormalizationFrame:CGRectMake(info.textLeft / info.width, info.textTop / info.height, (info.width - info.textLeft - info.textRight) / info.width, (info.height - info.textTop - info.textBottom) / info.height)];
  1673. videoTextField.frame = CGRectMake((_videoPreview.width - width) / 2, (_videoPreview.height - height) / 2, width, height);
  1674. videoTextField.delegate = self;
  1675. [_videoPreview addSubview:videoTextField];
  1676. CGFloat percent = _duration / 10.0;
  1677. CGFloat startTime = ([self getLastTextEndTime] == 0 ? 0 : [self getLastTextEndTime] + percent);
  1678. if (startTime > _duration) {
  1679. startTime = 0;
  1680. }
  1681. CGFloat endTime = startTime + percent;
  1682. if(endTime > _duration){
  1683. endTime = _duration;
  1684. }
  1685. VideoTextInfo* textInfo = [VideoTextInfo new];
  1686. textInfo.textField = videoTextField;
  1687. textInfo.startTime = startTime;
  1688. textInfo.endTime = endTime;
  1689. [_videoTextInfoList addObject:textInfo];
  1690. [_textEffectArray insertObject:({
  1691. EffectInfo * v= [EffectInfo new];
  1692. v.name = NSLocalizedString(@"TCVideoEditView.BubbleSubtitle", nil);
  1693. v.icon = info.iconImage;
  1694. v;
  1695. }) atIndex:_textEffectArray.count - 1];
  1696. [_effectSelectView setEffectList:_textEffectArray];
  1697. _effectSelectIndex = _textEffectArray.count - 2;
  1698. [self setLeftPanFrame:startTime rightPanFrame:endTime];
  1699. [_ugcEdit previewAtTime:endTime];
  1700. [_videoCutView startColoration:[UIColor redColor] alpha:0.7];
  1701. }
  1702. - (void)onPasterAnimateSelect:(PasterAnimateInfo *)info
  1703. {
  1704. [self removeAllPasterViewFromSuperView];
  1705. int width = 170;
  1706. int height = info.height / info.width * width;
  1707. VideoPasterView *pasterView = [[VideoPasterView alloc] initWithFrame:CGRectMake((_videoPreview.width - width) / 2, (_videoPreview.height - height) / 2, width, height)];
  1708. pasterView.delegate = self;
  1709. [pasterView setImageList:info.imageList imageDuration:info.duration];
  1710. [_videoPreview addSubview:pasterView];
  1711. CGFloat percent = _duration / 10.0;
  1712. CGFloat startTime = ([self getLastPasterEndTime] == 0 ? 0 : [self getLastPasterEndTime] + percent);
  1713. if (startTime > _duration) {
  1714. startTime = 0;
  1715. }
  1716. CGFloat endTime = startTime + percent;
  1717. if(endTime > _duration){
  1718. endTime = _duration;
  1719. }
  1720. VideoPasterInfo* pasterInfo = [[VideoPasterInfo alloc] init];
  1721. pasterInfo.pasterView = pasterView;
  1722. pasterInfo.pasterInfoType = PasterInfoType_Animate;
  1723. pasterInfo.path = info.path;
  1724. pasterInfo.iconImage = info.iconImage;
  1725. pasterInfo.startTime = startTime;
  1726. pasterInfo.endTime = endTime;
  1727. [_videoPasterInfoList addObject:pasterInfo];
  1728. [_pasterEffectArray insertObject:({
  1729. EffectInfo * v= [EffectInfo new];
  1730. v.name = NSLocalizedString(@"PasterAddView.PasterDynamic", nil);
  1731. v.icon = info.iconImage;
  1732. v;
  1733. }) atIndex:_pasterEffectArray.count - 1];
  1734. [_effectSelectView setEffectList:_pasterEffectArray];
  1735. _effectSelectIndex = _pasterEffectArray.count - 2;
  1736. [self setLeftPanFrame:startTime rightPanFrame:endTime];
  1737. [_ugcEdit previewAtTime:endTime];
  1738. [_videoCutView startColoration:[UIColor redColor] alpha:0.7];
  1739. }
  1740. - (void)onPasterStaticSelect:(PasterStaticInfo *)info
  1741. {
  1742. [self removeAllPasterViewFromSuperView];
  1743. int width = 170;
  1744. int height = info.height / info.width * width;
  1745. VideoPasterView *pasterView = [[VideoPasterView alloc] initWithFrame:CGRectMake((_videoPreview.width - width) / 2, (_videoPreview.height - height) / 2, width, height)];
  1746. pasterView.delegate = self;
  1747. [pasterView setImageList:@[info.image] imageDuration:0];
  1748. [_videoPreview addSubview:pasterView];
  1749. CGFloat percent = _duration / 10.0;
  1750. CGFloat startTime = ([self getLastPasterEndTime] == 0 ? 0 : [self getLastPasterEndTime] + percent);
  1751. if (startTime > _duration) {
  1752. startTime = 0;
  1753. }
  1754. CGFloat endTime = startTime + percent;
  1755. if(endTime > _duration){
  1756. endTime = _duration;
  1757. }
  1758. VideoPasterInfo* pasterInfo = [[VideoPasterInfo alloc] init];
  1759. pasterInfo.pasterView = pasterView;
  1760. pasterInfo.pasterInfoType = PasterInfoType_static;
  1761. pasterInfo.image = info.image;
  1762. pasterInfo.iconImage = info.iconImage;
  1763. pasterInfo.startTime = startTime;
  1764. pasterInfo.endTime = endTime;
  1765. [_videoPasterInfoList addObject:pasterInfo];
  1766. [_pasterEffectArray insertObject:({
  1767. EffectInfo * v= [EffectInfo new];
  1768. v.name = NSLocalizedString(@"PasterAddView.PasterStatic", nil);
  1769. v.icon = info.iconImage;
  1770. v;
  1771. }) atIndex:_pasterEffectArray.count - 1];
  1772. [_effectSelectView setEffectList:_pasterEffectArray];
  1773. _effectSelectIndex = _pasterEffectArray.count - 2;
  1774. [self setLeftPanFrame:startTime rightPanFrame:endTime];
  1775. [_ugcEdit previewAtTime:endTime];
  1776. [_videoCutView startColoration:[UIColor redColor] alpha:0.7];
  1777. }
  1778. #pragma mark VideoPasterViewDelegate
  1779. - (void)onPasterViewTap
  1780. {
  1781. }
  1782. - (void)onRemovePasterView:(VideoPasterView*)pasterView
  1783. {
  1784. [pasterView removeFromSuperview];
  1785. [self removeCurrentPasterInfo];
  1786. }
  1787. #pragma mark VideoTextFieldDelegate
  1788. - (void)onBubbleTap
  1789. {
  1790. }
  1791. - (void)onTextInputBegin
  1792. {
  1793. _effectConfirmBtn.enabled = NO;
  1794. }
  1795. - (void)onTextInputDone:(NSString*)text
  1796. {
  1797. _effectConfirmBtn.enabled = YES;
  1798. }
  1799. - (void)onRemoveTextField:(VideoTextFiled*)textField
  1800. {
  1801. [textField removeFromSuperview];
  1802. [self removeCurrentTextInfo];
  1803. }
  1804. #pragma mark - VideoCutViewDelegate
  1805. - (void)onVideoRangeTap:(CGFloat)tapTime
  1806. {
  1807. if (_effectSelectType == EffectSelectType_Paster) {
  1808. [self removeAllPasterViewFromSuperView];
  1809. for (VideoPasterInfo *info in _videoPasterInfoList) {
  1810. if (tapTime >= info.startTime && tapTime <= info.endTime) {
  1811. [_videoPreview addSubview:info.pasterView];
  1812. [self setPlayBtn:NO];
  1813. [_ugcEdit previewAtTime:info.startTime];
  1814. [self setLeftPanFrame:info.startTime rightPanFrame:info.endTime];
  1815. _effectSelectIndex = [_videoPasterInfoList indexOfObject:info];
  1816. break;
  1817. }
  1818. }
  1819. }
  1820. else if (_effectSelectType == EffectSelectType_Text) {
  1821. [self removeAllTextFieldFromSuperView];
  1822. for (VideoTextInfo *info in _videoTextInfoList) {
  1823. if (tapTime >= info.startTime && tapTime <= info.endTime) {
  1824. [_videoPreview addSubview:info.textField];
  1825. [self setPlayBtn:NO];
  1826. [_ugcEdit previewAtTime:info.startTime];
  1827. [self setLeftPanFrame:info.startTime rightPanFrame:info.endTime];
  1828. _effectSelectIndex = [_videoTextInfoList indexOfObject:info];
  1829. break;
  1830. }
  1831. }
  1832. }
  1833. }
  1834. - (void)onVideoRangeLeftChanged:(VideoRangeSlider *)sender
  1835. {
  1836. [self setPlayBtn:NO];
  1837. [_ugcEdit previewAtTime:sender.leftPos];
  1838. }
  1839. - (void)onVideoRangeLeftChangeEnded:(VideoRangeSlider *)sender
  1840. {
  1841. if (_effectSelectType == EffectSelectType_Paster) {
  1842. VideoPasterInfo *info = _videoPasterInfoList[_effectSelectIndex];
  1843. info.startTime = sender.leftPos;
  1844. }
  1845. else if (_effectSelectType == EffectSelectType_Text) {
  1846. VideoTextInfo *info = _videoTextInfoList[_effectSelectIndex];
  1847. info.startTime = sender.leftPos;
  1848. }
  1849. }
  1850. - (void)onVideoRangeRightChanged:(VideoRangeSlider *)sender
  1851. {
  1852. [self setPlayBtn:NO];
  1853. [_ugcEdit previewAtTime:sender.rightPos];
  1854. }
  1855. - (void)onVideoRangeRightChangeEnded:(VideoRangeSlider *)sender
  1856. {
  1857. if (_effectSelectType == EffectSelectType_Paster) {
  1858. VideoPasterInfo *info = _videoPasterInfoList[_effectSelectIndex];
  1859. info.endTime = sender.rightPos;
  1860. }
  1861. else if (_effectSelectType == EffectSelectType_Text) {
  1862. VideoTextInfo *info = _videoTextInfoList[_effectSelectIndex];
  1863. info.endTime = sender.rightPos;
  1864. }
  1865. }
  1866. - (void)onVideoRangeCenterChanged:(VideoRangeSlider*)sender
  1867. {
  1868. [self setPlayBtn:NO];
  1869. [_ugcEdit previewAtTime:sender.centerPos];
  1870. }
  1871. - (void)onVideoRangeCenterChangeEnded:(VideoRangeSlider*)sender;
  1872. {
  1873. if (_timeType == TimeType_Repeat) {
  1874. TXRepeat *repeat = [[TXRepeat alloc] init];
  1875. repeat.startTime = sender.centerPos;
  1876. repeat.endTime = sender.centerPos + 0.5;
  1877. repeat.repeatTimes = 3;
  1878. [_ugcEdit setRepeatPlay:@[repeat]];
  1879. [_ugcEdit setSpeedList:nil];
  1880. }
  1881. else if (_timeType == TimeType_Speed) {
  1882. TXSpeed *speed1 =[[TXSpeed alloc] init];
  1883. speed1.startTime = sender.centerPos;;
  1884. speed1.endTime = speed1.startTime + 0.5;
  1885. speed1.speedLevel = SPEED_LEVEL_SLOW;
  1886. TXSpeed *speed2 =[[TXSpeed alloc] init];
  1887. speed2.startTime = speed1.endTime;
  1888. speed2.endTime = speed2.startTime + 0.5;
  1889. speed2.speedLevel = SPEED_LEVEL_SLOWEST;
  1890. TXSpeed *speed3 =[[TXSpeed alloc] init];
  1891. speed3.startTime = speed2.endTime;
  1892. speed3.endTime = speed3.startTime + 0.5;
  1893. speed3.speedLevel = SPEED_LEVEL_SLOW;
  1894. [_ugcEdit setSpeedList:@[speed1,speed2,speed3]];
  1895. [_ugcEdit setRepeatPlay:nil];
  1896. }
  1897. if (_isReverse) {
  1898. [self startPlayFromTime:0 toTime:sender.centerPos + 1.5];
  1899. }else{
  1900. [self startPlayFromTime:sender.centerPos toTime:_duration];
  1901. }
  1902. [self setPlayBtn:YES];
  1903. }
  1904. - (void)onVideoSeekChange:(VideoRangeSlider *)sender seekToPos:(CGFloat)pos
  1905. {
  1906. _playTime = pos;
  1907. _timeLabel.text = [NSString stringWithFormat:@"%02d:%02d",(int)_playTime / 60 , (int)_playTime % 60];
  1908. [_ugcEdit previewAtTime:_playTime];
  1909. [self setPlayBtn:NO];
  1910. }
  1911. #pragma mark - TCFilterSettingViewDelegate
  1912. //美颜
  1913. - (void)onSetBeautyDepth:(float)beautyDepth WhiteningDepth:(float)whiteningDepth
  1914. {
  1915. [_ugcEdit setBeautyFilter:beautyDepth setWhiteningLevel:whiteningDepth];
  1916. }
  1917. #pragma mark TCBGMControllerListener
  1918. -(void) onBGMControllerPlay:(NSObject*) path
  1919. {
  1920. if (path == nil) {
  1921. _bottomBar.hidden = NO;
  1922. [self resetConfirmBtn];
  1923. [self startPlayFromTime:0 toTime:_duration];
  1924. [self setPlayBtn:YES];
  1925. return;
  1926. }else{
  1927. _BGMPath = path;
  1928. }
  1929. __weak __typeof(self) ws = self;
  1930. if([_BGMPath isKindOfClass:[NSString class]]){
  1931. _BGMDuration = [TXVideoInfoReader getVideoInfo:(NSString *)_BGMPath].duration;
  1932. [_ugcEdit setBGM:(NSString *)_BGMPath result:^(int result) {
  1933. if (result == 0) {
  1934. [ws setBGMStartTime:0 endTime:MAXFLOAT];
  1935. }
  1936. }];
  1937. }else{
  1938. _BGMDuration = [TXVideoInfoReader getVideoInfoWithAsset:(AVAsset *)_BGMPath].duration;
  1939. [_ugcEdit setBGMAsset:(AVAsset *)_BGMPath result:^(int result) {
  1940. if (result == 0) {
  1941. [ws setBGMStartTime:0 endTime:MAXFLOAT];
  1942. }
  1943. }];
  1944. }
  1945. }
  1946. - (void)setBGMStartTime:(CGFloat)startTime endTime:(CGFloat)endTime
  1947. {
  1948. if (!_BGMPath ) return;
  1949. if (endTime == MAXFLOAT) {
  1950. endTime = _BGMDuration;
  1951. }
  1952. dispatch_async(dispatch_get_main_queue(), ^{
  1953. [_ugcEdit setBGMStartTime:startTime endTime:endTime];
  1954. [_ugcEdit setBGMVolume:_BGMVolume];
  1955. [_ugcEdit setVideoVolume:_videoVolume];
  1956. [self startPlayFromTime:0 toTime:_duration];
  1957. [self setPlayBtn:YES];
  1958. _musicView.hidden = NO;
  1959. _bottomBar.hidden = YES;
  1960. [self resetConfirmBtn];
  1961. });
  1962. }
  1963. #pragma mark VideoRecordMusicViewDelegate
  1964. -(void)onBtnMusicSelected
  1965. {
  1966. [self resetVideoProgress];
  1967. // UINavigationController *nv = [[UINavigationController alloc] initWithRootViewController:_bgmListVC];
  1968. // [nv.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];
  1969. // nv.navigationBar.barTintColor = RGB(25, 29, 38);
  1970. // [self presentViewController:nv animated:YES completion:nil];
  1971. // [_bgmListVC loadBGMList];
  1972. [self presetTonew_bgmList];
  1973. }
  1974. -(void)onBtnMusicStoped
  1975. {
  1976. _BGMPath = nil;
  1977. [_ugcEdit setBGM:nil result:^(int result) {
  1978. }];
  1979. _musicView.hidden = YES;
  1980. _bottomBar.hidden = NO;
  1981. [self resetConfirmBtn];
  1982. [self startPlayFromTime:0 toTime:_duration];
  1983. }
  1984. -(void)onBGMValueChange:(CGFloat)percent
  1985. {
  1986. _BGMVolume = 1.0 * percent;
  1987. [_ugcEdit setBGMVolume:_BGMVolume];
  1988. }
  1989. -(void)onVoiceValueChange:(CGFloat)percent
  1990. {
  1991. _videoVolume = 1.0 * percent;
  1992. [_ugcEdit setVideoVolume:_videoVolume];
  1993. }
  1994. -(void)onBGMRangeChange:(CGFloat)startPercent endPercent:(CGFloat)endPercent
  1995. {
  1996. [self setBGMStartTime:_BGMDuration * startPercent endTime:_BGMDuration * endPercent];
  1997. }
  1998. #pragma mark UIAlertViewDelegate
  1999. - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
  2000. {
  2001. if (buttonIndex == 1) {
  2002. [self onHideEffectView];
  2003. [self clearEffect];
  2004. }
  2005. }
  2006. #pragma mark - Utils
  2007. - (void)checkVideoOutputPath
  2008. {
  2009. NSFileManager *manager = [[NSFileManager alloc] init];
  2010. if ([manager fileExistsAtPath:_videoOutputPath]) {
  2011. BOOL success = [manager removeItemAtPath:_videoOutputPath error:nil];
  2012. if (success) {
  2013. NSLog(@"Already exist. Removed!");
  2014. }
  2015. }
  2016. }
  2017. - (float) heightForString:(UITextView *)textView andWidth:(float)width{
  2018. CGSize sizeToFit = [textView sizeThatFits:CGSizeMake(width, MAXFLOAT)];
  2019. return sizeToFit.height;
  2020. }
  2021. - (void) toastTip:(NSString*)toastInfo
  2022. {
  2023. CGRect frameRC = [[UIScreen mainScreen] bounds];
  2024. frameRC.origin.y = frameRC.size.height - 110;
  2025. frameRC.size.height -= 110;
  2026. __block UITextView * toastView = [[UITextView alloc] init];
  2027. toastView.editable = NO;
  2028. toastView.selectable = NO;
  2029. frameRC.size.height = [self heightForString:toastView andWidth:frameRC.size.width];
  2030. toastView.frame = frameRC;
  2031. toastView.text = toastInfo;
  2032. toastView.backgroundColor = [UIColor whiteColor];
  2033. toastView.alpha = 0.5;
  2034. [self.view addSubview:toastView];
  2035. dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC);
  2036. dispatch_after(popTime, dispatch_get_main_queue(), ^(){
  2037. [toastView removeFromSuperview];
  2038. toastView = nil;
  2039. });
  2040. }
  2041. -(NSString *)getCoverPath:(UIImage *)coverImage
  2042. {
  2043. UIImage *image = coverImage;
  2044. if (image == nil) {
  2045. return nil;
  2046. }
  2047. NSString *coverPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"TXUGC"];
  2048. coverPath = [coverPath stringByAppendingPathComponent:[self getFileNameByTimeNow:@"TXUGC" fileType:@"jpg"]];
  2049. if (coverPath) {
  2050. // 保证目录存在
  2051. [[NSFileManager defaultManager] createDirectoryAtPath:[coverPath stringByDeletingLastPathComponent]
  2052. withIntermediateDirectories:YES
  2053. attributes:nil
  2054. error:nil];
  2055. [UIImageJPEGRepresentation(image, 1.0) writeToFile:coverPath atomically:YES];
  2056. }
  2057. return coverPath;
  2058. }
  2059. -(NSString *)getFileNameByTimeNow:(NSString *)type fileType:(NSString *)fileType {
  2060. NSTimeInterval now = [[NSDate date] timeIntervalSince1970];
  2061. NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
  2062. [formatter setDateFormat:@"yyyyMMdd_HHmmss"];
  2063. NSDate * NowDate = [NSDate dateWithTimeIntervalSince1970:now];
  2064. ;
  2065. NSString * timeStr = [formatter stringFromDate:NowDate];
  2066. NSString *fileName = ((fileType == nil) ||
  2067. (fileType.length == 0)
  2068. ) ? [NSString stringWithFormat:@"%@_%@",type,timeStr] : [NSString stringWithFormat:@"%@_%@.%@",type,timeStr,fileType];
  2069. return fileName;
  2070. }
  2071. - (BGOssManager *)ossmanger
  2072. {
  2073. if (!_ossmanger)
  2074. {
  2075. _ossmanger =[[BGOssManager alloc]initWithDelegate:self];
  2076. }
  2077. return _ossmanger;
  2078. }
  2079. - (void)uploadImageWithUrlStr:(NSString *)imageUrlStr withUploadStateCount:(int)stateCount
  2080. {
  2081. }
  2082. - (void)dealloc
  2083. {
  2084. [_videoPreview removeNotification];
  2085. _videoPreview = nil;
  2086. }
  2087. @end