ios视频的剪辑、拼接和导出拼接视频

写过一篇博客介绍过处理音视频文件时各个类的分工。现已经实现了一个集视频剪辑,视频拼接保存于一身的小程序。此片中有如何导出已编辑好的视频和相关类的介绍。

一、思路

1、我们从系统相册中获取到对应的视频信息,通过AssetsLibrary,保存对应视频的URL。

2、使用对应的URL将视频导入AVAsset容器中。

self.leftAsset = [AVAsset assetWithURL:url];

3、创建一个AVAsset的子类AVMutableComposition对象,并往里面加入我们所需要的音频轨道和视频轨道。作为我们剪辑后视频的存放容器。

self.composition = [AVMutableComposition composition];  //创建轨道容器
AVMutableCompositionTrack *videoTrack = [self.composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];       //创建配置视频轨道,并加入到轨道容器总
AVMutableCompositionTrack *audioTrack = [self.composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];       //创建音频轨道,并加入到轨道容器中

4、使用AVAssetTrack对象从对应的AVAsset媒体容器中,抽取对应的视频文件和音频文件。

AVAssetTrack *assetTrackVideo;
AVAssetTrack *assetTrackAudio; 
assetTrackVideo = [[self.leftAsset tracksWithMediaType:AVMediaTypeVideo] firstObject];  //从媒体容器中抽取得到视频信息
assetTrackAudio = [[self.leftAsset tracksWithMediaType:AVMediaTypeAudio] firstObject];  //从媒体容器中抽取得到音频信息

5、创建CMTime和CMTimeRange时间类型,剪辑操作抽取出来的AVAssetTrack对象。并加入到AVMutableComposition对象对应的轨道中。

//截取时间配置
CMTime leftTimeStart = CMTimeMake(leftST, 1);
CMTime leftTimeEnd   = CMTimeMake(leftET, 1);
CMTimeRange leftRangee = CMTimeRangeMake(leftTimeStart, leftTimeEnd); //用于截取视频,leftTimeStart代表截取的起点,leftTimeEnd表示持续时间

6、视频的拼接

self.leftAsset = [AVAsset assetWithURL:url];  //通过URL获取第二个媒体
CMTime cusorTime = kCMTimeZero;  //得到添加位置
cusorTime = CMTimeAdd(cusorTime, leftTimeEnd); //当拼接是得找到轨道尾部,轨道上最后一个文件的结尾,轨道上第一个视频是从0时开始的,持续时间为leftTimeEnd,所以我们第二个视频的起始时间就为这个
assetTrackVideo  = [[self.rightAsset tracksWithMediaType:AVMediaTypeVideo] firstObject];   //抽取第二个视频的视频信息
assetTrackAudio  = [[self.rightAsset tracksWithMediaType:AVMediaTypeAudio] firstObject];   //抽取第二个视频的音频信息
[videoTrack insertTimeRange:rightRange ofTrack:assetTrackVideo atTime:cusorTime error:nil];  //插入到轨道容器视频轨道对应的位置
[audioTrack insertTimeRange:rightRange ofTrack:assetTrackAudio atTime:cusorTime error:nil];  //插入到轨道容器音频轨道对应的为值

7、使用AVAssetExportSession对象将将剪辑好的媒体文件导出,再保存到系统相册中。

//初始化配置导出实例
    self.exprot = [AVAssetExportSession exportSessionWithAsset:[self.composition copy] presetName:AVAssetExportPresetHighestQuality];
    self.exprot.outputURL      = [self saveSynteticAdress];  //保存地址
    self.exprot.outputFileType = AVFileTypeMPEG4;            //格式
    
    [self.exprot exportAsynchronouslyWithCompletionHandler:^{   //导出完成后
        
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            
            AVAssetExportSessionStatus status = self.exprot.status;
            
            //将文件存入系统相册
            if (status == AVAssetExportSessionStatusCompleted) {
                
                [self writeExportedVideoToassetsLibrary];
            }else {
                
                UIAlertView *alerView = [[UIAlertView alloc]initWithTitle:@"出现错误" message:@"saveSynthetic方法" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
                [alerView show];
            }
        });
    }];
}

//获取沙盒路径存储到沙河中
- (NSURL *)saveSynteticAdress {
    
    NSString *filePath = nil;
    NSUInteger count = 0;
    do {
        
        filePath = NSTemporaryDirectory();
        NSString *numberString = count >0 ? [NSString stringWithFormat:@"-%li",(unsigned long) count ]: @" ";
        NSString *fileNameString = [NSString stringWithFormat:@"Masterpiece-%@.mov",numberString];
        filePath = [filePath stringByAppendingPathComponent:fileNameString];
        count++;
    }while ([[NSFileManager defaultManager] fileExistsAtPath:filePath]);
        
        return [NSURL fileURLWithPath:filePath];
    
}

//将合成写入照片库中
- (void)writeExportedVideoToassetsLibrary {
    
    NSURL *url = self.exprot.outputURL;
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc]init];
    if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:url]) {
        
        [library writeVideoAtPathToSavedPhotosAlbum:url completionBlock:^(NSURL *assetURL, NSError *error) {
            
            if (error) {
                
                UIAlertView *alerView = [[UIAlertView alloc]initWithTitle:@"出现错误" message:@"问题出在保存中" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
                [alerView show];
            }else {
                
                [[NSFileManager defaultManager] removeItemAtURL:url error:nil];
            
                [self alerViewShowMessage:@"已经保存到系统相册"];

            }
        }];
    }else {
        
        NSLog(@"保存失败");
    }
}

 

转载于:https://my.oschina.net/zhengjianhua/blog/694232

  • 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、付费专栏及课程。

余额充值