IOS之Tok Tik(部分实现)

2023-10-18 14:50
文章标签 实现 ios 部分 tik tok

本文主要是介绍IOS之Tok Tik(部分实现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

IOS之Tok Tik

  • 个人贡献
  • 代码与截图
    • 发布广场
    • 选取视频
    • 视频编辑
  • 问题与解决方法
    • 问题
    • 解决方法
  • 个人总结
  • 思想感悟

个人贡献

完成发布广场页面,实现视频的选取、编辑(裁剪、加速、放慢)、以及需求分析与设计文档

代码与截图

发布广场

- (void)viewDidLoad {[super viewDidLoad];_videoBox = [WAVideoBox new];_finalvideo = [[NSString alloc] init];_finalpic = [[NSString alloc] init];_finaltitle = [[NSString alloc] init];_finalimage = [[UIImage alloc] init];_rate = 1;self.view.backgroundColor = [UIColor colorWithRed:242.0/255 green:242.0/255 blue:247.0/255 alpha:1];self.title = @"发布广场";UIBarButtonItem *rightBarItem = [[UIBarButtonItem alloc] initWithTitle:@"发布" style:UIBarButtonItemStylePlain target:self action:@selector(onClickedOKbtn)];self.navigationItem.rightBarButtonItem = rightBarItem;//NSLog(@"%@",_videoPath);self.edgesForExtendedLayout = UIRectEdgeBottom;_Titile = [[UITextField alloc] init];[self.view addSubview:_Titile];[_Titile mas_makeConstraints:^(MASConstraintMaker *make) {make.top.equalTo(self.view.mas_top).with.offset(self.view.frame.size.width*0.1);make.centerX.equalTo(self.view);make.width.equalTo(self.view.mas_width).multipliedBy(0.8);make.height.equalTo(self.view.mas_width).multipliedBy(0.12);}];[_Titile setFont:[UIFont systemFontOfSize:25]];_Titile.placeholder = @"请输入标题";_Titile.layer.borderColor = [[UIColor blackColor] CGColor];_Titile.layer.borderWidth = 1;_Titile.layer.cornerRadius = 5;_Titile.textAlignment = NSTextAlignmentCenter;_add = [UIButton buttonWithType:UIButtonTypeRoundedRect];[self.view addSubview:_add];[_add mas_makeConstraints:^(MASConstraintMaker *make) {make.top.equalTo(_Titile.mas_bottom).with.offset(self.view.frame.size.width*0.03);make.centerX.equalTo(self.view);make.width.equalTo(self.view.mas_width).multipliedBy(0.3);make.height.equalTo(self.view.mas_width).multipliedBy(0.1);}];[_add setTitle:@"上传视频" forState:UIControlStateNormal];[_add addTarget:self action:@selector(clickpicView:) forControlEvents:UIControlEventTouchUpInside];//    [_add setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];_add.titleLabel.font = [UIFont systemFontOfSize:15];//    _add.layer.borderColor = [[UIColor blackColor] CGColor];//    _add.layer.borderWidth = 1;_imageView = [[UIImageView alloc] init];[self.view addSubview:_imageView];[_imageView mas_makeConstraints:^(MASConstraintMaker *make) {make.width.equalTo(self.view.mas_width).with.offset(-10);make.height.equalTo(self.view.mas_width).with.offset(-10);make.top.equalTo(_add.mas_bottom).with.offset(self.view.frame.size.width*0.05);make.centerX.equalTo(self.view);}];// _imageView.layer.borderColor = [[UIColor blackColor] CGColor];// _imageView.layer.borderWidth = 1;_back = [[UIImageView alloc] init];[self.view addSubview:_back];[_back mas_makeConstraints:^(MASConstraintMaker *make) {make.width.equalTo(self.view.mas_width).multipliedBy(0.95);make.height.equalTo(self.view.mas_height).multipliedBy(0.78);make.top.equalTo(_add.mas_bottom).with.offset(self.view.frame.size.width*0.03);make.centerX.equalTo(self.view);}];//    _back.layer.borderColor = [[UIColor blackColor] CGColor];//    _back.layer.borderWidth = 1;_cut = [UIButton buttonWithType:UIButtonTypeRoundedRect];[self.view addSubview:_cut];[_cut mas_makeConstraints:^(MASConstraintMaker *make) {make.top.equalTo(_imageView.mas_bottom).with.offset(self.view.frame.size.width*0.1);make.left.equalTo(self.view.mas_left).with.offset(self.view.frame.size.width*0.1);make.width.equalTo(self.view.mas_width).multipliedBy(0.18);make.height.equalTo(self.view.mas_width).multipliedBy(0.11);}];_back.image = [UIImage imageNamed:@"3"];[_cut addTarget:self action:@selector(rangeVideo:) forControlEvents:UIControlEventTouchUpInside];_cut.titleLabel.font = [UIFont systemFontOfSize:20];_cut.layer.cornerRadius = 5;_s = [[UITextField alloc] init];_e = [[UITextField alloc] init];[self.view addSubview:_s];[self.view addSubview:_e];[_s mas_makeConstraints:^(MASConstraintMaker *make) {make.top.equalTo(_imageView.mas_bottom).with.offset(self.view.frame.size.width*0.1);make.left.equalTo(_cut.mas_right).with.offset(15);make.width.equalTo(self.view.mas_width).multipliedBy(0.08);make.height.equalTo(self.view.mas_width).multipliedBy(0.1);}];[_e mas_makeConstraints:^(MASConstraintMaker *make) {make.top.equalTo(_imageView.mas_bottom).with.offset(self.view.frame.size.width*0.1);make.left.equalTo(_s.mas_right).with.offset(30);make.width.equalTo(self.view.mas_width).multipliedBy(0.08);make.height.equalTo(self.view.mas_width).multipliedBy(0.1);}];_s.layer.backgroundColor = [[UIColor clearColor] CGColor];_e.layer.backgroundColor = [[UIColor clearColor] CGColor];_s.delegate = self;_e.delegate = self;_s.textAlignment = NSTextAlignmentRight;[_s setFont:[UIFont systemFontOfSize:25]];[_e setFont:[UIFont systemFontOfSize:25]];_dot = [[UILabel alloc] init];[self.view addSubview:_dot];[_dot mas_makeConstraints:^(MASConstraintMaker *make) {make.top.equalTo(_imageView.mas_bottom).with.offset(self.view.frame.size.width*0.1);make.left.equalTo(_s.mas_right).with.offset(0);make.width.mas_equalTo(30);make.height.equalTo(self.view.mas_width).multipliedBy(0.1);}];[_dot setFont:[UIFont fontWithName:@"Helvetica-Bold" size:22]];_dot.textAlignment = NSTextAlignmentCenter;_logo = [[UIImageView alloc] init];[self.view addSubview:_logo];[_logo mas_makeConstraints:^(MASConstraintMaker *make) {make.width.mas_equalTo(100);make.height.mas_equalTo(100);make.top.equalTo(_imageView.mas_bottom).with.offset(self.view.frame.size.width*0.05);make.left.equalTo(self.view.mas_left).with.offset(self.view.frame.size.width*0.7);}];UIImage * icon = [UIImage imageNamed:@"1"];CGSize itemSize = CGSizeMake(100, 100);//固定图片大小为36*36UIGraphicsBeginImageContextWithOptions(itemSize, NO, 0.0);//*1CGRect imageRect = CGRectMake(0, 0, itemSize.width, itemSize.height);[icon drawInRect:imageRect];_fast = [UIButton buttonWithType:UIButtonTypeRoundedRect];[self.view addSubview:_fast];[_fast mas_makeConstraints:^(MASConstraintMaker *make) {make.top.equalTo(_cut.mas_bottom).with.offset(self.view.frame.size.width*0.1);make.left.equalTo(self.view.mas_left).with.offset(self.view.frame.size.width*0.1);make.width.equalTo(self.view.mas_width).multipliedBy(0.18);make.height.equalTo(self.view.mas_width).multipliedBy(0.11);}];[_fast addTarget:self action:@selector(gearVideo:) forControlEvents:UIControlEventTouchUpInside];_fast.titleLabel.font = [UIFont systemFontOfSize:20];_fast.layer.cornerRadius = 5;_slow = [UIButton buttonWithType:UIButtonTypeRoundedRect];[self.view addSubview:_slow];[_slow mas_makeConstraints:^(MASConstraintMaker *make) {make.top.equalTo(_cut.mas_bottom).with.offset(self.view.frame.size.width*0.1);make.left.equalTo(_fast.mas_right).with.offset(self.view.frame.size.width*0.1);make.width.equalTo(self.view.mas_width).multipliedBy(0.18);make.height.equalTo(self.view.mas_width).multipliedBy(0.11);}];[_slow addTarget:self action:@selector(slowVideo:) forControlEvents:UIControlEventTouchUpInside];_slow.titleLabel.font = [UIFont systemFontOfSize:20];_slow.layer.cornerRadius = 5;_v = [[UILabel alloc] init];[self.view addSubview:_v];[_v mas_makeConstraints:^(MASConstraintMaker *make) {make.top.equalTo(_cut.mas_bottom).with.offset(self.view.frame.size.width*0.1);make.left.equalTo(_slow.mas_right).with.offset(self.view.frame.size.width*0.1);make.width.equalTo(self.view.mas_width).multipliedBy(0.2);make.height.equalTo(self.view.mas_width).multipliedBy(0.1);}];_v.layer.backgroundColor = [[UIColor clearColor] CGColor];[_v setFont:[UIFont systemFontOfSize:25]];//    _combine = [UIButton buttonWithType:UIButtonTypeRoundedRect];
//    [self.view addSubview:_combine];
//    [_combine mas_makeConstraints:^(MASConstraintMaker *make) {
//        make.top.equalTo(_cut.mas_bottom).with.offset(self.view.frame.size.width*0.1);
//        make.left.equalTo(self.view.mas_left).with.offset(self.view.frame.size.width*0.1);
//        make.width.equalTo(self.view.mas_width).multipliedBy(0.1);
//        make.height.equalTo(self.view.mas_width).multipliedBy(0.1);
//    }];
//    [_combine setTitle:@"拼接" forState:UIControlStateNormal];
//    [_combine addTarget:self action:@selector(gearVideo:) forControlEvents:UIControlEventTouchUpInside];
//    _combine.titleLabel.font = [UIFont systemFontOfSize:20];}

在这里插入图片描述
在这里插入图片描述

选取视频

-(void)clickpicView:(UIButton *)btn
{UIImagePickerController * picker = [[UIImagePickerController alloc]init];NSString *requiredMediaType1 = ( NSString *)kUTTypeMovie;picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;//UIImagePickerControllerSourceTypeSavedPhotosAlbumNSArray *arrMediaTypes=[NSArray arrayWithObjects:requiredMediaType1,nil];[picker setMediaTypes: arrMediaTypes];picker.delegate = self;
[self presentViewController:picker animated:YES completion:nil];}- (void)pickerControllerDidCancel:(DLPhotoPickerViewController *)picker
{[self dismissViewControllerAnimated:YES completion:nil];
}-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{[picker dismissViewControllerAnimated:YES completion:nil];//info中就是包含你在相册里面选择的图片NSURL * localurltemp = info[@"UIImagePickerControllerMediaURL"];//NSURL *URL = [NSURL URLWithString:localurltemp];  /ring>urlNSString *str1 = [localurltemp absoluteString];//url>stringNSString * str2 = [str1 substringFromIndex:7];_videoPath = str2;_finalvideo = str2;NSURL * temp2 = [[NSURL alloc] initWithString:str2];//拿到图片会就销毁之前的控制器NSTimeInterval t = (NSTimeInterval)1;UIImage *icon = [self thumbnailImageForVideo:localurltemp atTime:(t)];_finalimage = icon;CGSize itemSize = CGSizeMake(self.view.frame.size.width-10, self.view.frame.size.width-10);//固定图片大小为50*50UIGraphicsBeginImageContextWithOptions(itemSize, NO, 0.0);//*1CGRect imageRect = CGRectMake(0, 0, itemSize.width, itemSize.height);[icon drawInRect:imageRect];_imageView.image = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();_size = [self getVideoInfoWithSourcePath:_videoPath];NSString *tem = [NSString stringWithFormat:@"%@",_size[@"duration"]];_s.text = @"0";_e.text = tem;_dot.text = @":";NSString *str = [NSString stringWithFormat:@" X%.1f",_rate];_v.text = str;_logo.image = UIGraphicsGetImageFromCurrentImageContext();//*2UIGraphicsEndImageContext();//*3[_cut setTitle:@"裁剪" forState:UIControlStateNormal];_cut.layer.borderWidth = 1;_cut.layer.borderColor = [[UIColor grayColor] CGColor];[_fast setTitle:@"加速" forState:UIControlStateNormal];_fast.layer.borderWidth = 1;_fast.layer.borderColor = [[UIColor grayColor] CGColor];[_slow setTitle:@"减速" forState:UIControlStateNormal];_slow.layer.borderWidth = 1;_slow.layer.borderColor = [[UIColor grayColor] CGColor];_back.image = [UIImage imageNamed:@""];}

在这里插入图片描述

视频编辑

创建编辑后视频的存储路径

-(NSString *)buildFilePath{return [NSTemporaryDirectory() stringByAppendingString:[NSString stringWithFormat:@"%f.mp4", [[NSDate date] timeIntervalSinceReferenceDate]]];
}
- (void)goToPlayVideoByFilePath:(NSString *)filePath{PlayViewController *playVc = [PlayViewController new];[playVc loadWithFilePath:filePath];[self.navigationController pushViewController:playVc animated:YES];
}

视频裁剪

- (IBAction)rangeVideo:(id)sender {[_videoBox clean];NSString *filePath = [self buildFilePath];__weak typeof(self) wself = self;
//    NSLog(@"%@",_videoPath);[_videoBox appendVideoByPath:_videoPath];int64_t ss = [_s.text intValue];int64_t ee = [_e.text intValue];[_videoBox rangeVideoByTimeRange:CMTimeRangeMake(CMTimeMake(ss*60, 60), CMTimeMake(ee*60, 60))];[_videoBox gearBoxWithScale:_rate];[_videoBox asyncFinishEditByFilePath:filePath complete:^(NSError *error) {if (!error) {[wself goToPlayVideoByFilePath:filePath];}}];_Path = filePath;
}

在这里插入图片描述
视频加速

- (IBAction)gearVideo:(id)sender {_rate += 0.5;
//    NSLog(@"%f",_rate);NSString *str = [NSString stringWithFormat:@" X%.1f",_rate];_v.text = str;[_videoBox clean];NSString *filePath = [self buildFilePath];__weak typeof(self) wself = self;[_videoBox appendVideoByPath:_videoPath];int64_t ss = [_s.text intValue];int64_t ee = [_e.text intValue];[_videoBox rangeVideoByTimeRange:CMTimeRangeMake(CMTimeMake(ss*60, 60), CMTimeMake(ee*60, 60))];[_videoBox gearBoxWithScale:_rate];[_videoBox asyncFinishEditByFilePath:filePath complete:^(NSError *error) {if (!error) {[wself goToPlayVideoByFilePath:filePath];}}];_Path = filePath;
}

视频放慢

- (IBAction)slowVideo:(id)sender {_rate -= 0.5;
//    NSLog(@"%f",_rate);NSString *str = [NSString stringWithFormat:@" X%.1f",_rate];_v.text = str;[_videoBox clean];NSString *filePath = [self buildFilePath];__weak typeof(self) wself = self;[_videoBox appendVideoByPath:_videoPath];int64_t ss = [_s.text intValue];int64_t ee = [_e.text intValue];[_videoBox rangeVideoByTimeRange:CMTimeRangeMake(CMTimeMake(ss*60, 60), CMTimeMake(ee*60, 60))];[_videoBox gearBoxWithScale:_rate];[_videoBox asyncFinishEditByFilePath:filePath complete:^(NSError *error) {if (!error) {[wself goToPlayVideoByFilePath:filePath];}}];_Path = filePath;
}

获取视频的长度

- (NSDictionary *)getVideoInfoWithSourcePath:(NSString *)path{AVURLAsset * asset = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:path]];CMTime   time = [asset duration];int seconds = ceil(time.value/time.timescale);NSInteger   fileSize = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil].fileSize;return @{@"size" : @(fileSize),@"duration" : @(seconds)};
}

在这里插入图片描述

问题与解决方法

问题

  1. 使用DLPhotoPicker库时不能得到选取视频的地址
  2. 选取视频后的封面选取

解决方法

  1. 使用IOS自带的系统相册库
    之前使用DLPhotoPicker库
-(void)buttonClicked:(id)sender{DLPhotoPickerViewController *picker = [[DLPhotoPickerViewController alloc] init];picker.delegate = self;picker.pickerType = DLPhotoPickerTypePicker;picker.navigationTitle = NSLocalizedString(@"相册", nil);[self presentViewController:picker animated:YES completion:nil];}

使用IOS自带的库

-(void)clickpicView:(UIButton *)btn
{UIImagePickerController * picker = [[UIImagePickerController alloc]init];NSString *requiredMediaType1 = ( NSString *)kUTTypeMovie;picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;//UIImagePickerControllerSourceTypeSavedPhotosAlbumNSArray *arrMediaTypes=[NSArray arrayWithObjects:requiredMediaType1,nil];[picker setMediaTypes: arrMediaTypes];picker.delegate = self;
[self presentViewController:picker animated:YES completion:nil];}
  1. 在选取的视频中选取一秒时候的图片作为封面
-(UIImage*) thumbnailImageForVideo:(NSURL *)videoURL atTime:(NSTimeInterval)time {AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];NSParameterAssert(asset);AVAssetImageGenerator *assetImageGenerator =[[AVAssetImageGenerator alloc] initWithAsset:asset];assetImageGenerator.appliesPreferredTrackTransform = YES;assetImageGenerator.apertureMode = AVAssetImageGeneratorApertureModeEncodedPixels;CGImageRef thumbnailImageRef = NULL;CFTimeInterval thumbnailImageTime = time;NSError *thumbnailImageGenerationError = nil;thumbnailImageRef = [assetImageGenerator copyCGImageAtTime:CMTimeMake(thumbnailImageTime, 60)actualTime:NULL error:&thumbnailImageGenerationError];if(!thumbnailImageRef)NSLog(@"thumbnailImageGenerationError %@",thumbnailImageGenerationError);UIImage*thumbnailImage = thumbnailImageRef ? [[UIImage alloc]initWithCGImage: thumbnailImageRef] : nil;return thumbnailImage;
}

个人总结

这次实验主要是完成视频的选取以及编辑,这让我对于IOS的视频运用更加了解和熟悉,特别是视频的编辑,虽然是引用了别人写好的库,但是在学习使用的过程中从源码中学到了很多,比如存储路径的创建、视频播放等。
个人贡献评分 90

思想感悟

这次遇到的最大问题是在使用DLPhotoPicker库时单个页面运行是可以的,但是当整个项目合起来时就不行了,不能获取选取视频的地址,在网上查找了很久都没有解决办法,最后只能运用系统的库。这告诉我们虽然第三方写的库可能更加方便,但是可能存在一些bug或者使用的难度,有些时候回归系统自带的库可能更容易解决问题。

这篇关于IOS之Tok Tik(部分实现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/233261

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too