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*36
    UIGraphicsBeginImageContextWithOptions(itemSize, NO, 0.0);//*1
    CGRect 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;

        //UIImagePickerControllerSourceTypeSavedPhotosAlbum

        NSArray *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>url
    NSString *str1 = [localurltemp absoluteString];//url>string
    NSString * 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*50
    UIGraphicsBeginImageContextWithOptions(itemSize, NO, 0.0);//*1
    CGRect 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();//*2
    UIGraphicsEndImageContext();//*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;

        //UIImagePickerControllerSourceTypeSavedPhotosAlbum

        NSArray *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或者使用的难度,有些时候回归系统自带的库可能更容易解决问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值