ios 视频选择封面功能

合成 1.gif

起初看到这个功能我是拒绝的,之前做的视频上传都是获取特定的帧数当封面,没有刻意的去选择封面,但是需求已定,随后网上也找了下,没有类似的,于是乎就自己写了一个,有什么改进的地方可以互相交流,话不多说直接上代码了

1.打开相册,系统相册用的很顺手,所以一直就用系统的相册

//两个代理
@interface ViewController ()<UIImagePickerControllerDelegate, UINavigationControllerDelegate>

@property (weak, nonatomic) IBOutlet UIImageView *coverImageView;

@end
//代理方法
//打开相册
- (void)openImagePickerController:(UIImagePickerControllerSourceType)type
{
    if (![UIImagePickerController isSourceTypeAvailable:type]) return;

    UIImagePickerController *ipc = [[UIImagePickerController alloc] init];

    //视频最大时间
    ipc.videoMaximumDuration = 30;
    ipc.view.backgroundColor = [UIColor whiteColor];
    ipc.sourceType = type;
    ipc.delegate = self;
    //只打开视频
    ipc.mediaTypes = @[(NSString *)kUTTypeMovie];
    //视频上传质量
    ipc.videoQuality = UIImagePickerControllerQualityTypeHigh;
    [self presentViewController:ipc animated:YES completion:nil];
}


#pragma mark - UIImagePickerControllerDelegate
/**
 * 从UIImagePickerController选择完图片后就调用(拍照完毕或者选择相册图片完毕)
 */

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {

    CZHWeakSelf(self);

    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];

    if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) {
        //如果是视频
        NSURL *url = info[UIImagePickerControllerMediaURL];
        //计算相册视频时长
        NSDictionary *videoDic = [CZHTool getLocalVideoSizeAndTimeWithSourcePath:url.absoluteString];
        int videoTime = [[videoDic valueForKey:@"duration"] intValue];
      //视频限制的长度
        NSUInteger limitTime = 30;
        if (videoTime > limitTime) {
            [picker dismissViewControllerAnimated:YES completion:nil];
            return;
        }
        //把系统相册mov格式转换成mp4格式
        [CZHTool convertMovTypeIntoMp4TypeWithSourceUrl:url convertSuccess:^(NSURL *path) {
           CZHStrongSelf(self);
           [picker dismissViewControllerAnimated:YES completion:nil];
            //选择封面控制器
           CZHChooseCoverController *chooseCover = [[CZHChooseCoverController alloc] init];
            //本地路径
           chooseCover.videoPath = path;
            //选择封面的block,把封面image回调
           chooseCover.coverImageBlock = ^(UIImage *coverImage) {
                self.coverImageView.image = coverImage;

                //上传视频操作
                //[self changeWithUploadSource:path];
                //上传封面操作
                //[self uploadCoverWithImage:coverImage];
            };
            [self presentViewController:chooseCover animated:YES completion:nil];
        }];
    }
}

// 取消图片选择调用此方法
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    // dismiss UIImagePickerController
    [self dismissViewControllerAnimated:YES completion:nil];
}

2.选择封面控制器

//截取几张图片放在底部用作展示,我是用collectionview做展示
  AVURLAsset * asset = [AVURLAsset assetWithURL:self.videoPath];
    CMTime  time = [asset duration];
    self.timeValue = time.value;
    self.timeScale = time.timescale;
    if (time.value < 1) {
        [self dismissViewControllerAnimated:YES completion:nil];
        return;
    }

    NSDictionary *opts = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:AVURLAssetPreferPreciseDurationAndTimingKey];
    AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:self.videoPath options:opts];
    AVAssetImageGenerator *generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:urlAsset];
    generator.appliesPreferredTrackTransform = YES;
    //总帧数/展示的总数量
    long long baseCount = time.value / PHOTP_COUNT;
    //取出PHOTP_COUNT张图片,存放到数组,用于collectionview
    for (NSInteger i = 0 ; i < PHOTP_COUNT; i++) {

        NSError *error = nil;
        //每隔baseCount帧取一帧存起来,一共PHOTP_COUNT张
        CGImageRef img = [generator copyCGImageAtTime:CMTimeMake(i * baseCount, time.timescale) actualTime:NULL error:&error];
        {
            UIImage *image = [UIImage imageWithCGImage:img];

            [self.photoArrays addObject:image];
        }
    }
//把存的存的几张图片用collectionview展示出来
CGRect collectionViewF = CGRectMake(0,  CZH_ScaleHeight(461), ScreenWidth, CZH_ScaleHeight(62.5));
    UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:collectionViewF collectionViewLayout:layout];
    collectionView.dataSource = self;
    collectionView.backgroundColor = [UIColor clearColor];
    [collectionView registerClass:[CZHChooseCoverCell class] forCellWithReuseIdentifier:ID];
    [self.view addSubview:collectionView];
    self.collectionView  = collectionView;

    //在collectionview上面覆盖一个slider用于滑动选择图片
    UIImage *selected = [UIImage imageNamed:@"slider_select"];
    UIImage *deselected = [UIImage imageNamed:@"slider_deselect"];

    UISlider *slider = [[UISlider alloc] init];
    slider.frame = CGRectMake(0,  CZH_ScaleHeight(461), ScreenWidth, CZH_ScaleHeight(62.5));

    [slider setThumbImage:deselected forState:UIControlStateNormal];
    [slider setThumbImage:selected forState:UIControlStateHighlighted];
    //透明的图片
    UIImage *image = [CZHTool imageWithColor:[UIColor clearColor] size:CGSizeMake(1, 1)];

    [slider setMinimumTrackImage:image forState:UIControlStateNormal];
    [slider setMaximumTrackImage:image forState:UIControlStateNormal];

    slider.maximumValue = self.timeValue;
    slider.minimumValue = 0;
    [slider addTarget:self action:@selector(valueChange:) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:slider];

    //默认选取第一帧展示
    [self chooseWithTime:0];
//滑动slider的操作
- (void)valueChange:(UISlider *)sender {

    int timeValue = sender.value;

    [self chooseWithTime:timeValue];
}


- (void)chooseWithTime:(CMTimeValue)time {

    NSDictionary *opts = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:AVURLAssetPreferPreciseDurationAndTimingKey];
    AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:self.videoPath options:opts];
    AVAssetImageGenerator *generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:urlAsset];
    generator.appliesPreferredTrackTransform = YES;
    //    generator.maximumSize = CGSizeMake(ScreenWidth, ScreenHeight);


    NSError *error = nil;
    CGImageRef img = [generator copyCGImageAtTime:CMTimeMake(time, self.timeScale) actualTime:NULL error:&error];
    {
        UIImage *image = [UIImage imageWithCGImage:img];

        self.imageView.image = image;
    }
}
//点击返回按钮和完成按钮的操作
- (void)buttonClick:(UIButton *)sender {
    if (sender.tag == CZHChooseCoverControllerButtonTypeBack) {
        [self dismissViewControllerAnimated:YES completion:nil];
    } else if (sender.tag == CZHChooseCoverControllerButtonTypeComplete) {
        //封面图片回调
        if (_coverImageBlock) {
            _coverImageBlock(self.imageView.image);
        }
        [self dismissViewControllerAnimated:YES completion:nil];
    }
}

ps.模拟器相册没有视频的话可以用下面代码把项目的视频保存到相册

NSMutableArray *videoArray = [NSMutableArray array];
//工程中类型是MP4的文件数组
NSArray *movs = [[NSBundle mainBundle] pathsForResourcesOfType:@"mp4" inDirectory:nil];
[videoArray addObjectsFromArray:movs];
for (id item in videoArray) {
//循环保存到相册
  if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(item)) {
     UISaveVideoAtPathToSavedPhotosAlbum(item, self, nil, NULL);
    }
}

demo下载链接

公司的项目.png

公司的项目,求支持,如果发现什么问题,可以留言反应,感激不尽

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 前端的uinapp是一种跨平台的移动应用开发框架,可以用于实现iOS视频剪辑功能。 要使用uinapp实现iOS视频剪辑,可以采用以下步骤: 1. 首先,需要使用uinapp框架的相关组件来构建界面,包括按钮、文本框、进度条等。可以使用调试工具将这些组件放置在合适的位置,并为它们添加相应的事件处理函数。 2. 接下来,需要在界面上添加视频选择功能。可以使用组件或者原生API来实现。用户可以通过点击按钮或者拖拽方式选择视频文件。 3. 一旦选择视频文件,需要先将视频文件上传到服务器进行处理。可以使用HTTP请求将视频文件发送到服务器,并在前端界面上显示上传的进度。 4. 上传完成后,服务器会返回一个视频处理的任务ID。前端需要通过定时轮询或者WebSocket等方式向服务器查询任务的状态。可以在界面上显示任务的进度,并提供取消任务的功能。 5. 当视频处理任务完成时,服务器会将处理后的视频文件发送回前端。前端可以将视频文件保存到本地,并在界面上显示视频封面和时长信息。 6. 最后,需要添加视频剪辑的功能。可以使用组件或者原生API来实现。用户可以通过拖拽方式选择需要剪辑的区域,并通过界面上的按钮来确认和保存剪辑结果。 综上所述,使用前端的uinapp框架可以实现iOS视频剪辑功能。通过界面的构建、视频选择、上传和处理、任务查询、视频剪辑等步骤,可以完成视频剪辑的操作,并在前端界面上显示相关信息和进度。 ### 回答2: 前端uinapp是一种开发工具,可用于实现iOS视频剪辑功能iOS视频剪辑的主要目标是允许用户在手机上编辑和修改视频内容,包括裁剪、旋转、添加滤镜和转场效果、调整音频等操作。 在前端uinapp中实现iOS视频剪辑可以按照以下步骤进行: 1. 创建界面:使用前端uinapp的界面组件,设计一个用户友好的界面,包括视频预览窗口、时间轴、编辑工具栏等。 2. 导入视频:提供用户导入视频功能,可以通过调用iOS原生接口,让用户选择要编辑的视频文件,并将其导入前端uinapp中。 3. 裁剪视频:允许用户在时间轴上选择起始和结束时间点,然后对视频进行裁剪。可以使用前端uinapp的视频处理组件,调整视频的播放范围,剔除不需要的部分。 4. 添加滤镜和转场效果:提供一系列滤镜和转场效果供用户选择,并应用到视频中。这可以通过调用您选择的滤镜和效果的API来实现。 5. 调整音频:允许用户对视频的音频进行调整,包括音量、混音等参数的调整。可以使用前端uinapp的音频处理组件,使用户能够更改视频的音频部分。 6. 预览和导出:在界面中提供预览功能,用户可以预览编辑后的视频,确保满足预期效果。一旦满意,用户可以选择导出编辑后的视频,可以使用iOS原生接口导出视频文件。 总结起来,前端uinapp可以通过界面设计、视频导入、裁剪、滤镜和效果应用、音频调整、预览和导出等功能,实现iOS视频剪辑的要求。通过这些步骤,用户可以自由地编辑和修改自己的视频内容,制作出满意的剪辑作品。 ### 回答3: 前端 UINAPP 是一种用于移动应用开发的前端框架,可以用于实现 iOS 视频剪辑功能。 首先,在 iOS 系统中,可以使用 AVFoundation 框架来处理视频和音频。我们可以通过 UINAPP 的前端界面来获取用户选择视频文件,并将其传递给后端进行处理。 在 UINAPP 中,可以使用 HTML5 的 video 元素来显示视频内容,并通过 JavaScript 控制视频播放。用户可以通过点击界面上的剪辑按钮选择视频的起始和结束时间,并通过 JavaScript 将剪辑的时间参数传递给后端。 接下来,后端可以使用 AVFoundation 框架来剪辑视频。通过 AVAsset 和 AVAssetExportSession 类,我们可以实现视频的剪辑和导出功能。根据前端传递的剪辑时间参数,可以使用 AVAsset 类的 timeRange 属性对视频进行裁剪,然后使用 AVAssetExportSession 类将裁剪后的视频导出为新的文件。 最后,后端可以将处理好的剪辑视频文件返回给前端,前端通过 UINAPP 的界面将剪辑后的视频显示给用户。 总结起来,前端 UINAPP 可以实现 iOS 视频剪辑功能的具体步骤如下: 1. 在前端界面中显示视频,并通过 JavaScript 控制视频播放。 2. 用户通过界面按钮选择视频的起始和结束时间。 3. 前端将选择的时间参数传递给后端。 4. 后端使用 AVFoundation 框架对视频进行剪辑。 5. 后端将剪辑后的视频返回给前端。 6. 前端通过 UINAPP 的界面将剪辑后的视频显示给用户。 通过这样的步骤,可以实现在前端 UINAPP 中实现 iOS 视频剪辑的功能

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值