UGCKitVideoCutView.m 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. // Copyright (c) 2019 Tencent. All rights reserved.
  2. #import "UGCKitVideoCutView.h"
  3. #import "UGCKitVideoRangeConst.h"
  4. #import "UGCKitVideoRangeSlider.h"
  5. #import "UGCKitColorMacro.h"
  6. #import "UGCKit_UIViewAdditions.h"
  7. #import "SDKHeader.h"
  8. #import <CoreImage/CoreImage.h>
  9. @interface UGCKitVideoCutView ()<VideoRangeSliderDelegate>
  10. @end
  11. @implementation UGCKitVideoCutView
  12. {
  13. CGFloat _duration; //视频时长
  14. NSString* _videoPath; //视频路径
  15. AVAsset* _videoAsset;
  16. BOOL _thumbnailRequestCancelled;
  17. }
  18. - (id)initWithFrame:(CGRect)frame videoPath:(NSString *)videoPath videoAsset:(AVAsset *)videoAsset config:(UGCKitRangeContentConfig *)config
  19. {
  20. if (self = [super initWithFrame:frame]) {
  21. _videoPath = videoPath;
  22. _videoAsset = videoAsset;
  23. if (videoAsset == nil) {
  24. _videoAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:videoPath]];
  25. }
  26. _videoRangeSlider = [[UGCKitVideoRangeSlider alloc] initWithFrame:self.bounds];
  27. [_videoRangeSlider setAppearanceConfig:config];
  28. [self addSubview:_videoRangeSlider];
  29. TXVideoInfo *videoMsg = [TXVideoInfoReader getVideoInfoWithAsset:_videoAsset];
  30. _duration = videoMsg.duration;
  31. _videoRangeSlider.fps = videoMsg.fps;
  32. //显示微缩图列表
  33. _imageList = [NSMutableArray new];
  34. int imageNum = (int)config.imageCount;
  35. _thumbnailRequestCancelled = NO;
  36. UIGraphicsBeginImageContext(CGSizeMake(1, 1));
  37. UIImage *placeholder = UIGraphicsGetImageFromCurrentImageContext();
  38. UIGraphicsEndImageContext();
  39. CGFloat size = round(frame.size.height * [UIScreen mainScreen].scale);
  40. [TXVideoInfoReader getSampleImages:imageNum maxSize:CGSizeMake(size, size) videoAsset:_videoAsset progress:^BOOL(int number, UIImage *image) {
  41. if (self->_thumbnailRequestCancelled) {
  42. return NO;
  43. }else{
  44. dispatch_async(dispatch_get_main_queue(), ^{@autoreleasepool {
  45. if (self->_thumbnailRequestCancelled) {
  46. return;
  47. }
  48. UIImage *img = image ?: placeholder;
  49. if (number == 1) {
  50. self->_videoRangeSlider.delegate = self;
  51. for (int i = 0; i < imageNum; i++) {
  52. [self->_imageList addObject:img];
  53. }
  54. [self->_videoRangeSlider setImageList:self->_imageList];
  55. [self->_videoRangeSlider setDurationMs:self->_duration];
  56. } else {
  57. self->_imageList[number-1] = img;
  58. [self->_videoRangeSlider updateImage:img atIndex:number-1];
  59. }
  60. }});
  61. return YES;
  62. }
  63. }];
  64. }
  65. return self;
  66. }
  67. - (id)initWithFrame:(CGRect)frame pictureList:(NSArray *)pictureList duration:(CGFloat)duration fps:(float)fps config:(UGCKitRangeContentConfig *)config
  68. {
  69. if (self = [super initWithFrame:frame]) {
  70. _duration = duration;
  71. _imageList = [pictureList mutableCopy];
  72. _videoRangeSlider = [[UGCKitVideoRangeSlider alloc] initWithFrame:self.bounds];
  73. [_videoRangeSlider setAppearanceConfig:config];
  74. _videoRangeSlider.fps = fps;
  75. [self addSubview:_videoRangeSlider];
  76. _videoRangeSlider.delegate = self;
  77. [_videoRangeSlider setImageList:_imageList];
  78. [_videoRangeSlider setDurationMs:_duration];
  79. }
  80. return self;
  81. }
  82. - (void)updateFrame:(CGFloat)duration
  83. {
  84. }
  85. - (void)stopGetImageList
  86. {
  87. _thumbnailRequestCancelled = YES;
  88. }
  89. - (void)layoutSubviews
  90. {
  91. [super layoutSubviews];
  92. }
  93. - (void)dealloc
  94. {
  95. NSLog(@"VideoCutView dealloc");
  96. }
  97. - (void)setPlayTime:(CGFloat)time
  98. {
  99. _videoRangeSlider.currentPos = time;
  100. }
  101. - (void)setLeftPanHidden:(BOOL)isHidden
  102. {
  103. [_videoRangeSlider setLeftPanHidden:isHidden];
  104. }
  105. - (void)setCenterPanHidden:(BOOL)isHidden
  106. {
  107. [_videoRangeSlider setCenterPanHidden:isHidden];
  108. }
  109. - (void)setRightPanHidden:(BOOL)isHidden
  110. {
  111. [_videoRangeSlider setRightPanHidden:isHidden];
  112. }
  113. - (void)setLeftPanFrame:(CGFloat)time
  114. {
  115. [_videoRangeSlider setLeftPanFrame:time];
  116. }
  117. - (void)setCenterPanFrame:(CGFloat)time
  118. {
  119. [_videoRangeSlider setCenterPanFrame:time];
  120. }
  121. - (void)setRightPanFrame:(CGFloat)time
  122. {
  123. [_videoRangeSlider setRightPanFrame:time];
  124. }
  125. - (void)setColorType:(UGCKitRangeColorType)UGCKitRangeColorType
  126. {
  127. [_videoRangeSlider setColorType:UGCKitRangeColorType];
  128. }
  129. - (void)startColoration:(UIColor *)color alpha:(CGFloat)alpha
  130. {
  131. [_videoRangeSlider startColoration:color alpha:alpha];
  132. }
  133. - (void)stopColoration
  134. {
  135. [_videoRangeSlider stopColoration];
  136. }
  137. - (UGCKitVideoColorInfo *)removeLastColoration:(UGCKitRangeColorType)UGCKitRangeColorType
  138. {
  139. return [_videoRangeSlider removeLastColoration:UGCKitRangeColorType];
  140. }
  141. - (void)removeColoration:(UGCKitRangeColorType)UGCKitRangeColorType index:(NSInteger)index
  142. {
  143. [_videoRangeSlider removeColoration:UGCKitRangeColorType index:index];
  144. }
  145. #pragma mark - VideoRangeDelegate
  146. - (void)onVideoRangeTap:(CGFloat)tapTime
  147. {
  148. if(self.delegate && [self.delegate respondsToSelector:@selector(onVideoRangeTap:)]){
  149. [self.delegate onVideoRangeTap:tapTime];
  150. }
  151. }
  152. //左拉
  153. - (void)onVideoRangeLeftChanged:(UGCKitVideoRangeSlider *)sender
  154. {
  155. if(self.delegate && [self.delegate respondsToSelector:@selector(onVideoRangeLeftChanged:)]){
  156. [self.delegate onVideoRangeLeftChanged:sender];
  157. }
  158. }
  159. - (void)onVideoRangeLeftChangeEnded:(UGCKitVideoRangeSlider *)sender
  160. {
  161. if(self.delegate && [self.delegate respondsToSelector:@selector(onVideoRangeLeftChangeEnded:)]){
  162. _videoRangeSlider.currentPos = sender.leftPos;
  163. [self.delegate onVideoRangeLeftChangeEnded:sender];
  164. }
  165. }
  166. //中拉
  167. - (void)onVideoRangeCenterChanged:(UGCKitVideoRangeSlider *)sender
  168. {
  169. if(self.delegate && [self.delegate respondsToSelector:@selector(onVideoRangeCenterChanged:)]){
  170. [self.delegate onVideoRangeCenterChanged:sender];
  171. }
  172. }
  173. - (void)onVideoRangeCenterChangeEnded:(UGCKitVideoRangeSlider *)sender
  174. {
  175. if(self.delegate && [self.delegate respondsToSelector:@selector(onVideoRangeCenterChangeEnded:)]){
  176. [self.delegate onVideoRangeCenterChangeEnded:sender];
  177. }
  178. }
  179. //右拉
  180. - (void)onVideoRangeRightChanged:(UGCKitVideoRangeSlider *)sender {
  181. if(self.delegate && [self.delegate respondsToSelector:@selector(onVideoRangeRightChanged:)]){
  182. [self.delegate onVideoRangeRightChanged:sender];
  183. }
  184. }
  185. - (void)onVideoRangeRightChangeEnded:(UGCKitVideoRangeSlider *)sender
  186. {
  187. if(self.delegate && [self.delegate respondsToSelector:@selector(onVideoRangeRightChangeEnded:)]){
  188. _videoRangeSlider.currentPos = sender.leftPos;
  189. [self.delegate onVideoRangeRightChangeEnded:sender];
  190. }
  191. }
  192. - (void)onVideoRangeLeftAndRightChanged:(UGCKitVideoRangeSlider *)sender {
  193. }
  194. //拖动缩略图条
  195. - (void)onVideoRange:(UGCKitVideoRangeSlider *)sender seekToPos:(CGFloat)pos {
  196. if(self.delegate && [self.delegate respondsToSelector:@selector(onVideoSeekChange:seekToPos:)]){
  197. [self.delegate onVideoSeekChange:sender seekToPos:pos];
  198. }
  199. }
  200. @end