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

相关文章

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核